記錄一下控制相機圍繞物體旋轉與移動的腳本,相機操作思路分為兩塊,一部分為旋轉,一部分為移動,旋轉是根據當前center中心點的坐標,根據距離設置與默認的旋轉進行位置移動,移動是根據相機的左右和前后進行計算,當獲取到移動的值時把中心點進行移動,而不是移動相機,相機是根據中心點的坐標進行計算自己的坐標
這個中心點是一個空物體放在模型下方,不要把模型放進去,
默認的角度設置需要提前說一下,例如當前我相機在場景的旋轉為(39,135,0),
如果我想在運行的時候也是這個角度 就需要吧相機x軸填入到腳本的y軸上,需要取反為負數
相機的y軸放到腳本的x上,但是腳本的y需要自身的旋轉減去180 設置就為(-45,-39,0)
這樣做的理由就是把360的角度映射為正負1800
剩下的就是是否開啟自旋轉與是否可以低于地面
using QFramework;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;public class Camera_模型相機 : MonoBehaviour
{// public Transform target; // 目標物體public GameObject center;//圍繞點public float rotateSpeed = 5.0f; // 旋轉速度public float scrollSpeed = 5.0f; // 滾輪速度public float minDistance = 20f; // 最小距離public float maxDistance = 150; // 最大距離public float initialDistance = 20.0f; // 初始距離public Vector2 initialAngles = new Vector2(0f, 30f); // 初始角度(水平,垂直)public float moveSpeed;//移動速度float move_X,move_Y;private float currentDistance;private float horizontalAngle;private float verticalAngle;public bool enableAutoRotate = false; // 是否啟用自動旋轉public float autoRotateSpeed = 10f; // 自動旋轉速度bool bl_旋轉控制;Vector3 initialPos;float time_自選擇控制=5;public bool allowBelowGround = true; //是否允許低于地面public float groundHeight = 0f; // 地面高度(可自定義)void Start(){currentDistance = initialDistance;horizontalAngle = initialAngles.x;verticalAngle = initialAngles.y;initialPos = center.transform.position;UpdateCameraPosition();}void Update(){HandleMouseInput();HandleScrollInput();if (enableAutoRotate){if (!bl_旋轉控制){time_自選擇控制 += Time.deltaTime;if (time_自選擇控制 >= 5) { bl_旋轉控制 = true; time_自選擇控制 = 0; }}AutoRotateCenter();}UpdateCameraPosition();}void AutoRotateCenter(){if (bl_旋轉控制) horizontalAngle -= autoRotateSpeed * Time.deltaTime;}void HandleMouseInput(){if (Input.GetMouseButton(1)){bl_旋轉控制 = false;time_自選擇控制 = 0;// 獲取鼠標移動量horizontalAngle += Input.GetAxis("Mouse X") * rotateSpeed;verticalAngle += Input.GetAxis("Mouse Y") * rotateSpeed;verticalAngle = Mathf.Clamp(verticalAngle, -89f, 89f); // 限制垂直角度} // 新增右鍵平移邏輯// 鼠標左鍵移動if (Input.GetMouseButton(0)){bl_旋轉控制 = false;time_自選擇控制 = 0;move_X = moveSpeed * Input.GetAxis("Mouse X");move_Y= moveSpeed* Input.GetAxis("Mouse Y");Vector3 right = transform.right * move_X;Vector3 forward = transform.forward * move_Y;forward.y = 0; // 保持水平移動// print((right + forward));center.transform.Translate(-(right + forward), Space.World);}}void HandleScrollInput(){float scroll = Input.GetAxis("Mouse ScrollWheel");currentDistance -= scroll * scrollSpeed;currentDistance = Mathf.Clamp(currentDistance, minDistance, maxDistance);}public void ResetCamera(){// 重置到初始狀態currentDistance = initialDistance;horizontalAngle = initialAngles.x;verticalAngle = initialAngles.y;center.Position(initialPos); bl_旋轉控制 = false;}void UpdateCameraPosition(){// 計算旋轉Quaternion yaw = Quaternion.AngleAxis(horizontalAngle, Vector3.up);Quaternion pitch = Quaternion.AngleAxis(verticalAngle, Vector3.right);Quaternion combinedRotation = yaw * pitch;// 計算相機位置Vector3 offset = combinedRotation * Vector3.forward * currentDistance;Vector3 targetPos = center.transform.position + offset;// 新增地面高度限制if (!allowBelowGround && targetPos.y < groundHeight){targetPos.y = groundHeight+0.2f; 重新計算距離保持原有水平距離//float horizontalDist = Mathf.Sqrt(// Mathf.Pow(targetPos.x - center.transform.position.x, 2) +// Mathf.Pow(targetPos.z - center.transform.position.z, 2)//);//currentDistance = horizontalDist / Mathf.Cos(Mathf.Asin(// (groundHeight - center.transform.position.y) / currentDistance//));}transform.position = targetPos;// 確保相機看向目標transform.LookAt(center.transform.position);}
}