- Home /
When character stops moving - stop "Walk" animation
I have some major issues with making a script that will trigger my character "walk" animation when moving, and switch to idle as soon as he stops. I'm using point & click kind of movement script, so it's not about buttons being pressed.
My movement script
using UnityEngine;
using System.Collections;
public class movement : MonoBehaviour {
public RaycastHit hit;
public Ray ray;
public Vector3 direction;
public float moveSpeed = 0.1f;
public int rotateSpeed =50;
public Transform PlayerTransform;
public float curSpeed;
// Use this for initialization
void Start ()
{
PlayerTransform = transform;
direction = PlayerTransform.position;
}
// Update is called once per frame
void Update ()
{
if(Input.GetMouseButton(0))
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast (ray, out hit, 100))
{
Debug.DrawLine (ray.origin, hit.point, Color.red, 2);
Debug.Log ("Raycasted");
direction = hit.point;
Vector3 targetPoint = hit.point;
Quaternion targetRotation = Quaternion.LookRotation(targetPoint - PlayerTransform.position);
transform.rotation = Quaternion.Slerp(PlayerTransform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
transform.rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0);
}
}
PlayerTransform.position = Vector3.MoveTowards(PlayerTransform.position, direction, moveSpeed * Time.deltaTime);
Debug.DrawLine(PlayerTransform.position, hit.point, Color.blue, 2);
}
}
Answer by Professor Snake · Feb 18, 2013 at 08:11 PM
Add a new variable:
boolean isMoving=false;
Inside the if(Physics.Raycast (ray, out hit, 100)), add
isMoving=true;
And then, right below PlayerTransform.position = Vector3.MoveTowards(PlayerTransform.position, direction, moveSpeed * Time.deltaTime); :
if(transform.position==targetPoint)
isMoving=false;
if(isMoving){ //if the character is moving
animation.CrossFade("walk");
}
else{
animation.CrossFade("idle");
}
Finally, you should initialise the targetposition and targetrotation variables publicly, outside of the Update function. And if you want to be absolutely safe, you could also initialise a new variable
float minDistance=0.01;
and replace
if(transform.position==targetPoint)
with
if(Vector3.Distance(transform.position,targetPoint)< minDistance )
An even more accurate solution would be to attach a kinematic rigidbody to your character and determine the animation played via its velocity:
if(rigidbody.velocity>0.01)
animation.crossFade("walk");
else
animation.crossFade("idle");
It's also if(Vector3.Distance(transform.position,targetPoint)< $$anonymous$$Distance ) but it does not show up right. EDIT: Okay, now it does.
Your answer
![](https://koobas.hobune.stream/wayback/20220613092920im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Can we using script to moving the muscles in unity. 2 Answers
Problem with additive animations 0 Answers
Continuing movement after animaton on GetButtonUp 0 Answers
How to get jump animation to play? 0 Answers
how to declare a animation var 3 Answers