Анимация прерывается, но я хочу, чтобы анимация закончилась - PullRequest
0 голосов
/ 31 января 2019

Я новичок в кодировании, я играю с единицей, и я столкнулся с проблемой.

Моя проблема в том, что если я перемещу плеер и активирую функцию SkillAttack1,анимация будет отменена и не будет завершена.Прямо сейчас, как вы видите в коде ниже if I activate the SkillAttack1`, он работает, но все равно не завершит анимацию.Также, если я нажимаю кнопку «w», например, на 15 секунд, игрок застревает и движется вперед.Единственный способ воспроизвести полную анимацию - это не двигаться, но это неправильно.

[Animator1][1]
[Animator2][2]
[Animator3][3]

[1]: https://i.stack.imgur.com/BeziY.png
[2]: https://i.stack.imgur.com/310vz.png
[3]: https://i.stack.imgur.com/tOVVu.png






using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{   

public float velocity = 5;
public float turnSpeed = 10;
Vector2 input;
float angle;
Quaternion targetRotation;
public Transform cam;
public Animator anim;
public bool IsAttacking = false;


void Start()
{
    anim = GetComponent<Animator>();
}

void Update()
{
    if(Mathf.Abs(input.x) < 0.5 && Mathf.Abs(input.y) < 0.5) return;
    CalculateDirection();
    Rotate();
    Move(); 
}

void FixedUpdate()
{
    if(IsAttacking == false)
    {
        GetInput();
    }
    SkillAttack1();
    SkillAttack2();
}

/// Input based on Horizontal(a,d) and Vertical (w,s) keys
void GetInput()
{
        input.x = Input.GetAxis("Horizontal");
        input.y = Input.GetAxis("Vertical");
        anim.SetFloat("VelX", input.x);
        anim.SetFloat("VelY", input.y);
}


/// Direction relative to the camera rotation
void CalculateDirection()
{
    angle = Mathf.Atan2(input.x, input.y);
    angle = Mathf.Rad2Deg * angle;
    angle += cam.eulerAngles.y; 
}

/// Rotate toward the calculated angle
void Rotate()
{
    targetRotation = Quaternion.Euler(0, angle, 0);
    transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, turnSpeed 
* Time.deltaTime);
}

/// This player only move along its own forward axis
void Move()
{
    transform.position += transform.forward * velocity * Time.deltaTime;
}

public void SkillAttack1(){
    if(Input.GetKeyDown("1"))
    { 
        IsAttacking = true;
        StartCoroutine(OnSkillAttack1());
    }
}

public void SkillAttack2()
{
    if(Input.GetKeyDown("2"))
    { 
        anim.SetTrigger("SkillAttack2");
    }
}


public IEnumerator OnSkillAttack1()
{
    anim.SetTrigger("SkillAttack1");
    yield return null;

    yield return new WaitForSeconds(15.0f);
    IsAttacking = false;
}
}

1 Ответ

0 голосов
/ 31 января 2019

Похоже, что ваш контроллер анимации переопределяется вашим кодом движения, когда ваш игрок посылает какие-то входные данные для перехода влево или вправо, он устанавливает переменные VelX и VelY на вашем контроллере анимации.Без доступа к вашему контроллеру я не могу точно сказать, почему он прерывает атаку, но, скорее всего, у вас есть настроенное прерывание, которое запускается из «любого состояния», когда одна из этих переменных выше 0 и переходит в анимацию «ходьбы»ваш контроллер имеет.

Вам необходимо настроить переходы анимации для обработки этого потенциального случая или, в качестве альтернативы, предотвратить запуск кода движения во время анимации атаки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...