как обновить только один раз в единстве

голоса
-1

Привет у меня есть код, который перемещает свою основную камеру к другой игре объекты позиции, когда я нажимаю кнопку, как если я нажимаю кнопку 1 будет двигаться в направлении объекта 1 позиция же для кнопки 2 и 3. Теперь в моем коде я быть_наст логическое значение имени как флаг что верно в функции обновления, то у меня есть несколько общедоступных функций для нескольких кнопок теперь, когда я нажать любую кнопку булево становится истинным и остается верным, которая заставляет камеру дрожать, потому что булево будет непрерывно обновлять, пожалуйста, сообщите мне так, что, когда моя камера достигает его окончательное положение флаг логическое значение, становится ложным, и когда снова я нажать другую кнопку я будет верно снова вот мой код

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 GameObject parentobj;
Animator anim;



public float transitionSPEED;
Transform currentVIEW;
private bool flag = 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);

    anim = parentobj.GetComponent<Animator> ();
    anim.SetBool (start, true);


    //currentVIEW = handleview;
    foreach (GameObject obj in modelparts) {

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

private void Update(){


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


        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;




}

}

Задан 27/11/2018 в 15:03
источник пользователем
На других языках...                            


2 ответов

голоса
0

Хорошо, так что некоторые из проблем , я вижу , это вы используете лерп неправильно, лерп является линейной интерполяции точки а и Ь в этом отношении. Цель этого получает поражение , если вы постоянно меняя местоположение точки А . Вы должны либо хранить отправную точку при перемещении и лерп между начальной и конечной точкой. или б использование MoveTowards.

Вот пример MoveTowards и использованием Mathf.Approximately:

 if (flag == true) {
        // This will move you right to the location you want.
        transform.position = Vector3.MoveTowards (transform.position, currentVIEW.position,  Time.deltaTime * transitionSPEED);  

       if(Mathf.Approximately(Vector3.Distance(transform.position, currentVIEW.position), 0f))
       {
           flag = false;
       }
    } // This is the end bracket for the if statement.

Постоянно меняя исходное Lerp начальное положение может дать неверные результаты, и тайминги.

Ответил 27/11/2018 в 15:50
источник пользователем

голоса
0
if (flag == true)
{
    transform.position = Vector3.Lerp (transform.position, currentVIEW.position, Time.deltaTime * transitionSPEED);
    if(Mathf.Approximately((transform.position-currentVIEW.position).sqrmagnitude, 0f))
    {
        transform.position = currentVIEW.position;
        transform.rotation = currentVIEW.rotation;
        flag = false;
        return;
    }
....
Ответил 27/11/2018 в 15:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more