Переместить и повернуть камеру в направлении целевого игрового объекта - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть шесть разных пустых игровых объектов на сцене с 6 разными кнопками.Когда я нажимаю на кнопку 1, камера перемещается к игровому объекту 1 и поворачивается в соответствии с целевым игровым объектом, но когда камера перемещается к 3-му игровому объекту, моя камера начинает двигаться другим случайным образом наряду с другим случайным вращением, это вызванопоплавок t = 0.0f;в коде, например, когда я вызываю public void Wallview (), моя камера движется к объекту 3, но она начинает двигаться случайным образом со случайным вращением, пожалуйста, помогите мне спасибо

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

public class camMOVEtwo : 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 isStarted = 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 && !isStarted) {
            StartCoroutine (newnew ());
            isStarted = true;
        }
    }

    IEnumerator newnew () {
        float t = 0.0f;
        while (t < 2.0f) {
            t += Time.deltaTime;
            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;
            Debug.Log ("coroutine is running");
            yield return null;
        }
    }

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

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

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

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

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

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

Ответы [ 2 ]

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

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

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

public class LookAtObject : MonoBehaviour {

public float Speed = 0.001f;
private Transform _go;

// Update is called once per frame
void Update ()
{
    if (_go == null) return;

    Vector3 direction = _go.transform.position - transform.position;
    Quaternion toRotation = Quaternion.FromToRotation(transform.forward, direction);
    transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, Speed * Time.time);
}

public void AdjustOrientation(Transform go)
{
    _go = go;
}
}


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

public class OnClick : MonoBehaviour
{
private LookAtObject _lookAt;


public void Start()
{
    _lookAt = FindObjectOfType<LookAtObject>();
}

public void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, 100))
        {
            //optionally if(hit.collider.tag != "MyTag") return;
            _lookAt.AdjustOrientation(hit.transform);
        }
    }
}
}

Поместите эти классы на камеру, чтоСлучается, что это первый класс, который он берет в объекте, на который вы хотите посмотреть через AdjustOrientation.Обновление будет смотреть на этот объект после его заполнения.

Второй класс позволяет щелкнуть любой объект в сцене, который содержит твердое тело и является кинематическим.После того, как объект будет нажат, он установит AdjustOrientations, заставляя камеру смотреть на этот объект, вы можете легко добавить тег в ваш gameObject и указать, что если hit.collider.tag == "LookAt", то разрешить ему смотреть.

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

Большая часть ответа - это повторение.Все еще переписываем его полностью для контекста других читателей.

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

Для правильного вращения используйте Quaternion.RotateTowards(); внутри сопрограммы, как показано в коде ниже.

CameraMotion.cs

public Transform[] points;
public int currentPointIndex=0;
public Transform lookAtTarget;

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        StartCoroutine(CameraTransition(points[currentPointIndex],1.0f));
        currentPointIndex++;
    }
}

IEnumerator CameraTransition(Transform nextPoint,float time)
{
    float i = 0;
    float rate = 1 / time;

    Vector3 fromPos = transform.position;

    while (i<1)
    {
        i += Time.deltaTime * rate;
        transform.position = Vector3.Lerp(fromPos,nextPoint.position,i);


        Quaternion targetRotation = Quaternion.LookRotation(nextPoint.position-transform.position);
        transform.rotation = Quaternion.RotateTowards(transform.rotation,targetRotation,i);

        yield return 0;
    }
}}

По сути, мы зацикливаемся над точками массива и соответственно осуществляем переход.

В качестве альтернативы, если ваши точки не являютсяв линейной форме (в массиве) вы можете изменить логику соответственно.Но вы можете использовать ту же подпрограмму.

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