2024-08-09 16:00:30 +08:00
|
|
|
|
using Gameplay;
using System;
using Gameplay.Performance;
using Gameplay.Skill;
using UnityEngine;
using Sirenix.OdinInspector;
[ExecuteAlways]
public class CameraController : MonoBehaviour
{
private const float CameraStartY = 25;
private const float CameraStartSize = 12;
private const float CameraStartFOV = 30;
private const float NearClipPlane = 0.03f;
private const float FarClipPlane = 150;
private readonly Vector3 cameraStartRotationO = new Vector3(37.5f, -10f, 0f);
private readonly Vector3 cameraStartRotationP = new Vector3(45, -10, 0);
//之前的缩放是6次滚轮从最小放到最大,故每一次缩放的值为1/6f
private const float ZoomStep = 1 / 6f;
public float leftMargin = 1.5f;
public float rightMargin = 1.5f;
public float topMargin = 0.9f;
public float bottomMargin = 0.9f;
public float moveSpeedX = 0.19f;
public float moveSpeedY = 0.3f;
public float unitPerPixel = 0.01f;
[ShowIf("isFightCamera")]
public float CameraMinSize = 6;
[ShowIf("isFightCamera")]
public float CameraMaxSize = 12;
[HideIf("isFightCamera")]
public BoxCollider boxBounds;
[HideIf("isFightCamera")]
public float CameraMinFOV = 15;
[HideIf("isFightCamera")]
public float CameraMaxFOV = 30;
[LabelText("是否战斗相机")]
public bool isFightCamera = true;
private Camera mainCamera;
private bool isIgnoreZoomLimit;
public Bounds CameraBounds { get; set; }
private bool isOrthographic => mainCamera.orthographic;
//Camera拖动控制
public static bool FingerMoveEnable = true;
//size,将透视和正交相机的fov和orthographic size整合为统一数值
private float Size
{
get
{
if (isOrthographic)
return mainCamera.orthographicSize;
else
{
var fov = mainCamera.fieldOfView;
//这里乘(CameraMaxSize - CameraMinSize)/(CameraMaxFOV - CameraMinFOV)是将fov的区间变得和orthographic size区间一致
return fov * (CameraMaxSize - CameraMinSize) / (CameraMaxFOV - CameraMinFOV);
}
}
}
//缩放百分比,0表示放到最小,1表示放到最大
private float ZoomScale
{
get
{
if (isOrthographic)
return (CameraMaxSize - mainCamera.orthographicSize) / (CameraMaxSize - CameraMinSize);
else
return (CameraMaxFOV - mainCamera.fieldOfView) / (CameraMaxFOV - CameraMinFOV);
}
set
{
var t = Mathf.Clamp(value, 0, 1);
if(Math.Abs(ZoomScale - t) < float.Epsilon)
return;
if (isOrthographic)
mainCamera.orthographicSize = Mathf.Lerp(CameraMaxSize, CameraMinSize, t);
else
mainCamera.fieldOfView = Mathf.Lerp(CameraMaxFOV, CameraMinFOV, t);
}
}
private void Awake()
{
mainCamera = GetComponent<Camera>();
if (isFightCamera)
{
var useOrthographic = PerformanceManager.instance != null && PerformanceManager.instance.data.fightUseOrthographic;
var rotEuler = useOrthographic ? cameraStartRotationO : cameraStartRotationP;
if (useOrthographic)
{
// TODO: 这里的值是固定的,需要根据实际情况调整
//bottomMargin = 0.9f;
mainCamera.orthographic = true;
mainCamera.orthographicSize = CameraStartSize;
mainCamera.transform.SetPositionAndRotation(new Vector3(0, CameraStartY, 0),
Quaternion.Euler(rotEuler));
}
else
{
// TODO: 这里的值是固定的,需要根据实际情况调整
//bottomMargin = 0.7f;
mainCamera.orthographic = false;
mainCamera.fieldOfView = 30;
mainCamera.transform.SetPositionAndRotation(new Vector3(0, 27, 0),
|