При включении скрипта OrbitCam меняется вид и положение камеры, как я могу включить его, но сохранить вид и положение камеры?

#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 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)
        {
            uiTextsImage.SetActive(true);

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

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

        PlayingSceneStatesControls(false);
    }
}
  

Новое положение камеры

Теперь на этом этапе я хочу проверить и узнать, когда камера больше не движется в LateUpdate, а затем, когда камера перестала двигаться, чтобы включить true для сценария OrbitCam :

 using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class OrbitCam : MonoBehaviour
    {
        //All the variables used in this class(Look below to see what they do. :D   )
        private const float Y_ANGLE_MIN = 0.0f;
        private const float Y_ANGLE_MAX = 50.0f;
        private const float DISTANCE_MAX = 10.0f;
        private const float DISTANCE_MIN = 0.1f;
        private const float TRANS_MIN = 1.0f;
        private const float TRANS_MAX = 2.0f;
    
        public Transform lookAt;
        public Transform camTransform;
        public GameObject player;
    
        private Camera cam;
    
        public float distance = 5.0f;
        private float currentX = 0.0f;
        private float currentY = 0.0f;
        private float sensitivityX = 4.0f;
        private float sensitivityY = 1.0f;
        private float trandis;
    
        public Vector3 height = new Vector3(0, 0, 0);
    
        private bool below = false;
        private List<Renderer> playerRenderers = new List<Renderer>();
    
        private void Start()
        {
            //Makes camTransform a transform. :)
            camTransform = transform;
            //Sets variable cam value to the main camera
            cam = Camera.main;
    
            foreach (Transform child in player.transform)
            {
                if (child.GetComponent<Renderer>() != null)
                {
                    playerRenderers.Add(child.GetComponent<Renderer>());
                }
            }
        }
    
        private void Update()
        {
            //Makes the camera move by looking at the axis of the mouse(Also multiplied by the seisitivity.)
            currentX  = Input.GetAxis("Mouse X") * sensitivityX;
            currentY  = Input.GetAxis("Mouse Y") * sensitivityY;
    
            //Limits the Y variable
            currentY = Mathf.Clamp(currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);
    
            //Thiago Laranja's scrollwheel implemetation.
            if (Input.GetAxis("Mouse ScrollWheel") > 0) { distance  = 0.2f; }
            if (Input.GetAxis("Mouse ScrollWheel") < 0) { distance -= 0.2f; }
    
            //Makes sure that these variables never go over the max and be les than the min. :) 
            distance = Mathf.Clamp(distance, DISTANCE_MIN, DISTANCE_MAX);
            trandis = Mathf.Clamp(distance, TRANS_MIN, TRANS_MAX) - 1;
    
            for (int i = 0; i < playerRenderers.Count; i  )
            {
                //Sets players transparency(Make sure that player materials rendering mode has set to transparent or other mode that supports transparency).
                playerRenderers[i].material.color = new Color(playerRenderers[i].material.color.r, playerRenderers[i].material.color.g, playerRenderers[i].material.color.b, trandis);
    
                //Disables the object from rendering if your're at distance 0.8.
                if (distance <= 0.8f) { playerRenderers[i].enabled = false; }
                if (distance > 0.8f) { playerRenderers[i].enabled = true; }
            }
            //If close enough to the character sinp into distance of 0.1(If distance is 0 the camera cant be rotated.)
            if (distance <= 0.8f amp;amp; below == false) { distance = 0.1f; below = true; }
            if (distance >= 0.8f amp;amp; below == true) { below = false; }
        }
        private void LateUpdate()
        {
            //Subtracts hte distance from Z coordinate
            Vector3 dir = new Vector3(0, 0, -distance);
    
            //Creates an quaternion for rotation(too bad that we cannot use Vector3. :D   )
            Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);
    
            //Sets the cameras position and makes it look at player.
            camTransform.position = lookAt.position   height   rotation * dir;
            camTransform.LookAt(lookAt.position   height);
        }
    }
  
  • Я не знаю, как проверить, когда камера закончила / перестала перемещаться в целевое положение?

  • Когда я включаю OrbitCam на данный момент, я делаю это вручную, устанавливая флажок включить в редакторе, OrbitCam изменяет вид и положение камеры, и я хочу, чтобы при включении скрипта OrbitCam он сохранял вид и положение камеры на втором снимке экрана. Не сохранять этот вид и положение все время только для запуска игровой части. но что я получаю при включении скрипта OrbitCam, так это :

вид и положение камеры после включения скрипта OrbitCam, и я хочу, чтобы при первом включении скрипта вид и положение сохранялись, как на втором снимке экрана

Ответ №1:

Я бы настоятельно рекомендовал использовать анимацию на камере. Это имеет большое преимущество в том, что вы можете изменять положение камеры, как вы делаете в скрипте, и у вас есть возможность устанавливать события анимации. Таким образом, вы можете вызвать функцию в конце анимации. Итак, если анимация камеры закончена, камера теперь находится в правильном положении, вы можете включить orbit cam. Его также очень просто настроить! Надеюсь, это поможет вам!

Комментарии:

1. Или использование расстояния Vector3 с пороговым значением тоже работает нормально. Моя главная проблема заключается в том, почему при включении скрипта orbitcam он меняет вид и положение камеры, а не продолжает с текущего положения и вида камеры.

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