diff --git a/Assets/ModuleCore/ModuleCamera.meta b/Assets/ModuleCore/ModuleCamera.meta
new file mode 100644
index 0000000..a15fb32
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a132d392d2a46354fac4a0c16cc6dac5
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController.cs b/Assets/ModuleCore/ModuleCamera/CameraController.cs
new file mode 100644
index 0000000..c460e1d
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController.cs
@@ -0,0 +1,29 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+///
+/// 相机控制器
+///
+public abstract class CameraController : MonoBehaviour {
+ /// 位置
+ public abstract Vector3 Position { get; set; }
+ /// 正向
+ public abstract Vector3 Forward { get; set; }
+ /// 右向
+ public abstract Vector3 Right { get; set; }
+ /// 旋转
+ public abstract Vector3 EulerAngles { get; set; }
+ /// 距离
+ public abstract float Distance { get; set; }
+
+ /// 初始化
+ public abstract void Initialize();
+ /// 重置相机
+ public abstract void ResetCamera();
+
+ /// 屏幕坐标转换世界坐标
+ public virtual Vector3 ScreenToWorldPosition(Vector3 screenPosition) {
+ throw new System.NotImplementedException();
+ }
+}
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController.cs.meta b/Assets/ModuleCore/ModuleCamera/CameraController.cs.meta
new file mode 100644
index 0000000..41ab6f7
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 96a98904bc59dd9468543e99e52f3d94
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController.meta b/Assets/ModuleCore/ModuleCamera/CameraController.meta
new file mode 100644
index 0000000..f6b233a
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2408eae033f1fe54ebf17cdc3530f985
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController/CameraDefault.cs b/Assets/ModuleCore/ModuleCamera/CameraController/CameraDefault.cs
new file mode 100644
index 0000000..8fa9dae
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController/CameraDefault.cs
@@ -0,0 +1,47 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+///
+/// 默认相机
+///
+public class CameraDefault : CameraController {
+
+ public override Vector3 Position {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+ public override Vector3 Forward {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+ public override Vector3 Right {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+ public override Vector3 EulerAngles {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+ public override float Distance {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+
+ public override void Initialize() {
+ ModuleCamera.OnCameraMode += ModuleCamera_OnCameraMode;
+ }
+
+ private void ModuleCamera_OnCameraMode(EnumCameraMode mode) {
+#if UNITY_STANDALONE_WIN && !UNITY_EDITOR
+ return;
+#endif
+ gameObject.SetActive(mode == EnumCameraMode.None);
+ if (mode == EnumCameraMode.None) { ModuleCamera.CurrentCamera = this; }
+ }
+
+ public override void ResetCamera() {
+ // transform.position = HotUpdateScene.I.StartPoint.position;
+ // transform.eulerAngles = HotUpdateScene.I.StartPoint.eulerAngles;
+ }
+}
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController/CameraDefault.cs.meta b/Assets/ModuleCore/ModuleCamera/CameraController/CameraDefault.cs.meta
new file mode 100644
index 0000000..97d779a
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController/CameraDefault.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0f6f4a232485de9439914dc14b7df5a7
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController/CameraMoveAxis.cs b/Assets/ModuleCore/ModuleCamera/CameraController/CameraMoveAxis.cs
new file mode 100644
index 0000000..97b59fc
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController/CameraMoveAxis.cs
@@ -0,0 +1,68 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+///
+/// 移轴相机
+///
+public class CameraMoveAxis : CameraController {
+
+ public Camera mainCamera;
+ public LayerMask layerMask;
+
+ private RaycastHit hitInfo;
+
+ public override Vector3 Position {
+ get => transform.position;
+ set => transform.position = value;
+ }
+ public override Vector3 Forward {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+ public override Vector3 Right {
+ get => throw new System.NotImplementedException();
+ set => throw new System.NotImplementedException();
+ }
+ public override Vector3 EulerAngles {
+ get => transform.eulerAngles;
+ set => transform.eulerAngles = value;
+ }
+ public override float Distance {
+ get => GetVisualField();
+ set => SetVisualField(value);
+ }
+
+ private float GetVisualField() {
+ return Vector3.Distance(mainCamera.transform.localPosition, Vector3.zero);
+ }
+ private void SetVisualField(float value) {
+ value = Mathf.Clamp(value, 10, 30);
+ Vector3 direction = mainCamera.transform.localPosition - Vector3.zero;
+ mainCamera.transform.localPosition = direction.normalized * value;
+ // if (!Volume.profile.TryGet(out DepthOfField depthOfField)) { return; }
+ // depthOfField.focusDistance.SetValue(new FloatParameter(value));
+ }
+
+ public override void Initialize() {
+ ModuleCamera.OnCameraMode += ModuleCamera_OnCameraMode;
+ }
+
+ private void ModuleCamera_OnCameraMode(EnumCameraMode mode) {
+ gameObject.SetActive(mode == EnumCameraMode.MoveAxis);
+ if (mode == EnumCameraMode.MoveAxis) { ModuleCamera.CurrentCamera = this; }
+ }
+
+ public override void ResetCamera() {
+ // transform.position = HotUpdateScene.I.StartPoint.position;
+ // transform.eulerAngles = HotUpdateScene.I.StartPoint.eulerAngles;
+ }
+
+ public override Vector3 ScreenToWorldPosition(Vector3 screenPosition) {
+ Ray ray = mainCamera.ScreenPointToRay(screenPosition);
+ Physics.Raycast(ray, out hitInfo, 200f, layerMask);
+ Vector3 position = Vector3.zero;
+ if (hitInfo.transform != null) { position = hitInfo.point; }
+ return position;
+ }
+}
diff --git a/Assets/ModuleCore/ModuleCamera/CameraController/CameraMoveAxis.cs.meta b/Assets/ModuleCore/ModuleCamera/CameraController/CameraMoveAxis.cs.meta
new file mode 100644
index 0000000..a2f2bc8
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/CameraController/CameraMoveAxis.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cc9103ac1c158bb41af1ba45de4f9d08
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs b/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs
new file mode 100644
index 0000000..2c094e6
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using MuHua;
+
+///
+/// 相机模块
+///
+public class ModuleCamera : ModuleSingle {
+ /// 当前相机
+ public static CameraController CurrentCamera;
+ /// 相机模式事件
+ public static event Action OnCameraMode;
+ /// 设置相机模式
+ public static void Mode(EnumCameraMode mode, bool isReset = true) {
+ OnCameraMode?.Invoke(mode);
+ if (isReset) { I.ResetCamera(); }
+ }
+
+ public List cameras;
+
+ protected override void Awake() => NoReplace();
+
+ private void Start() => cameras.ForEach(obj => obj.Initialize());
+
+ /// 重置相机
+ public void ResetCamera() => cameras.ForEach(obj => obj.ResetCamera());
+
+ ///
+ /// 转换方向
+ ///
+ /// 相机的前方
+ /// 相机的右方
+ /// 输入的移动方向
+ /// Y轴向上的平面移动方向
+ public static Vector3 TransferDirection(Vector3 forward, Vector3 right, Vector2 moveInput) {
+ // 确保前方和右方方向在水平面上
+ forward.y = 0;
+ right.y = 0;
+
+ // 归一化方向向量
+ forward.Normalize();
+ right.Normalize();
+
+ // 计算移动方向
+ return (forward * moveInput.y + right * moveInput.x).normalized;
+ }
+}
diff --git a/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs.meta b/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs.meta
new file mode 100644
index 0000000..3667f07
--- /dev/null
+++ b/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d436e33934b1feb4d8a3909ffb5292a2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleInput.meta b/Assets/ModuleCore/ModuleInput.meta
new file mode 100644
index 0000000..0992aa6
--- /dev/null
+++ b/Assets/ModuleCore/ModuleInput.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: da2e7bba0b4252e4fbe87dc9d280d2e9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleInput/InputBasic.cs b/Assets/ModuleCore/ModuleInput/InputBasic.cs
new file mode 100644
index 0000000..eeea5ca
--- /dev/null
+++ b/Assets/ModuleCore/ModuleInput/InputBasic.cs
@@ -0,0 +1,20 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+///
+/// 基础输入
+///
+[RequireComponent(typeof(PlayerInput))]
+public class InputBasic : MonoBehaviour {
+ public Vector3 mousePosition;
+
+ #region 输入系统
+ /// 鼠标位置
+ public void OnMousePosition(InputValue inputValue) {
+ mousePosition = inputValue.Get();
+ ModuleInput.mousePosition = mousePosition;
+ }
+ #endregion
+}
diff --git a/Assets/ModuleCore/ModuleInput/InputBasic.cs.meta b/Assets/ModuleCore/ModuleInput/InputBasic.cs.meta
new file mode 100644
index 0000000..f5f40e6
--- /dev/null
+++ b/Assets/ModuleCore/ModuleInput/InputBasic.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: efd8b69b2d3f913448202357a1a084ab
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleInput/ModuleInput.cs b/Assets/ModuleCore/ModuleInput/ModuleInput.cs
new file mode 100644
index 0000000..4908de7
--- /dev/null
+++ b/Assets/ModuleCore/ModuleInput/ModuleInput.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using MuHua;
+
+///
+/// 输入模块
+///
+public class ModuleInput : ModuleSingle {
+
+ /// 当前输入模式
+ public static EnumInputMode inputMode;
+ /// 鼠标指针位置
+ public static Vector3 mousePosition;
+ /// 转换模式事件
+ public static event Action OnInputMode;
+ /// 临时禁用事件
+ public static event Action OnTemporarilyDisable;
+
+ private static bool isPointerOverUIObject;// 指针是否在UI上
+
+ /// 指针是否在UI上
+ public static bool IsPointerOverUIObject => isPointerOverUIObject;
+
+ /// 设置输入模式
+ public static void Mode(EnumInputMode mode) {
+ inputMode = mode;
+ OnInputMode?.Invoke(mode);
+ }
+ /// 临时禁用输入
+ public static void TemporarilyDisable(bool value) => OnTemporarilyDisable?.Invoke(value);
+
+ protected override void Awake() => NoReplace();
+
+ private void Update() {
+#if UNITY_STANDALONE
+ //电脑平台
+ isPointerOverUIObject = EventSystem.current.IsPointerOverGameObject();
+#elif UNITY_WEBGL
+ //WebGL平台
+ isPointerOverUIObject = EventSystem.current.IsPointerOverGameObject();
+#elif UNITY_ANDROID
+ //安卓平台
+ isPointerOverUIObject = EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId);
+#elif UNITY_IOS
+ //苹果平台
+ isPointerOverUIObject = EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId);
+#endif
+ }
+}
diff --git a/Assets/ModuleCore/ModuleInput/ModuleInput.cs.meta b/Assets/ModuleCore/ModuleInput/ModuleInput.cs.meta
new file mode 100644
index 0000000..85d8bee
--- /dev/null
+++ b/Assets/ModuleCore/ModuleInput/ModuleInput.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0535501d69413b6439c33f5b9809d359
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleVisual/VisualController.meta b/Assets/ModuleCore/ModuleVisual/VisualController.meta
new file mode 100644
index 0000000..3b62e06
--- /dev/null
+++ b/Assets/ModuleCore/ModuleVisual/VisualController.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7bb6d05c681dd0c4bb87381b7c7862ae
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleVisual/VisualGenerator.cs b/Assets/ModuleCore/ModuleVisual/VisualGenerator.cs
new file mode 100644
index 0000000..6de0297
--- /dev/null
+++ b/Assets/ModuleCore/ModuleVisual/VisualGenerator.cs
@@ -0,0 +1,21 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+///
+/// 可视化生成器
+///
+public abstract class VisualGenerator : MonoBehaviour {
+
+ /// 更新可视化内容
+ public abstract void CreateVisual(ref T visual, Transform original);
+ /// 释放可视化内容
+ public abstract void ReleaseVisual(T visual);
+
+ /// 创建可视化内容
+ public static Type Create(Transform original, Transform parent) {
+ Transform temp = Instantiate(original, parent);
+ temp.gameObject.SetActive(true);
+ return temp.GetComponent();
+ }
+}
diff --git a/Assets/ModuleCore/ModuleVisual/VisualGenerator.cs.meta b/Assets/ModuleCore/ModuleVisual/VisualGenerator.cs.meta
new file mode 100644
index 0000000..41b170c
--- /dev/null
+++ b/Assets/ModuleCore/ModuleVisual/VisualGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 29a91fefa7bcfe24da30d8514a51d25e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleVisual/VisualGenerator.meta b/Assets/ModuleCore/ModuleVisual/VisualGenerator.meta
new file mode 100644
index 0000000..369a310
--- /dev/null
+++ b/Assets/ModuleCore/ModuleVisual/VisualGenerator.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 155db3b2435c1314492a3e51d1e9b711
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: