Files

270 lines
11 KiB
C#
Raw Permalink Normal View History

2025-09-25 19:04:05 +08:00
using System.Collections;
2025-11-28 10:24:33 +08:00
#if UNITY_6000_0_OR_NEWER
using Unity.Cinemachine;
#else
2025-09-25 19:04:05 +08:00
using Cinemachine;
2025-11-28 10:24:33 +08:00
#endif
2025-09-25 19:04:05 +08:00
using Convention.WindowsUI.Variant;
using UnityEngine;
2025-12-15 17:20:55 +08:00
using Demo.Game.Attr;
2025-12-16 17:54:51 +08:00
using System.IO;
using Convention;
2025-12-18 10:16:24 +08:00
using Demo.Game.ConfigType;
2025-09-25 19:04:05 +08:00
namespace Demo.Game
2025-12-12 15:19:10 +08:00
{
2025-12-16 17:54:51 +08:00
namespace ConfigType
{
public class CameraObjectConfig : ScriptLoadableConfig
{
public bool IsSetupOrthographic = false;
2025-12-16 17:54:51 +08:00
public bool orthographic;
public bool IsSetupFieldOfView = false;
2025-12-16 17:54:51 +08:00
public float fieldOfView;
public bool IsSetupOrthographicSize = false;
2025-12-16 17:54:51 +08:00
public float orthographicSize;
public bool IsSetupNearClipPlane = false;
2025-12-16 17:54:51 +08:00
public float nearClipPlane;
public bool IsSetupFarClipPlane = false;
2025-12-16 17:54:51 +08:00
public float farClipPlane;
public bool IsSetupDepth = false;
2025-12-16 17:54:51 +08:00
public float depth;
public bool IsSetupVirtualCameraFollow = false;
2025-12-16 17:54:51 +08:00
public int VirtualCameraFollow;
public bool IsSetupVirtualCameraLookAt = false;
2025-12-16 17:54:51 +08:00
public int VirtualCameraLookAt;
public bool IsSetupVirtualCameraFollowOffset = false;
2025-12-16 17:54:51 +08:00
public Vector3 VirtualCameraFollowOffset;
public bool IsSetupVirtualCameraLookAtDamping = false;
2025-12-16 17:54:51 +08:00
public Vector3 VirtualCameraLookAtDamping;
public override void Deserialize(BinaryReader reader)
{
IsSetupOrthographic =BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
orthographic = BinarySerializeUtility.ReadBool(reader);
IsSetupFieldOfView = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
fieldOfView = BinarySerializeUtility.ReadFloat(reader);
IsSetupOrthographicSize = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
orthographicSize = BinarySerializeUtility.ReadFloat(reader);
IsSetupNearClipPlane = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
nearClipPlane = BinarySerializeUtility.ReadFloat(reader);
IsSetupFarClipPlane = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
farClipPlane = BinarySerializeUtility.ReadFloat(reader);
IsSetupDepth = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
depth = BinarySerializeUtility.ReadFloat(reader);
IsSetupVirtualCameraFollow = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
VirtualCameraFollow = BinarySerializeUtility.ReadInt(reader);
IsSetupVirtualCameraLookAt = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
VirtualCameraLookAt = BinarySerializeUtility.ReadInt(reader);
IsSetupVirtualCameraFollowOffset = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
VirtualCameraFollowOffset = BinarySerializeUtility.ReadVec3(reader);
IsSetupVirtualCameraLookAtDamping = BinarySerializeUtility.ReadBool(reader);
2025-12-16 17:54:51 +08:00
VirtualCameraLookAtDamping = BinarySerializeUtility.ReadVec3(reader);
2025-12-16 17:54:51 +08:00
base.Deserialize(reader);
}
public override void Serialize(BinaryWriter writer)
{
BinarySerializeUtility.WriteBool(writer, IsSetupOrthographic);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteBool(writer, orthographic);
BinarySerializeUtility.WriteBool(writer, IsSetupFieldOfView);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteFloat(writer, fieldOfView);
BinarySerializeUtility.WriteBool(writer, IsSetupOrthographicSize);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteFloat(writer, orthographicSize);
BinarySerializeUtility.WriteBool(writer, IsSetupNearClipPlane);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteFloat(writer, nearClipPlane);
BinarySerializeUtility.WriteBool(writer, IsSetupFarClipPlane);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteFloat(writer, farClipPlane);
BinarySerializeUtility.WriteBool(writer, IsSetupDepth);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteFloat(writer, depth);
BinarySerializeUtility.WriteBool(writer, IsSetupVirtualCameraFollow);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteInt(writer, VirtualCameraFollow);
BinarySerializeUtility.WriteBool(writer, IsSetupVirtualCameraLookAt);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteInt(writer,VirtualCameraLookAt);
BinarySerializeUtility.WriteBool(writer, IsSetupVirtualCameraFollowOffset);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteVec3(writer, VirtualCameraFollowOffset);
BinarySerializeUtility.WriteBool(writer, IsSetupVirtualCameraLookAtDamping);
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.WriteVec3(writer, VirtualCameraLookAtDamping);
base.Serialize(writer);
}
}
}
2025-12-12 15:19:10 +08:00
[Scriptable(nameof(MakeCameraObject))]
2025-09-25 19:04:05 +08:00
public class CameraObject : ScriptableObject
{
2025-12-18 10:16:24 +08:00
protected override ScriptLoadableConfig MakeConfig()
{
return new CameraObjectConfig();
}
internal Camera MainCamera => Camera.main;
2025-11-28 10:24:33 +08:00
private CinemachineCamera m_VirtualCamera;
private CinemachineCamera VirtualCamera
{
get
{
if (m_VirtualCamera == null)
m_VirtualCamera = GetComponent<CinemachineCamera>();
return m_VirtualCamera;
}
}
2025-09-25 19:04:05 +08:00
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
2025-11-28 10:24:33 +08:00
FindFirstObjectByType<SceneGameWindow>().ModuleCamera =
mainCameraTransform.gameObject.GetComponent<CinemachineCamera>();
2025-09-25 19:04:05 +08:00
return mainCameraTransform.gameObject.AddComponent<CameraObject>();
}
public override IEnumerator UnloadScript()
{
yield return base.UnloadScript();
2025-11-28 10:24:33 +08:00
FindFirstObjectByType<SceneGameWindow>().ModuleCamera = null;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置是否为正交相机
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetOrthographic(bool orthographic)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupOrthographic = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().orthographic = MainCamera.orthographic = orthographic;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置相机视野角度
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetFieldOfView(float fieldOfView)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupFieldOfView = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().fieldOfView = MainCamera.fieldOfView = fieldOfView;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置正交相机的尺寸
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetOrthographicSize(float orthographicSize)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupOrthographicSize = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().orthographicSize = MainCamera.orthographicSize = orthographicSize;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置近裁剪面距离
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetNearClipPlane(float nearClipPlane)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupNearClipPlane = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().nearClipPlane = MainCamera.nearClipPlane = nearClipPlane;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置远裁剪面距离
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetFarClipPlane(float farClipPlane)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupFarClipPlane = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().farClipPlane = MainCamera.farClipPlane = farClipPlane;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置相机深度
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetDepth(float depth)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupDepth = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().depth = MainCamera.depth = depth;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置虚拟相机跟随目标
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetVirtualCameraFollow(ScriptableObject target)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupVirtualCameraFollow = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().VirtualCameraFollow = GetRoot().FindIndex(target);
2025-11-24 18:02:57 +08:00
VirtualCamera.Follow = target.transform;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置虚拟相机观察目标
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetVirtualCameraLookAt(ScriptableObject target)
2025-09-25 19:04:05 +08:00
{
GetConfig<CameraObjectConfig>().IsSetupVirtualCameraLookAt = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().VirtualCameraLookAt = GetRoot().FindIndex(target);
2025-11-24 18:02:57 +08:00
VirtualCamera.LookAt = target.transform;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置虚拟相机跟随偏移
/// </summary>
/// <param name="x">X轴偏移</param>
/// <param name="y">Y轴偏移</param>
/// <param name="z">Z轴偏移</param>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetVirtualCameraFollowOffset(float x, float y, float z)
2025-09-25 19:04:05 +08:00
{
2025-11-28 10:24:33 +08:00
var body = VirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineFollow;
2025-09-25 19:04:05 +08:00
if (body != null)
{
GetConfig<CameraObjectConfig>().IsSetupVirtualCameraFollowOffset = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().VirtualCameraFollowOffset = new Vector3(x, y, z);
2025-11-28 10:24:33 +08:00
body.FollowOffset = new Vector3(x, y, z);
2025-09-25 19:04:05 +08:00
}
}
/// <summary>
/// 设置虚拟相机观察阻尼
/// </summary>
/// <param name="x">X轴阻尼</param>
/// <param name="y">Y轴阻尼</param>
/// <param name="z">Z轴阻尼</param>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetVirtualCameraLookAtDamping(float x, float y, float z)
2025-09-25 19:04:05 +08:00
{
2025-11-28 10:24:33 +08:00
var aim = VirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineRotationComposer;
2025-09-25 19:04:05 +08:00
if (aim != null)
{
GetConfig<CameraObjectConfig>().IsSetupVirtualCameraLookAtDamping = true;
2025-12-18 10:16:24 +08:00
GetConfig<CameraObjectConfig>().VirtualCameraLookAtDamping = new Vector3(x, y, z);
2025-11-28 10:24:33 +08:00
aim.Damping = new(x, y);
2025-09-25 19:04:05 +08:00
}
}
}
}