Files
Convention-Unity-Demo/Assets/Scripts/Framework/CameraObject.cs
2025-12-15 17:20:55 +08:00

171 lines
5.4 KiB
C#

using System.Collections;
#if UNITY_6000_0_OR_NEWER
using Unity.Cinemachine;
#else
using Cinemachine;
#endif
using Convention.WindowsUI.Variant;
using UnityEngine;
using Demo.Game.Attr;
namespace Demo.Game
{
[Scriptable(nameof(MakeCameraObject))]
public class CameraObject : ScriptableObject
{
private Camera MainCamera => Camera.main;
private CinemachineCamera m_VirtualCamera;
private CinemachineCamera VirtualCamera
{
get
{
if (m_VirtualCamera == null)
m_VirtualCamera = GetComponent<CinemachineCamera>();
return m_VirtualCamera;
}
}
public static CameraObject MakeCameraObject()
{
Transform mainCameraTransform = Editor.EditorController.instance.MainGameController.MainCameraTransform;
if (mainCameraTransform.GetComponent<CameraObject>() != null)
{
Debug.LogError($"Too much {nameof(CameraObject)}", mainCameraTransform);
return null;
}
// Binding Output
FindFirstObjectByType<SceneGameWindow>().ModuleCamera =
mainCameraTransform.gameObject.GetComponent<CinemachineCamera>();
return mainCameraTransform.gameObject.AddComponent<CameraObject>();
}
public override IEnumerator UnloadScript()
{
yield return base.UnloadScript();
FindFirstObjectByType<SceneGameWindow>().ModuleCamera = null;
}
/// <summary>
/// 设置是否为正交相机
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetOrthographic(bool orthographic)
{
MainCamera.orthographic = orthographic;
}
/// <summary>
/// 设置相机视野角度
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetFieldOfView(float fieldOfView)
{
MainCamera.fieldOfView = fieldOfView;
}
/// <summary>
/// 设置正交相机的尺寸
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetOrthographicSize(float orthographicSize)
{
MainCamera.orthographicSize = orthographicSize;
}
/// <summary>
/// 设置近裁剪面距离
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetNearClipPlane(float nearClipPlane)
{
MainCamera.nearClipPlane = nearClipPlane;
}
/// <summary>
/// 设置远裁剪面距离
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetFarClipPlane(float farClipPlane)
{
MainCamera.farClipPlane = farClipPlane;
}
/// <summary>
/// 设置相机深度
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetDepth(float depth)
{
MainCamera.depth = depth;
}
/// <summary>
/// 设置虚拟相机跟随目标
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetVirtualCameraFollow(ScriptableObject target)
{
VirtualCamera.Follow = target.transform;
}
/// <summary>
/// 设置虚拟相机观察目标
/// </summary>
[Convention.RScript.Variable.Attr.Method]
public void SetVirtualCameraLookAt(ScriptableObject target)
{
VirtualCamera.LookAt = target.transform;
}
/// <summary>
/// 设置虚拟相机跟随偏移
/// </summary>
/// <param name="x">X轴偏移</param>
/// <param name="y">Y轴偏移</param>
/// <param name="z">Z轴偏移</param>
[Convention.RScript.Variable.Attr.Method]
public void SetVirtualCameraFollowOffset(float x, float y, float z)
{
var body = VirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineFollow;
if (body != null)
{
body.FollowOffset = new Vector3(x, y, z);
}
}
/// <summary>
/// 设置虚拟相机跟随阻尼
/// </summary>
/// <param name="x">X轴阻尼</param>
/// <param name="y">Y轴阻尼</param>
/// <param name="z">Z轴阻尼</param>
//[Convention.RScript.Variable.Attr.Method]
//public void SetVirtualCameraFollowDamping(float x, float y, float z)
//{
// var body = VirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineFollow;
// if (body != null)
// {
// body.XDamping = x;
// body.YDamping = y;
// body.ZDamping = z;
// }
//}
/// <summary>
/// 设置虚拟相机观察阻尼
/// </summary>
/// <param name="x">X轴阻尼</param>
/// <param name="y">Y轴阻尼</param>
/// <param name="z">Z轴阻尼</param>
[Convention.RScript.Variable.Attr.Method]
public void SetVirtualCameraLookAtDamping(float x, float y, float z)
{
var aim = VirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineRotationComposer;
if (aim != null)
{
aim.Damping = new(x, y);
}
}
}
}