Как я могу переместить основную камеру в новое положение?

#c# #unity3d

#c# #unity3d

Вопрос:

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

public class PlayingInGameScenesController : MonoBehaviour
{
    public LockController lockController;
    public Vector3 targetPosition;
    public GameObject uiTextsImage;
    public float cameraMoveSpeed;

    private bool newGame = true;
    private bool playingScene = true;

    public void PlayingSceneInGame()
    {
        PlayingSceneStatesControls(true);
        StartCoroutine(ScenePlayingTime());
    }

    private void Update()
    {
        if (SceneManager.GetActiveScene().name != "Main Menu" amp;amp; newGame == true)
        {
            PlayingSceneInGame();
            newGame = false;
        }

        if(playingScene == false)
        {
            // X 40.73769 to -6     Y 1.1 to 1     Z -4.641718 to 43.4
            Vector3 camPos = Camera.main.transform.position;
            Vector3 newPos = new Vector3(camPos.x)
            Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, targetPosition, cameraMoveSpeed * Time.deltaTime);
        }
    }

    private void PlayingSceneStatesControls(bool LockState)
    {
        lockController.LockControl(LockState);

        if (LockState == true)
        {
            // change state of free look camera height and view distance.
            // change the cameras states enable true/false.
            // change the ui texts for description text and scene text enable true/false.

            uiTextsImage.SetActive(true);

        }
        else
        {
            uiTextsImage.SetActive(false);
            playingScene = false;
        }
    }

    IEnumerator ScenePlayingTime()
    {
        yield return new WaitForSeconds(10);

        PlayingSceneStatesControls(false);
    }
}
  

В обновлении :

 if(playingScene == false)
        {
            // X 40.73769 to -6     Y 1.1 to 1     Z -4.641718 to 43.4
            Vector3 camPos = Camera.main.transform.position;
            Vector3 newPos = new Vector3(camPos.x)
            Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, targetPosition, cameraMoveSpeed * Time.deltaTime);
        }
  

Сначала я должен переместить две переменные camPos и newPos в начало?
Во-вторых, значения X Y Z: левые значения — это то, где камера находится в данный момент, а правые значения, куда следует медленно перемещаться, чтобы сгладить. Из текущего положения на X текущее положение равно 40,73769 до -6 то же самое для Y и Z Я просто записал эти значения, чтобы запомнить, но идея состоит в том, чтобы плавно перемещать камеру из текущего положения в новое положение: X -6 Y 1 и Z до 43,4

Должен ли я сделать это в обновлении или в позднем или исправленном обновлении?

Это исходное положение основной камеры :

Исходное положение основной камеры

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

Позиция, которая должна быть целью основной камеры

Что я пробовал :

В начале :

 private void Start()
    {
        Vector3 camPos = Camera.main.transform.position;
        newPos = new Vector3(camPos.x - 46.73769f, camPos.y - 0.1f, camPos.z   48.041718f);
    }
  

Затем в обновлении :

 if(playingScene == false)
        {
            // X 40.73769 - 46.73769     Y 1.1 - 0.1     Z -4.641718   48.041718
            Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, newPos, cameraMoveSpeed * Time.deltaTime);
        }
  

Затем я изменил значения в начальном переключении Z и X :

 private void Start()
    {
        Vector3 camPos = Camera.main.transform.position;
        newPos = new Vector3(camPos.x - 48.041718f, camPos.y - 0.1f, camPos.z   46.73769f);
    }
  

В обоих случаях основная камера запускается из какой-либо другой позиции, которая вообще не является исходной, и заканчивается в другой позиции :

Начиная где-то под / внутри космического корабля :

Исходное положение находится внутри космического корабля, а не в исходном положении камеры

И заканчивая здесь :

Заканчивается в этом положении

Ответ №1:

Работает :

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

public class PlayingInGameScenesController : MonoBehaviour
{
    public GameObject camera;
    public LockController lockController;
    public GameObject uiTextsImage;
    public float transitionSpeed = 5f;
    public Transform currentView;

    // The initial offset from the target.
    private Vector3 offset;
    private bool newGame = true;
    private bool playingScene = true;
    private Vector3 newPos;

    private void Start()
    {
        currentView.position = new Vector3(43.4f, 1f,-6f);
        offset = camera.transform.position - currentView.position;
    }

    public void PlayingSceneInGame()
    {
        PlayingSceneStatesControls(true);
        StartCoroutine(ScenePlayingTime());
    }

    private void Update()
    {
        if (SceneManager.GetActiveScene().name != "Main Menu" amp;amp; newGame == true)
        {
            PlayingSceneInGame();
            newGame = false;
        }
    }

    private void LateUpdate()
    {
        if (playingScene == false)
        {
            //Lerp position
            camera.transform.position = Vector3.Lerp(camera.transform.position, currentView.position, Time.deltaTime * transitionSpeed);
        }
    }

    private void PlayingSceneStatesControls(bool LockState)
    {
        lockController.LockControl(LockState);

        if (LockState == true)
        {
            // change state of free look camera height and view distance.
            // change the cameras states enable true/false.
            // change the ui texts for description text and scene text enable true/false.

            uiTextsImage.SetActive(true);

        }
        else
        {
            uiTextsImage.SetActive(false);
            playingScene = false;
        }
    }

    IEnumerator ScenePlayingTime()
    {
        yield return new WaitForSeconds(10);

        PlayingSceneStatesControls(false);
    }
}