using System.Collections; #if UNITY_6000_0_OR_NEWER using Unity.Cinemachine; #else using Cinemachine; #endif using Convention.WindowsUI.Variant; using UnityEngine; using Demo.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(); return m_VirtualCamera; } } public static CameraObject MakeCameraObject() { Transform mainCameraTransform = Editor.EditorController.instance.MainGameController.MainCameraTransform; if (mainCameraTransform.GetComponent() != null) { Debug.LogError($"Too much {nameof(CameraObject)}", mainCameraTransform); return null; } // Binding Output FindFirstObjectByType().ModuleCamera = mainCameraTransform.gameObject.GetComponent(); return mainCameraTransform.gameObject.AddComponent(); } public override IEnumerator UnloadScript() { yield return base.UnloadScript(); FindFirstObjectByType().ModuleCamera = null; } /// /// 设置是否为正交相机 /// [Convention.RScript.Variable.Attr.Method] public void SetOrthographic(bool orthographic) { MainCamera.orthographic = orthographic; } /// /// 设置相机视野角度 /// [Convention.RScript.Variable.Attr.Method] public void SetFieldOfView(float fieldOfView) { MainCamera.fieldOfView = fieldOfView; } /// /// 设置正交相机的尺寸 /// [Convention.RScript.Variable.Attr.Method] public void SetOrthographicSize(float orthographicSize) { MainCamera.orthographicSize = orthographicSize; } /// /// 设置近裁剪面距离 /// [Convention.RScript.Variable.Attr.Method] public void SetNearClipPlane(float nearClipPlane) { MainCamera.nearClipPlane = nearClipPlane; } /// /// 设置远裁剪面距离 /// [Convention.RScript.Variable.Attr.Method] public void SetFarClipPlane(float farClipPlane) { MainCamera.farClipPlane = farClipPlane; } /// /// 设置相机深度 /// [Convention.RScript.Variable.Attr.Method] public void SetDepth(float depth) { MainCamera.depth = depth; } /// /// 设置虚拟相机跟随目标 /// [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraFollow(ScriptableObject target) { VirtualCamera.Follow = target.transform; } /// /// 设置虚拟相机观察目标 /// [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraLookAt(ScriptableObject target) { VirtualCamera.LookAt = target.transform; } /// /// 设置虚拟相机跟随偏移 /// /// X轴偏移 /// Y轴偏移 /// Z轴偏移 [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); } } /// /// 设置虚拟相机跟随阻尼 /// /// X轴阻尼 /// Y轴阻尼 /// Z轴阻尼 //[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; // } //} /// /// 设置虚拟相机观察阻尼 /// /// X轴阻尼 /// Y轴阻尼 /// Z轴阻尼 [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); } } } }