我需要帮助,因为我有一个带有这些
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);
}
}
我之所以这么说,是因为
initialCameraPosition
与 initialCameraRotation
相冲突。
初始位置完全被后者覆盖,代码的其余部分纯粹由距离和方向驱动。
事实上,初始位置几乎根本不重要 - 除了计算
distanceFromTarget
。
在这种轨道相机设置中,您无法同时控制初始位置和
pitch, yaw
。您必须选择其中之一,目前 initialCameraRotation
获胜。