Беда с зависанием поворота на определенной анимации в Unity - PullRequest
0 голосов
/ 11 апреля 2019

Я работал над некоторыми вражескими анимациями для боевой игры в Unity и ищу способ заморозить его вращение и движение, когда он входит в определенное состояние.

У врага в аниматоре есть логическая переменная isAttacking. isAttacking включен кодом и заставляет его размахивать топором.

Проблема в том, что AI, который я закодировал (с тяжелой помощью из учебника), заставляет его вращаться, если игрок находится рядом. Я не хочу, чтобы он вращался во время анимации атаки.

            this.transform.rotation = 
Quaternion.Slerp(this.transform.rotation,
                                      Quaternion.LookRotation(direction), 
0.1f);

Это кусок кода, который заставляет его вращаться. Этот код активируется, если игрок находится в пределах 10 единиц от него.

Я пробовал некоторые методы, как это:

if (Anim.GetBool("isAttacking") == true) {
            this.transform.rotation = 
Quaternion.Slerp(this.transform.rotation,
                                      Quaternion.LookRotation(direction), 
0.1f);
}

Я также пытался настроить жесткое тело на некоторое время, чтобы отключить вращение

if (Anim.GetBool("isAttacking") == true) {
Rigid.freezeRotation = true;
}
else {
Rigid.freezeRotation = false;
}

Ничего из этого не помогло мне.

Я не преследовал замораживание его движения.

Это код, который запускает AI

private void Update()
{

    if (Vector3.Distance(player.position, this.transform.position) < 10)
    {
        Vector3 direction = player.position - this.transform.position;
        direction.y = 0;

        this.transform.rotation = Quaternion.Slerp(this.transform.rotation,
                                  Quaternion.LookRotation(direction), 0.1f);

        Anim.SetBool("isIdle", false);
        if (direction.magnitude > 1)
        {
                this.transform.Translate(0, 0, 0.07f);
                Anim.SetBool("isWalking", true);
                Anim.SetBool("isAttacking", false);                
        }

        else
        {
            Anim.SetBool("isAttacking", true);
            Anim.SetBool("isWalking", false);
        }
    }

    else
    {
        Anim.SetBool("isIdle", true);
        Anim.SetBool("isWalking", false);
        Anim.SetBool("isAttacking", false);
    }

}

Как мне предотвратить вращение и движение во время его состояния атаки?

1 Ответ

0 голосов
/ 11 апреля 2019

Самый простой способ сделать что-то подобное, возможно, с Coroutine:

IEnumerator StopMovement(float duration){
    this.enabled = false;
    yield return new WaitForSeconds(duration);
    this.enabled = true;
}

StopMovement просто отключает пустоту Update на несколько секунд и затем снова включает ее.Звоните, когда атакуете:

StartCoroutine(StopMovement(1.5f)); //disable Update for 1.5 seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...