我正在尝试制作一个简单的AI(一个简单的椭圆),它可以在步行动画和常备动画之间切换,具体取决于它是否在移动。
我已经设置了AI设置并转向播放器,但是我无法找到如何在动画状态之间切换。
我在动画师中有一个布尔参数,“ isWalking
”,如果true
设置为切换到步行动画,并切换到常设动画false
。
我的问题是如何'检查物体是否在移动'。 我本质上想要编写一些类似这样的代码:
If(object is moving)
{
isWalking == true;
}
else
{
isWalking == false;
}
我在网上搜索过,但我还没有找到解决方案。
我考虑使用rigidbody.IsSleeping()
来查看对象是否处于睡眠状态,但我找不到任何如何使用它的示例。
我是Unity和编程的完全新手。
提前致谢。 :)
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);
}
}
答案 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);