using System.Collections; using Cinemachine; using Convention.WindowsUI.Variant; using UnityEngine; namespace Demo.Game { public class CameraObject : ScriptableObject { private Camera MainCamera; private CinemachineVirtualCamera 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 FindObjectOfType().ModuleCamera = mainCameraTransform.gameObject.GetComponent(); return mainCameraTransform.gameObject.AddComponent(); } private void Start() { MainCamera = Camera.main; VirtualCamera = GetComponent(); } public override IEnumerator LoadScript(string script) { yield return base.LoadScript(script); } public override IEnumerator UnloadScript() { yield return base.UnloadScript(); FindObjectOfType().ModuleCamera = null; } /// /// 设置是否为正交相机 /// /// [Convention.RScript.Variable.Attr.Method] public void SetOrthographic(string arg) { MainCamera.orthographic = ConvertValue(arg); } /// /// 设置相机视野角度 /// /// [Convention.RScript.Variable.Attr.Method] public void SetFieldOfView(string arg) { MainCamera.fieldOfView = Parse(arg); } /// /// 设置正交相机的尺寸 /// /// [Convention.RScript.Variable.Attr.Method] public void SetOrthographicSize(string arg) { MainCamera.orthographicSize = Parse(arg); } /// /// 设置近裁剪面距离 /// /// [Convention.RScript.Variable.Attr.Method] public void SetNearClipPlane(string arg) { MainCamera.nearClipPlane = Parse(arg); } /// /// 设置远裁剪面距离 /// /// [Convention.RScript.Variable.Attr.Method] public void SetFarClipPlane(string arg) { MainCamera.farClipPlane = Parse(arg); } /// /// 设置相机深度 /// /// [Convention.RScript.Variable.Attr.Method] public void SetDepth(string arg) { MainCamera.depth = Parse(arg); } /// /// 设置虚拟相机跟随目标 /// /// 对象相对路径 [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraFollow(string targetName) { var target = FindWithPath(targetName, false); if (target != null) { VirtualCamera.Follow = target.transform; } } /// /// 设置虚拟相机观察目标 /// /// 对象相对路径 [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraLookAt(string targetName) { var target = FindWithPath(targetName, false); if (target != null) { VirtualCamera.LookAt = target.transform; } } /// /// 设置虚拟相机跟随偏移 /// /// X轴偏移 /// Y轴偏移 /// Z轴偏移 [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraFollowOffset(string x, string y, string z) { var body = VirtualCamera.GetCinemachineComponent(); if (body != null) { body.m_FollowOffset = new Vector3( Parse(x), Parse(y), Parse(z) ); } } /// /// 设置虚拟相机跟随阻尼 /// /// X轴阻尼 /// Y轴阻尼 /// Z轴阻尼 [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraFollowDamping(string x, string y, string z) { var body = VirtualCamera.GetCinemachineComponent(); if (body != null) { body.m_XDamping = Parse(x); body.m_YDamping = Parse(y); body.m_ZDamping = Parse(z); } } /// /// 设置虚拟相机观察阻尼 /// /// X轴阻尼 /// Y轴阻尼 /// Z轴阻尼 [Convention.RScript.Variable.Attr.Method] public void SetVirtualCameraLookAtDamping(string x, string y, string z) { var aim = VirtualCamera.GetCinemachineComponent(); if (aim != null) { aim.m_HorizontalDamping = Parse(x); aim.m_VerticalDamping = Parse(y); } } } }