Итак, вот что я хотел бы сделать: игрок простаивает на земле, а не двигается вообще. И через некоторое время следует сыграть случайную анимацию бездействия. Как определить, что игрок не двигался в течение определенного времени?
IEnumerator Idle()
{
// check if player is idling on the ground
if (grounded && (_controller.velocity.x == 0))
{
// Now what?
//...
}
idleIndex = IdleRandom();
_animator.SetInteger("IdleIndex", idleIndex);
_animator.SetTrigger("Idle");
}
int IdleRandom()
{
// choose random index of idle animations
int i = Random.Range(0, numberOfIdleAnims);
// if it the same as the previous one...
if (i == idleIndex) {
// try another one
return IdleRandom ();
}
else
return i;
}
Я уже настроил свой контроллер аниматора так, чтобы он играл одну из бездействующих анимаций (выбранных idleIndex), если простаивает триггер. Единственное, что я не могу понять, - это вещь не в движении!
Вам нужно посчитать время, в течение которого ваш игрок простаивал, а не двигался. Вы можете сделать это в функции void FixedUpdate()
.
Я резко изменил свой код. Убедитесь, что вы включили код для воспроизведения анимаций.
public class IdleManager : MonoBehaviour
{
private isIdle = false;
private float previousTime;
private const float IDLE_TIME = 5.0f;
void Update()
{
if(!isIdle && grounded && (_controller.velocity.x == 0))
{
isIdle = true;
previousTime = Time.timeSinceLevelLoad();
}
else if(isIdle && Time.timeSinceLevelLoad - previousTime > IDLE_TIME)
{
// Play animation here.
// Reset previousTime.
previousTime = Time.timeSinceLevelLoad;
}
else if(grounded || _controller.velocity.x > 0)
isIdle = false;
}
}
Idle()
. Вот почему я хочу, чтобы он отправил этот звонок.