- Home /
A way to "freeze" the position of the animation?
Hello there, (sorry for the long post)
right now, I'm trying to apply a walk animation to my 3rd person character. It all worked well with the animator and with the transitions and stuff. But the problem is, I've applied an animation, which is automatically moving my player forward, so the walk animation changes the position of the player while additionally I've made a script, that controls the player that is also moving him forward. When I then move my player forward, the animation is played, but after a few seconds, he spawns at a place right behind his actual former position and again walks forward. And that is happening all the time.
Now what I'm trying to find out, is a technique or something I can do, that "freezes" the position of the animation, so that only my movement script will make him move forward but still the walk animation is played. Is there anything I can do to edit my animation in that way? The only thing I can imagine instead is to create a new animation, where the player stays on one point.
I hope someone can help me :)
BTW this is my movement script:
var speed : float = 6f; // The speed that the player will move at.
private var movement : Vector3; // The vector to store the direction of the player's movement.
private var anim : Animator; // Reference to the animator component.
private var playerRigidbody : Rigidbody; // Reference to the player's rigidbody.
private var floorMask : int; // A layer mask so that a ray can be cast just at gameobjects on the floor layer.
private var camRayLength : float = 100f; // The length of the ray from the camera into the scene.
function Awake ()
{
// Create a layer mask for the floor layer.
floorMask = LayerMask.GetMask ("Floor");
// Set up references.
anim = GetComponent (Animator);
playerRigidbody = GetComponent (Rigidbody);
}
function FixedUpdate ()
{
// Store the input axes.
var h : float = Input.GetAxisRaw ("Horizontal");
var v : float = Input.GetAxisRaw ("Vertical");
// Move the player around the scene.
Move (h, v);
// Turn the player to face the mouse cursor.
Turning ();
// Animate the player.
Animating (h, v);
}
function Move (h : float, v : float)
{
// Set the movement vector based on the axis input.
movement.Set (h, 0f, v);
// Normalise the movement vector and make it proportional to the speed per second.
movement = movement.normalized * speed * Time.deltaTime;
// Move the player to it's current position plus the movement.
playerRigidbody.MovePosition (transform.position + movement);
}
function Turning ()
{
// Create a ray from the mouse cursor on screen in the direction of the camera.
var camRay : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
// Create a RaycastHit variable to store information about what was hit by the ray.
var floorHit : RaycastHit;
// Perform the raycast and if it hits something on the floor layer...
if(Physics.Raycast (camRay, floorHit, camRayLength, floorMask))
{
// Create a vector from the player to the point on the floor the raycast from the mouse hit.
var playerToMouse : Vector3 = floorHit.point - transform.position;
// Ensure the vector is entirely along the floor plane.
playerToMouse.y = 0f;
// Create a quaternion (rotation) based on looking down the vector from the player to the mouse.
var newRotation : Quaternion = Quaternion.LookRotation (playerToMouse);
// Set the player's rotation to this new rotation.
playerRigidbody.MoveRotation (newRotation);
}
}
function Animating (h : float, v : float)
{
// Create a boolean that is true if either of the input axes is non-zero.
var walking : boolean = h != 0f || v != 0f;
// Tell the animator whether or not the player is walking.
anim.SetBool ("IsWalking", walking);
}
Try baking x/z in the animation import tab of the model.
Click on Transition Arrow and turn off "Has Exit Time" ?
Answer by shay4545 · Aug 02, 2015 at 10:33 PM
Don't know if this will work for you, but I had the same problem recently. What I did was click on the player, then open up the Animation tab. Select the animation you want and then on the left there should be some things that say Player : Position or Player : Rotation. Click on the Player : Position and delete it. Hopefully that works for you