Unity3D - 根据移动更改动画状态

时间:2016-10-15 11:49:03

标签: c# animation unity3d

我正在尝试制作一个简单的AI(一个简单的椭圆),它可以在步行动画和常备动画之间切换,具体取决于它是否在移动。

我已经设置了AI设置并转向播放器,但是我无法找到如何在动画状态之间切换。

我在动画师中有一个布尔参数,“ isWalking ”,如果true设置为切换到步行动画,并切换到常设动画false

我的问题是如何'检查物体是否在移动'。 我本质上想要编写一些类似这样的代码:

If(object is moving) 
{
    isWalking == true;
}
else 
{
    isWalking == false;
}

我在网上搜索过,但我还没有找到解决方案。 我考虑使用rigidbody.IsSleeping()来查看对象是否处于睡眠状态,但我找不到任何如何使用它的示例。

我是Unity和编程的完全新手。

提前致谢。 :)

enter image description here

The object, as shown in the inspector window

编辑: 我试过这段代码,但可能有些问题。 :/

using UnityEngine;
using System.Collections;

public class aiscript : MonoBehaviour {

    NavMeshAgent agent;
    public Transform target;
    public Animator anim;
    Vector3 pos;
    public GameObject monmon;

    void Start () 
    {
        pos = monmon.transform.position;
        anim = GetComponent<Animator> ();
        agent = GetComponent<NavMeshAgent> ();
    }


    void Update () 
    {   
        pos = monmon.transform.position;
        Vector3 originalPosition = pos;
        agent.SetDestination(target.position);
        Vector3 difference = originalPosition - pos;
        anim.SetBool("isWalking", difference.magnitude > 0.5f);
    }

}

2 个答案:

答案 0 :(得分:0)

Animator类,您可以使用GetBool函数执行此操作,并使用SetBool函数设置更改动画状态。

Animator myAnim;

.....

myAnim = GameObject.Find("ObjectAnimatorIsAttachedTo").GetComponent<Animator>();

.....

if (myAnim.GetBool("isWalking") == true)
{
    //Is walking.....
}
else
{
    //Is not walking
}

您甚至可以稍后使用

更改isWalking的状态
myAnim.SetBool("isWalking", false);
myAnim.SetBool("isWalking", true);

答案 1 :(得分:0)

我认为你的物体上有一个附着在它上面的刚体,以及动画师。

如果是这样,您只需检查刚体中的速度矢量,并将其大小检查到特定阈值。

假设您的阈值为0.5f,这意味着,如果物体以任何方向移动超过0.5单位/秒,则认为它正在运行,否则,它就会存在。

Animator myAnimator;
Rigidbody myRigidbody;

void Awake() {
    this.myAnimator = GetComponent<Animator>();
    this.myRigidbody = GetComponent<Rigidbody>();
}

void Update() {
    myAnimator.SetBool("isWalking", myRigidbody.velocity.magnitude > 0.5f);
}

修改

要优化它,您可以保存动画师布尔参数的哈希值

int isWalkingAnimationId = Animator.StringToHash("isWalking");

然后使用它而不是字符串。

myAnimator.SetBool(isWalkingAnimationId , myRigidbody.velocity.magnitude > 0.5f);

<强>更新

看来你的Rigidbody是运动学的,速度总是(0,0,0)。 我猜你是手动更改transform.position来移动对象。如果是这样的话:

Vector3 originalPosition = transform.position;
// Your manual changes on transform.position
Vector3 difference = originalPosition - transform.position;
myAnimator.SetBool("isWalking", difference.magnitude > 0.5f);