PLAY模式下相机初始位置问题

问题描述 投票:0回答:1

我需要帮助,因为我有一个带有这些

transform.position
数据的预制相机:

Scene:Vector3(-2.86999989,1.01999998,-0.810000002).

代码中的这一行:

[SerializeField] private Vector3 initialCameraPosition = new Vector3(-2.86999989, 1.01999998, -0.810000002);

我编写了一个脚本,允许我使用这些初始的transform.position数据开始相机旋转。但是,当我启动脚本时,预制件(相机)transform.position 值立即被覆盖:

play:Vector3(-2.72023177,0.810079217,-1.23373544).

Scene和Play的transform.position数据的区别:

X axis: 0.1498
Y axis: -0.2099
Z axis: -0.4237

我拖动脚本的目标具有 Vector3(0,0,0,) 变换.位置。

  • 我只使用 1 个相机。;

  • 其他脚本不使用相机。;

  • 没有其他设置影响相机。

我的问题是为什么我的相机的初始值在PLAY模式下会跳跃/改变?

预先感谢您的帮助。

剧本:

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

public class CameraController : MonoBehaviour
{
    [SerializeField] private Transform target; 
    [SerializeField] private Vector3 initialCameraPosition = new Vector3(3f, 1f, 2.5f);
    [SerializeField] private Vector3 initialCameraRotation = new Vector3(30f, 45f, 0f);

    public float sensitivity = 100f; // Forgatás érzékenysége
    private float _yaw = 0f;         // Az aktuális forgási szög vízszintes tengelyen
    private float _pitch = 0f;       // Az aktuális forgási szög függőleges tengelyen
    private float distanceFromTarget = 5f; // Távolság a célponttól

    private float minPitch = 5f;     // Minimális függőleges szög
    private float maxPitch = 90f;    // Maximális függőleges szög

    private Transform cameraObject;  // A kamera objektum, amit dinamikusan megkeresünk

    void Start()
    {
        // Kamera objektum megkeresése, ha nincs előzőleg hozzárendelve
        cameraObject = Camera.main.transform;

        if (target == null)
        {
            Debug.LogError("Nincs célpont (Target) hozzárendelve!");
        }

        if (cameraObject == null)
        {
            Debug.LogError("Nincs kamera a jelenetben!");
            return;
        }

        // Beállítjuk a kezdeti pozíciót és rotációt
        cameraObject.position = initialCameraPosition;
        cameraObject.rotation = Quaternion.Euler(initialCameraRotation);

        // Távolság és forgási szögek kiszámítása a megadott kezdőpozícióból
        Vector3 targetDirection = cameraObject.position - target.position;
        distanceFromTarget = targetDirection.magnitude;

        _yaw = initialCameraRotation.y; // A yaw értéke a kezdeti rotációból
        _pitch = initialCameraRotation.x; // A pitch értéke a kezdeti rotációból
    }

    void Update()
    {
        HandleInput();

        // Korlátozzuk a pitch értéket
        _pitch = Mathf.Clamp(_pitch, minPitch, maxPitch);

        // Forgatjuk a kamerát a célpont körül
        RotateCamera();
    }

    private void HandleInput()
    {
        Vector2 inputDelta = Vector2.zero;

        // Mobil érintés
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            inputDelta = touch.deltaPosition;
        }
        // Egér
        else if (Input.GetMouseButton(0))
        {
            inputDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        }

        // Frissítjük a forgási értékeket
        _yaw += inputDelta.x * sensitivity * Time.deltaTime;
        _pitch -= inputDelta.y * sensitivity * Time.deltaTime;
    }

    private void RotateCamera()
    {
        // Kiszámítjuk a forgást a célpont körül
        Quaternion rotation = Quaternion.Euler(_pitch, _yaw, 0f);
        Vector3 positionOffset = rotation * new Vector3(0, 0, -distanceFromTarget);

        // Beállítjuk a kamera pozícióját és rotációját
        cameraObject.position = target.position + positionOffset;
        cameraObject.LookAt(target);
    }
}
c# unity-game-engine camera rotation
1个回答
0
投票

我之所以这么说,是因为

initialCameraPosition
initialCameraRotation
相冲突。

初始位置完全被后者覆盖,代码的其余部分纯粹由距离和方向驱动。

事实上,初始位置几乎根本不重要 - 除了计算

distanceFromTarget

在这种轨道相机设置中,您无法同时控制初始位置和

pitch, yaw
。您必须选择其中之一,目前
initialCameraRotation
获胜。

© www.soinside.com 2019 - 2024. All rights reserved.