Почему объект продолжает двигаться без остановок и как быстро перемещать его вперед, когда он закончил двигаться вверх? - PullRequest
0 голосов
/ 09 марта 2020

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

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

public class RoboSphereWindowBreakInteraction : MonoBehaviour
{
    public Transform target;
    public AudioClip audioClip;
    public float speed;

    private bool hasStarted = false;
    private Animator anim;

    void Update()
    {
        if ((Input.GetKeyDown(KeyCode.B) || (hasStarted == true)))
        {
            float step = speed * Time.deltaTime; // calculate distance to move
            transform.position = Vector3.MoveTowards(transform.position, target.position, step);

            hasStarted = true;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "Square 1")
        {
            GetComponent<Rigidbody>().isKinematic = false;
            hasStarted = false;
            Destroy(GameObject.Find("Wall_Window_Long_03"));
        }
    }

    public void ActivateRoboSphere()
    {
        foreach(Transform child in transform)
        {
            if(child.name == "Camera")
            {
                RepositionCamera(child);
            }
        }

        anim = GetComponent<Animator>();
        anim.enabled = true;

        GetComponent<FPEInteractableActivateScript>().interactionString = "";
        FPEInteractionManagerScript.Instance.BeginCutscene();

        StartCoroutine(PlayAudio());
    }

    private void RepositionCamera(Transform camera)
    {
        var Eyes = GameObject.Find("eyeDome");

        camera.position = Eyes.transform.position + Eyes.transform.forward;
        camera.LookAt(Eyes.transform);
        camera.GetComponent<Camera>().enabled = true;
    }

    IEnumerator PlayAudio()
    {
        AudioSource audio = GetComponent<AudioSource>();

        audio.clip = audioClip;
        audio.Play();
        yield return new WaitForSeconds(audio.clip.length);

        var rotation = Quaternion.LookRotation(target.position - transform.position);


        StartCoroutine(Spin(3f, rotation, () =>
        {
            anim.SetBool("Roll_Anim", true);
        }));

        StartCoroutine(MoveFromTo(transform, transform.position, new Vector3(transform.position.x,
            transform.position.y + 51.255f, transform.position.z), 3f));
    }

    IEnumerator Spin(float lerpTime, Quaternion rotation, Action whenDone)
    {
        float elapsedTime = 0f;

        while (elapsedTime <= lerpTime)
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, rotation, elapsedTime / lerpTime);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        whenDone?.Invoke();
    }

    // 51.255

    IEnumerator MoveFromTo(Transform objectToMove, Vector3 a, Vector3 b, float speed)
    {
        float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime;
        float t = 0;
        while (t <= 1.0f)
        {
            t += step; // Goes from 0 to 1, incrementing by step each time
            objectToMove.position = Vector3.Lerp(a, b, t); // Move objectToMove closer to b
            yield return new WaitForFixedUpdate();         // Leave the routine and return here in the next frame
        }
        objectToMove.position = b;
    }
}

Я сделал:

StartCoroutine(MoveFromTo(transform, transform.position, new Vector3(transform.position.x,
                transform.position.y + 51.255f, transform.position.z), 3f));

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

1 Ответ

0 голосов
/ 10 марта 2020

В вашем коде замените эту часть:

StartCoroutine(MoveFromTo(transform, transform.position, new Vector3(transform.position.x,
                transform.position.y + 51.255f, transform.position.z), 3f));

на эту:

StartCoroutine(MoveFromTo(transform, transform.position, new Vector3(transform.position.x,
                51.255f, transform.position.z), 3f));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...