Как я могу вращать и перемещать объект в другую позицию и вращение? - PullRequest
1 голос
/ 31 января 2020

Первые несколько скриншотов.

Первый - это объект, к которому я хочу переместить и повернуть его вращение: Это цель: Вы можете видеть ее положение и вращение:

Target

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

Object to rotate and move to the target position and rotation

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

Этот скрипт прикреплен к объекту, который я хочу повернуть и переместить:

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

public class PlayAnimation : MonoBehaviour
{
    // The target marker.
    public Transform target;
    // Angular speed in radians per sec.
    public float speed = 1.0f;

    private Animator anim;
    private bool started = true;
    private float animationLenth;
    private bool ended = false;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    private void Update()
    {
        if (Whilefun.FPEKit.FPESaveLoadManager.gameStarted == true && started == true)
        {
            Whilefun.FPEKit.FPEInteractionManagerScript.Instance.BeginCutscene();
            anim.enabled = true;
            anim.Play("Stand Up", 0, 0);
            animationLenth = anim.GetCurrentAnimatorStateInfo(0).length;
            StartCoroutine(AnimationEnded());
            started = false;
        }

        if (ended == true)
        {
            // Determine which direction to rotate towards
            Vector3 targetDirection = transform.position - target.position;

            // The step size is equal to speed times frame time.
            float singleStep = speed * Time.deltaTime;

            // Rotate the forward vector towards the target direction by one step
            Vector3 newDirection = Vector3.RotateTowards(transform.forward, targetDirection, singleStep, 0.0f);

            // Calculate a rotation a step closer to the target and applies rotation to this object
            transform.rotation = Quaternion.LookRotation(newDirection);
        }
    }

    IEnumerator AnimationEnded()
    {
        yield return new WaitForSeconds(animationLenth);

        ended = true;
        Whilefun.FPEKit.FPEInteractionManagerScript.Instance.EndCutscene();
        anim.enabled = false;
        //transform.gameObject.SetActive(false);
    }
}

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

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

Но, в конце концов, теперь вращается только в конце, это так, а не как цель:

Not same as target rotation and not moving yet

Я использую RotateTowards и MoveTowards:

if (ended == true)
        {
            // The step size is equal to speed times frame time.
            var step = speed * Time.deltaTime;

            // Rotate our transform a step closer to the target's.
            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);
            transform.position = Vector3.MoveTowards(transform.position, target.position, step);
            headTransform.rotation = Quaternion.RotateTowards(headTransform.rotation, target.rotation, step);
        }

Работает нормально. Но это в Обновлении (Удалено Rigidbody, поэтому хорошо быть в Обновлении, а не в FixedUpdate). Как я могу заставить это работать внутри IEnumerator после WaitForSeconds, когда Coroutine закончил?

Вот как я делаю это сейчас внутри IEnumerator:

Проблема в том, что он никогда заканчивая в то время как он продолжает цикл внутри в то время как. Это не зависание редактора или чего-то еще, но это никогда не заканчивается sh пока l oop.

IEnumerator AnimationEnded()
    {
        yield return new WaitForSeconds(animationLenth);

        Vector3 currentPosition = transform.position;
        while (Vector3.Distance(currentPosition, target.position) > 0.1f)
        {
            var step = speed * Time.deltaTime;

            // Rotate our transform a step closer to the target's.
            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);
            transform.position = Vector3.MoveTowards(transform.position, target.position, step);
            headTransform.rotation = Quaternion.RotateTowards(headTransform.rotation, target.rotation, step);

            yield return null;
        }

        Whilefun.FPEKit.FPEInteractionManagerScript.Instance.EndCutscene();
        anim.enabled = false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...