Камера постоянно трясется после обновления своего положения - PullRequest
0 голосов
/ 28 ноября 2018

Пожалуйста, посмотрите это видео и сообщите мне исправление.Спасибо.

Логический флаг должен стать ложным, когда моя камера достигнет своего конечного положения.В настоящее время флаг становится истинным и остается истинным.Мне нужно найти способ, когда моя камера перемещается к своему первому месту назначения, флаг становится ложным и т. Д.

Вот код:

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

public class camMOVE : MonoBehaviour {
    public Transform  handleview;
    public Transform pressureview;
    public Transform wallview;
    public Transform sechandleview;
    public Transform pressuretwoview;
    public Transform switchview;

    public GameObject handlebtn;
    public GameObject pressurebtn;
    public GameObject wallbtn;
    public GameObject handletwobtn;
    public GameObject pressuretwobtn;
    public GameObject switchbtn;

    public float transitionSPEED;
    Transform currentVIEW;
    public bool flag = false;
    public bool isReached = false;
    Vector3 currentangel;
    public List<GameObject> modelparts;

    private void Start(){
        handlebtn.SetActive (true);
        pressurebtn.SetActive (false);
        wallbtn.SetActive (false);
        handletwobtn.SetActive (false);
        pressuretwobtn.SetActive (false);
        switchbtn.SetActive (false);

        foreach (GameObject obj in modelparts) {

            obj.GetComponent<BoxCollider> ().enabled = false;
        }
    }

    private void Update(){
        if (flag ) {
            transform.position = Vector3.Lerp (transform.position, 
    currentVIEW.position, Time.deltaTime * transitionSPEED);


            //for camera rotation
            currentangel = new Vector3 (Mathf.LerpAngle 
    (transform.rotation.eulerAngles.x, 
    currentVIEW.transform.rotation.eulerAngles.x, Time.deltaTime * 
    transitionSPEED),
                Mathf.LerpAngle (transform.rotation.eulerAngles.y, 
    currentVIEW.transform.rotation.eulerAngles.y, Time.deltaTime * 
    transitionSPEED),
                Mathf.LerpAngle (transform.rotation.eulerAngles.z, 
    currentVIEW.transform.rotation.eulerAngles.z, Time.deltaTime * 
    transitionSPEED));

            transform.eulerAngles = currentangel;
        }
    }

    public void Handleview(){
        currentVIEW = handleview;
        handlebtn.SetActive (false);
        flag = true;
    }

    public void Pressureview() {
        currentVIEW = pressureview;
        pressurebtn.SetActive (false);
        flag = true;
    }

    public void Wallview() {
        currentVIEW = wallview;
        wallbtn.SetActive (false);
        flag = true;
    }

    public void Secondhandleview(){
        currentVIEW = sechandleview;
        handletwobtn.SetActive (false);
        flag = true;
    }

    public void Pressuretwoview(){
        currentVIEW = pressuretwoview;
        pressuretwobtn.SetActive (false);
        flag = true;
    }

    public void Switchview(){
        currentVIEW = switchview;
        switchbtn.SetActive (false);
        flag = true;

    }
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

В принципе, я согласен с приведенным выше ответом Фатти.Вы можете просто использовать Coroutine, как показано ниже

IEnumerator PerformCameraMovement(Transform transformToMove,Vector3 fromPos,Vector3 toPos,float time)
    {
        float i = 0;
        float rate = 1 / time;
        while (i<1)
        {
            i += Time.deltaTime * rate;
            transformToMove.position = Vector3.Lerp(fromPos,toPos,i);
            yield return 0;
        }
    }

здесь, в вашем случае, transformToMove - это преобразование вашей камеры, fromPos - это положение, откуда камера должна начать переход, toPosэто место, куда должна достигнуть камера, и, наконец, time это количество времени, необходимое для перевода камеры fromPos в toPos

Сопрограммы работают как поток.

Просто вызовите этот сопрограмм, используя StartCoroutine(PerformCameraMovement(cameraTransform,cameraTransform.position,Vector3.zero,2.0f));

и разместив его там, где требуется.

Теперь в приведенном выше случае камера переместится из своего исходного положения в Vector3.ноль (начало координат) ровно через 2 секунды.

Я бы посоветовал избегать использования обновления для перехода.Это просто не сработает.

Если вам нужно более глубокое понимание сопрограмм, просто просмотрите этот блог ниже http://www.theappguruz.com/blog/how-to-use-coroutines-in-unity

0 голосов
/ 28 ноября 2018
  1. вы не устанавливаете его на false в любом месте

  2. вы действительно не делаете этого в обновлении - вам придется просто ознакомиться с использованием сопрограммы

Тогда это очень просто.

Базовая форма

В вашем коде..

StartCoroutine(MoveCamera());

, а затем

private IEnumerator MoveCamera() {

  while ( not at the new position ) {

    move the object a little
    yield return null;
  }
  set object to final exact position
}

Вы найдете 1000 примеров в Интернете!Как правило, никогда не используйте Update в Unity.


На практике просто используйте Tweeng ...

Как только вы освоитесь с этим.Вы можете просто использовать Tweeng.

Tweeng:

https://stackoverflow.com/a/37228628/294884

в вашем примере, вы просто скажете

StartCoroutine( 3f.Tweeng(
     (p)=>transform.position=p,
     fromPosition,
     toPosition) );

Это будет сделаночерез 3 секунды (т. е. 3f);

Наслаждайтесь

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