Как я могу остановить вращение персонажей, когда они достигнут 0 на y? - PullRequest
0 голосов
/ 21 декабря 2018
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimatorController : MonoBehaviour
{
    public Animator[] animators;
    public Transform target;
    public float speed = 1f;
    public float rotationSpeed;

    private bool endRot = false;

    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < animators.Length; i++)
        {
            animators[i].SetFloat("Walking Speed", speed);
        }
    }

    // Update is called once per frame
    void Update()
    {
        float distanceFromTarget = Vector3.Distance(animators[2].transform.position, target.position);
        if (distanceFromTarget < 15)
        {
            float speed = (distanceFromTarget / 15) / 1;
            for (int i = 0; i < animators.Length; i++)
            {
                animators[i].SetFloat("Walking Speed", speed);
            }
        }

        if (distanceFromTarget < 2f)
        {
            for (int i = 0; i < animators.Length; i++)
            {
                animators[i].SetFloat("Walking Speed", 0);
            }

            if (animators[0].transform.localRotation.y != 0 && endRot == false)
            {
                animators[0].transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
                animators[1].transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);
            }

            if (animators[0].transform.localRotation.y == 0)
                endRot = true;
        }
    }
}

Оба символа начинаются с localRotation углов Эйлера (0f, 180f, 0f).Я хочу, чтобы они повернулись к 0 на Y и затем остановились.Пробовал использовать флаг, но я думаю, что сравнивать поплавки неправильно.Должен ли я использовать StartCoroutine для этого?

Я пытался сделать анимационный клип, используя временную шкалу, но как только я создаю новую анимационную дорожку и перетаскиваю одного из персонажей по какой-то причине, он меняет положение персонажа и его оружие.не привязан к нему.Не уверен, почему это происходит с временной шкалой.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

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

Установить поворот цели:

Quaternion goalRotation = Quaternion.Euler(0f,0f,0f); // or Quaternion.identity

Найти, насколько далеко вращение первого преобразования от градусов:

float angleToGoal = Quaternion.Angle(goalRotation, animators[0].transform.localRotation);

Определите, что меньше: угол, заданный скоростью * delta time или оставшимся углом, чтобы определить, как далеко вы должны повернуть этот кадр. Это важная зажимная часть :

float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);

Затем поверните на эту величину.А если вы повернули на angleToGoal, то установите endRot = true;.

Это может выглядеть так:

if (distanceFromTarget < 2f)
{
    for (int i = 0; i < animators.Length; i++)
    {
        animators[i].SetFloat("Walking Speed", 0);
    }

    if (!endRot)
    {
        Quaternion goalRotation = Quaternion.Euler(0f,0f,0f);
        float angleToGoal = Quaternion.Angle(
                goalRotation,
                animators[0].transform.localRotation);         
        float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);   

        // use axis of Vector3.down to keep angles positive for ease of use
        animators[0].transform.Rotate(Vector3.down, angleThisFrame);
        animators[1].transform.Rotate(Vector3.up, angleThisFrame);

        // We end if we rotated the remaining amount.
        endRot = (angleThisFrame == angleToGoal);
    }
}
0 голосов
/ 21 декабря 2018

Нет ничего плохого в сравнении чисел с плавающей запятой, вы просто должны знать о точности - по существу невозможно остановиться точно на 0. Но то, что вы можете сделать, это остановить, когда он очень близко, а затем верный после.Например:

if (animators[0].transform.localRotation.y >= 0.1f && endRot == false)

, а затем:

if (animators[0].transform.localRotation.y <= 0.1f)
{
    endRot = true;
    // set y to zero, keep x and z rotation the same.
    animators[0].transform.localRotation = Quaternion.Euler(animators[0].transform.localEulerAngles.x, 0, animators[0].transform.localEulerAngles.z);
}

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

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