This commit is contained in:
MuHua-123
2025-03-07 22:46:13 +08:00
parent 5e819d5257
commit 57a8a6e9a1
83 changed files with 235 additions and 977 deletions
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 66fc15151bdec0642aa0d9f313f50e72
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,58 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 资源模块
/// </summary>
public class ModuleAssets<Data> {
protected List<Data> datas = new List<Data>();
/// <summary> 核心模块 </summary>
protected virtual ModuleCore ModuleCore => ModuleCore.I;
/// <summary> 更改事件 </summary>
public virtual event Action OnChange;
/// <summary> 数据列表 </summary>
public virtual List<Data> Datas => datas;
/// <summary> 数据计数 </summary>
public virtual int Count => Datas.Count;
/// <summary> 数据计数 </summary
public virtual Data this[int index] => Datas[index];
/// <summary> 添加数据 </summary>
public virtual void Add(Data data) { Datas.Add(data); OnChange?.Invoke(); }
/// <summary> 添加数据 </summary>
public virtual void AddRange(IList<Data> data) { Datas.AddRange(data); OnChange?.Invoke(); }
/// <summary> 删除数据 </summary>
public virtual void Remove(Data data) { Datas.Remove(data); OnChange?.Invoke(); }
/// <summary> 保存数据 </summary>
public virtual void Save() { throw new NotImplementedException(); }
/// <summary> 加载数据 </summary>
public virtual void Load() { throw new NotImplementedException(); }
/// <summary> 循环列表 </summary>
public virtual void ForEach(Action<Data> action) => Datas.ForEach(action);
}
/// <summary>
/// 资源模块工具
/// </summary>
public static class ModuleAssetsTool {
/// <summary> 头尾循环标准化索引 </summary>
public static Data LoopIndex<Data>(this ModuleAssets<Data> assets, int index) {
return assets[LoopIndex(index, assets.Count)];
}
/// <summary> 头尾循环标准化索引 </summary>
public static Data LoopIndex<Data>(this List<Data> list, int index) {
return list[LoopIndex(index, list.Count)];
}
/// <summary> 头尾循环标准化索引 </summary>
public static Data LoopIndex<Data>(this Data[] array, int index) {
return array[LoopIndex(index, array.Length)];
}
/// <summary> 头尾循环标准化索引 </summary>
public static int LoopIndex(int index, int maxIndex) {
return index % maxIndex;
}
}
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e145339febf0e6f469eb3a650e52f3d9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,85 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 相机模块
/// </summary>
public abstract class ModuleCamera : MonoBehaviour {
/// <summary> 默认图层遮罩 </summary>
public static readonly LayerMask DefaultLayerMask = ~(1 << 0) | 1 << 0;
/// <summary> 必须要初始化 </summary>
protected abstract void Awake();
/// <summary> 相机位置 </summary>
public abstract Vector3 Position { get; set; }
/// <summary> 相机旋转 </summary>
public abstract Vector3 EulerAngles { get; set; }
/// <summary> 相机视野 </summary>
public abstract float VisualField { get; set; }
/// <summary> 当前相机 </summary>
public abstract Camera ViewCamera { get; }
/// <summary> 渲染纹理 </summary>
public virtual RenderTexture RenderTexture { get; }
/// <summary> 更新渲染纹理 </summary>
public virtual void UpdateRenderTexture(int x, int y) { }
#region
/// <summary> 屏幕坐标转换视图坐标(0-1) </summary>
public virtual Vector3 ScreenToViewPosition(Vector3 screenPosition) {
return ViewCamera.ScreenToViewportPoint(screenPosition);
}
/// <summary> 屏幕坐标转换世界坐标 </summary>
public virtual Vector3 ScreenToWorldPosition(Vector3 screenPosition) {
return ViewCamera.ScreenToWorldPoint(screenPosition);
}
/// <summary> 视图坐标(0-1)转换屏幕坐标</summary>
public virtual Vector3 ViewToScreenPosition(Vector3 screenPosition) {
return ViewCamera.ViewportToScreenPoint(screenPosition);
}
/// <summary> 视图坐标(0-1)转换世界坐标 </summary>
public virtual Vector3 ViewToWorldPosition(Vector3 screenPosition) {
return ViewCamera.ViewportToWorldPoint(screenPosition);
}
/// <summary> 世界坐标转换屏幕坐标 </summary>
public virtual Vector3 WorldToScreenPosition(Vector3 screenPosition) {
return ViewCamera.WorldToScreenPoint(screenPosition);
}
/// <summary> 世界坐标转换视图坐标(0-1) </summary>
public virtual Vector3 WorldToViewPosition(Vector3 screenPosition) {
return ViewCamera.WorldToViewportPoint(screenPosition);
}
#endregion
#region 线
private Ray ray;
private RaycastHit hitInfo;
/// <summary> 屏幕坐标获取世界对象 </summary>
public virtual bool ScreenToWorldObject<T>(Vector3 screenPosition, out T value) where T : Object {
return ScreenToWorldObject(screenPosition, out value, DefaultLayerMask);
}
/// <summary> 屏幕坐标获取世界对象 </summary>
public virtual bool ScreenToWorldObject<T>(Vector3 screenPosition, out T value, LayerMask planeLayerMask) where T : Object {
ray = ViewCamera.ScreenPointToRay(screenPosition);
Physics.Raycast(ray, out hitInfo, 200, planeLayerMask);
value = hitInfo.transform?.GetComponent<T>();
return value != null;
}
/// <summary> 屏幕坐标获取世界对象的父对象 </summary>
public virtual bool ScreenToWorldObjectParent<T>(Vector3 screenPosition, out T value) where T : Object {
return ScreenToWorldObjectParent(screenPosition, out value, DefaultLayerMask);
}
/// <summary> 屏幕坐标获取世界对象的父对象 </summary>
public virtual bool ScreenToWorldObjectParent<T>(Vector3 screenPosition, out T value, LayerMask planeLayerMask) where T : Object {
ray = ViewCamera.ScreenPointToRay(screenPosition);
Physics.Raycast(ray, out hitInfo, 200, planeLayerMask);
value = hitInfo.transform?.GetComponentInParent<T>();
return value != null;
}
#endregion
protected virtual void Update() {
Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);
}
}
-21
View File
@@ -1,21 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 核心模块,实现业务逻辑
/// </summary>
public class ModuleCore : Module<ModuleCore> {
}
/// <summary>
/// 模块基类
/// </summary>
/// <typeparam name="ModuleCore"></typeparam>
public class Module<ModuleCore> where ModuleCore : Module<ModuleCore>, new() {
/// <summary> 模块单例 </summary>
public static ModuleCore I => Instantiate();
private static ModuleCore core;
private static ModuleCore Instantiate() => core == null ? core = new ModuleCore() : core;
}
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 9939a58498acfda448d6f494f52e8da4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,182 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
/// <summary>
/// Web请求执行模块
/// </summary>
public class ExecuteWebRequest : ModuleExecute<DataRequest> {
/// <summary> 发送请求 </summary>
public void Execute(DataRequest request) {
if (request.RequestType == WebRequestType.GET) { Get(request); }
if (request.RequestType == WebRequestType.PostForm) { PostForm(request); }
if (request.RequestType == WebRequestType.PostJson) { PostJson(request); }
if (request.RequestType == WebRequestType.Texture) { Texture(request); }
}
public static async void Get(DataRequest request) {
string url = request.Url;
using UnityWebRequest web = UnityWebRequest.Get(url);
await web.SendWebRequest();
bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success;
request.RequestResultHandle(isDone, web.downloadHandler);
}
public static async void PostForm(DataRequest request) {
string url = request.Url;
WWWForm form = request.Form;
using UnityWebRequest web = UnityWebRequest.Post(url, form);
await web.SendWebRequest();
bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success;
request.RequestResultHandle(isDone, web.downloadHandler);
}
public static async void PostJson(DataRequest request) {
string url = request.Url;
string json = request.Json;
byte[] postBytes = System.Text.Encoding.Default.GetBytes(json);
#if UNITY_2022
using UnityWebRequest web = UnityWebRequest.PostWwwForm(url, "POST");
#else
using UnityWebRequest web = UnityWebRequest.Post(url, "POST");
#endif
web.uploadHandler.Dispose();
web.uploadHandler = new UploadHandlerRaw(postBytes);
web.SetRequestHeader("Content-Type", "application/json");
await web.SendWebRequest();
bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success;
request.RequestResultHandle(isDone, web.downloadHandler);
}
public static async void Texture(DataRequest request) {
string url = request.Url;
using UnityWebRequest web = UnityWebRequestTexture.GetTexture(url);
await web.SendWebRequest();
bool isDone = web.isDone && web.result == UnityWebRequest.Result.Success;
request.RequestResultHandle(isDone, web.downloadHandler);
}
}
/// <summary>
/// Web请求执行模块工具
/// </summary>
public static class ExecuteWebRequestTool {
public static TaskAwaiter<object> GetAwaiter(this UnityWebRequestAsyncOperation op) {
var tcs = new TaskCompletionSource<object>();
op.completed += (obj) => { tcs.SetResult(null); };
return tcs.Task.GetAwaiter();
}
}
/// <summary>
/// Web请求类型
/// </summary>
public enum WebRequestType {
/// <summary> GET </summary>
GET = 0,
/// <summary> POST 表单 </summary>
PostForm = 1,
/// <summary> POST Json </summary>
PostJson = 2,
/// <summary> GET 获取图片 </summary>
Texture = 3
}
/// <summary>
/// 请求数据
/// </summary>
public abstract class DataRequest {
/// <summary> Web请求地址 </summary>
public abstract string Url { get; }
/// <summary> Web请求类型 </summary>
public abstract WebRequestType RequestType { get; }
/// <summary> 提交json数据 </summary>
public virtual string Json { get; }
/// <summary> 提交Form表单数据 </summary>
public virtual WWWForm Form { get; }
/// <summary> Web请求结果处理 </summary>
public abstract void RequestResultHandle(bool isDone, DownloadHandler downloadHandler);
}
/// <summary>
/// Get请求数据
/// </summary>
public class DataRequestGet : DataRequest {
public readonly string url;
public Action<string> OnError;
public Action<string> OnCallback;
public override string Url => url;
public override WebRequestType RequestType => WebRequestType.GET;
/// <summary> Web Get请求数据 </summary>
public DataRequestGet(string url, Action<string> OnCallback = null) {
this.url = url;
this.OnCallback = OnCallback;
}
public override void RequestResultHandle(bool isDone, DownloadHandler downloadHandler) {
if (!isDone) { OnError?.Invoke(downloadHandler.text); return; }
OnCallback?.Invoke(downloadHandler.text);
}
}
/// <summary>
/// Post请求数据
/// </summary>
public class DataRequestPost : DataRequest {
public readonly string url;
public readonly string json;
public readonly WWWForm form;
public readonly WebRequestType type;
public Action<string> OnError;
public Action<string> OnCallback;
public override string Url => url;
public override WebRequestType RequestType => type;
public override string Json => json;
public override WWWForm Form => form;
/// <summary> Web Post请求 提交json数据 </summary>
public DataRequestPost(string url, string json, Action<string> OnCallback = null) {
this.url = url;
this.json = json;
this.OnCallback = OnCallback;
type = WebRequestType.PostJson;
}
/// <summary> Web Post请求 提交WWWForm数据 </summary>
public DataRequestPost(string url, WWWForm form, Action<string> OnCallback = null) {
this.url = url;
this.form = form;
this.OnCallback = OnCallback;
type = WebRequestType.PostForm;
}
public override void RequestResultHandle(bool isDone, DownloadHandler downloadHandler) {
if (!isDone) { OnError?.Invoke(downloadHandler.text); return; }
OnCallback?.Invoke(downloadHandler.text);
}
}
/// <summary>
/// Get下载 Texture
/// </summary>
public class DataRequestTexture : DataRequest {
public readonly string url;
public Action<string> OnError;
public Action<Texture2D> OnCallback;
public override string Url => url;
public override WebRequestType RequestType => WebRequestType.Texture;
/// <summary> Web Get请求 Texture </summary>
public DataRequestTexture(string url, Action<Texture2D> OnCallback = null) {
this.url = url;
this.OnCallback = OnCallback;
}
public override void RequestResultHandle(bool isDone, DownloadHandler downloadHandler) {
if (!isDone) { OnError?.Invoke(downloadHandler.text); return; }
DownloadHandlerTexture dht = downloadHandler as DownloadHandlerTexture;
OnCallback?.Invoke(dht.texture);
}
}
@@ -1,11 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 执行模块
/// </summary>
public interface ModuleExecute<Data> {
/// <summary> 执行 </summary>
public void Execute(Data data);
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 4661df0b8dac9f640a09daa01cac9ea1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b0dab98b9033323428c3db1f2c7946c0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,11 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 场景中的固定模块
/// </summary>
public abstract class ModuleFixed : MonoBehaviour {
/// <summary> 核心模块 </summary>
protected virtual ModuleCore ModuleCore => ModuleCore.I;
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 529fed83b6e5fff43b7bdf3eca7dbd0e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ce17d4a855942e747b3a1a85af3fbf7b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,24 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 数据处理器模块
/// </summary>
public class ModuleHandle<Data> {
/// <summary> 数据 </summary>
protected Data value;
/// <summary> 当前数据 </summary>
public virtual Data Current => value;
/// <summary> 当前数据是否有效 </summary>
public virtual bool IsValid => Current != null;
/// <summary> 改变当前数据 Event </summary>
public virtual event Action<Data> OnChange;
/// <summary> 改变当前数据 </summary>
public virtual void Change() => OnChange?.Invoke(value);
/// <summary> 改变当前数据 </summary>
public virtual void Change(Data value) { this.value = value; OnChange?.Invoke(value); }
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 73ab810e12f76f449ba3e6351467ebcb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b8989716a20d28b4180f6cceee0898f7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,16 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 预制件模块
/// </summary>
public abstract class ModulePrefab<Data> : MonoBehaviour {
/// <summary> 关联的数据 </summary>
protected Data value;
/// <summary> 关联的数据 </summary>
public virtual Data Value => value;
/// <summary> 更新可视化内容 </summary>
public virtual void UpdateVisual(Data value) => this.value = value;
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 84ffbf591cb4c0e4483f5c577ba37d68
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: fcb15023389a9c141b1b07fe53f06e5c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,31 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 单例模块
/// </summary>
public abstract class ModuleSingle<T> : MonoBehaviour where T : ModuleSingle<T> {
/// <summary> 模块单例 </summary>
public static T I => instance;
/// <summary> 模块单例 </summary>
protected static T instance;
/// <summary> 核心模块 </summary>
protected virtual ModuleCore ModuleCore => ModuleCore.I;
/// <summary> 初始化 </summary>
protected abstract void Awake();
/// <summary> 替换 </summary>
protected virtual void Replace(bool isDontDestroy = true) {
if (instance != null) { Destroy(instance.gameObject); }
instance = (T)this;
if (isDontDestroy) { DontDestroyOnLoad(gameObject); }
}
/// <summary> 不替换 </summary>
protected virtual void NoReplace(bool isDontDestroy = true) {
if (isDontDestroy) { DontDestroyOnLoad(gameObject); }
if (instance == null) { instance = (T)this; }
else { Destroy(gameObject); }
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 121ca341c2100df4b94d707ed24452f5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 3161d7f50e461bf4896cdd13d8b508be
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-35
View File
@@ -1,35 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
/// <summary>json解析与保存</summary>
public static class JsonTool {
/// <summary> 内部包装类 </summary>
private class Pack<T> { public T data; }
/// <summary> 把对象转换为Json字符串 </summary>
/// <param name="obj">对象</param>
public static string ToJson<T>(T obj) {
if (obj == null) return "null";
if (obj.GetType().GetInterface("IList") != null) {
Pack<T> pack = new Pack<T>();
pack.data = obj;
string json = JsonUtility.ToJson(pack);
return json.Substring(8, json.Length - 9);
}
return JsonUtility.ToJson(obj);
}
/// <summary> 解析Json </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="json">Json字符串</param>
public static T FromJson<T>(string json) {
if (json == "null" && typeof(T).IsClass) return default(T);
if (typeof(T).GetInterface("IList") != null) {
json = "{\"data\":{data}}".Replace("{data}", json);
Pack<T> Pack = JsonUtility.FromJson<Pack<T>>(json);
return Pack.data;
}
return JsonUtility.FromJson<T>(json);
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 007e3acdca87e1b49b38f504938206cb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,17 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 图层遮罩工具
/// </summary>
public static class LayerMaskTool {
///// <summary> 板片 </summary>
//public static readonly LayerMask Plate = 1 << LayerMask.NameToLayer("Plate");
///// <summary> 形状 </summary>
//public static readonly LayerMask Shape = 1 << LayerMask.NameToLayer("Shape");
///// <summary> 安排点 </summary>
//public static readonly LayerMask Arrange = 1 << LayerMask.NameToLayer("Arrange");
///// <summary> 模特 </summary>
//public static readonly LayerMask Model = 1 << LayerMask.NameToLayer("Model");
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d32659481db1a124c9b564f885ee75a8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 6f35188dbbe4cee4b823e88d78deef5a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,30 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 生成可视化内容模块
/// </summary>
public interface ModuleVisual<Data> {
/// <summary> 更新可视化内容 </summary>
public void UpdateVisual(Data data);
/// <summary> 释放可视化内容 </summary>
public void ReleaseVisual(Data data);
}
/// <summary>
/// 生成可视化内容模块工具
/// </summary>
public static class VisualTool {
/// <summary> 创建可视化内容 </summary>
public static void Create<T>(ref T value, Transform original, Transform parent) {
if (value != null) { return; }
Transform temp = CreateTransform(original, parent);
value = temp.GetComponent<T>();
}
/// <summary> 创建Transform </summary>
public static Transform CreateTransform(Transform original, Transform parent) {
Transform temp = Transform.Instantiate(original, parent);
temp.gameObject.SetActive(true);
return temp;
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 1681bcfa66dacbd4e810d15939fa7e04
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 1dd7861df30473e4380411dd72fc32c3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
/// <summary>
/// 文档模块
/// </summary>
public abstract class ModuleDocument : MonoBehaviour {
/// <summary> 绑定文档 </summary>
public UIDocument document;
/// <summary> 根目录文档 </summary>
public VisualElement root => document.rootVisualElement;
/// <summary> 核心模块 </summary>
protected virtual ModuleCore ModuleCore => ModuleCore.I;
/// <summary> 添加UI元素 </summary>
public void Add(VisualElement child) => root.Add(child);
/// <summary> 查询UI元素 </summary>
public T Q<T>(string name = null, string className = null) where T : VisualElement => root.Q<T>(name, className);
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: e65ff460c221dd142a18c295f562ac80
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5213b7240a67ca7489050d7d0bc8a935
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,36 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
/// <summary>
/// UI项
/// </summary>
public abstract class ModuleUIItem<Data> : ModuleUIPanel {
/// <summary> 绑定的数据 </summary>
public readonly Data value;
/// <summary> UI项 </summary>
public ModuleUIItem(Data value, VisualElement element) : base(element) {
this.value = value;
OnSelect += UnitUIPanelItem_OnSelect;
}
/// <summary> 侦听选择事件 </summary>
public virtual void UnitUIPanelItem_OnSelect(Data obj) {
if (value.Equals(obj)) { SelectState(); }
else { DefaultState(); }
}
/// <summary> 选择事件 </summary>
public static event Action<Data> OnSelect;
/// <summary> 触发事件 </summary>
public static void Select(Data data) => OnSelect?.Invoke(data);
/// <summary> 触发选择事件 </summary>
public virtual void Select() => OnSelect?.Invoke(value);
/// <summary> 默认状态 </summary>
public virtual void DefaultState() { }
/// <summary> 选中状态 </summary>
public virtual void SelectState() { }
/// <summary> 释放 </summary>
public virtual void Release() => OnSelect -= UnitUIPanelItem_OnSelect;
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 6b31786a09cb95646a3068a93ad21834
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b27b5ad3c5e2b1f4bb02957f1388fc49
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,17 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
/// <summary>
/// UI页面
/// </summary>
public abstract class ModuleUIPage : MonoBehaviour {
/// <summary> 绑定的页面 </summary>
public ModuleDocument document;
/// <summary> 核心模块 </summary>
protected virtual ModuleCore ModuleCore => ModuleCore.I;
/// <summary> 绑定的根元素 </summary>
public abstract VisualElement Element { get; }
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 111d6ab3c7a28a2449502de7f9804ca3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 13ff0e5edf2a0e74098836968a2ea47e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,16 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
/// <summary>
/// UI控件
/// </summary>
public class ModuleUIPanel {
/// <summary> 核心模块 </summary>
protected virtual ModuleCore ModuleCore => ModuleCore.I;
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
/// <summary> UI控件 </summary>
public ModuleUIPanel(VisualElement element) => this.element = element;
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 9585f762b800e57488473c776cc49fa5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 255179b9440614542b26d46561680a31
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -2,17 +2,18 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
namespace MuHua {
public abstract class Character : MonoBehaviour {
}
public Movement movement; // 运动控制器
public Animator animator; // 动画控制器
// Update is called once per frame
void Update()
{
/// <summary> 更新移动 </summary>
public abstract bool UpdateMove(Vector3 position);
/// <summary> 动画触发 </summary>
public abstract void AnimationTrigger(string value);
/// <summary> 动画结束 </summary>
public abstract void AnimationEnd();
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c045b08c6480e344493104ad36e0db40
guid: 91660569267b53545ab6e688c384eae2
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -2,36 +2,40 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua
{
public abstract class Machine : MonoBehaviour
{
namespace MuHua {
/// <summary>
/// 有限状态机
/// </summary>
public abstract class Machine : Character {
protected MachineState currentState;
protected Dictionary<string, MachineState> states = new Dictionary<string, MachineState>();
protected virtual void Start() => InitializeStates();
protected virtual void Update() => currentState?.Update();
#region
protected abstract void InitializeStates();
protected virtual void RegisterState(string stateType, MachineState state)
{
protected virtual void RegisterState(string stateType, MachineState state) {
if (!states.ContainsKey(stateType)) { states.Add(stateType, state); }
}
public virtual void ChangeState(string stateType)
{
if (states.ContainsKey(stateType))
{
public virtual void ChangeState(string stateType) {
if (states.ContainsKey(stateType)) {
currentState?.Exit();
currentState = states[stateType];
currentState.Enter();
}
else
{
else {
Debug.LogWarning($"State {stateType} is not registered.");
}
}
#endregion
public override bool UpdateMove(Vector3 position) {
return movement.UpdateMove(position);
}
public override void AnimationTrigger(string value) {
throw new System.NotImplementedException();
}
public override void AnimationEnd() => currentState?.Trigger();
}
}
@@ -0,0 +1,23 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
/// <summary>
/// 状态接口
/// </summary>
public abstract class MachineState {
protected readonly Machine machine;
public MachineState(Machine machine) => this.machine = machine;
/// <summary> 进入状态 </summary>
public abstract void Enter();
/// <summary> 更新状态 </summary>
public abstract void Update();
/// <summary> 退出状态 </summary>
public abstract void Exit();
/// <summary> 触发状态 </summary>
public abstract void Trigger();
}
}
@@ -0,0 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
public class PlayerController : Character {
public override bool UpdateMove(Vector3 position) {
return movement.UpdateMove(position);
}
public override void AnimationTrigger(string value) {
throw new System.NotImplementedException();
}
public override void AnimationEnd() {
throw new System.NotImplementedException();
}
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 96fa067856f57984e975772061a248ca
guid: 73bafdf07b08fc246ab173a5e555629e
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 060f769c3cafe9443afbe1ad7dca0ed3
guid: 7cd21ba4756d406468a37fe882d097ae
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -0,0 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
public abstract class EffectsLaunch : MonoBehaviour {
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 8f795d0a53fb35641be9b8bc9aab0f58
guid: 36eaafdfeb2c4f44f82504e36afe1cda
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: cef6cef9eda7f6340ac1cea1203e223a
guid: a359f8431aa19b846b623d9dd066bae3
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -0,0 +1,19 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
/// <summary>
/// 运动控制器
/// </summary>
public abstract class Movement : MonoBehaviour {
public float moveSpeed = 5.0f; // 最大移动速度
public float acceleration = 20.0f; // 加速度
public float currentSpeed = 0.0f; // 当前速度
public Vector3 front; // 面向
public abstract bool UpdateMove(Vector3 position);
public abstract Vector3 RandomTargetPosition();
public abstract void StopMoving();
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b61954fdf7766ae4eba3f4b79c307057
guid: d034bee659058394d8641aad1f9e7023
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -0,0 +1,17 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
public class MovementNavigation : MonoBehaviour {
// Start is called before the first frame update
void Start() {
}
// Update is called once per frame
void Update() {
}
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 031fdf250828c30419ed1a945eb538f8
guid: 9eb06e286a5289a439f220c0a3656568
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -0,0 +1,52 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
/// <summary>
/// 标准运动实现
/// </summary>
public class MovementStandard : Movement {
public override bool UpdateMove(Vector3 position) {
// 计算相对于世界坐标系的移动方向
Vector3 moveDirection = (position - transform.position).normalized;
float distance = Vector3.Distance(transform.position, position);
// 平滑加速和减速
currentSpeed = distance > 0.2f
? Mathf.MoveTowards(currentSpeed, moveSpeed, acceleration * Time.deltaTime)
: Mathf.MoveTowards(currentSpeed, 0, acceleration * Time.deltaTime);
// 移动玩家
transform.Translate(moveDirection * currentSpeed * Time.deltaTime, Space.World);
// 如果有移动输入,则更新玩家的朝向
if (distance != 0) {
Quaternion toRotation = Quaternion.LookRotation(moveDirection, Vector3.up);
transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, moveSpeed * Time.deltaTime * 100);
}
// 计算转向向量
Vector3 localMoveDirection = transform.InverseTransformDirection(moveDirection * currentSpeed);
localMoveDirection = localMoveDirection.normalized;
// 对localMoveDirection的x和z进行分类处理
float moveX = Convert.ToInt32(localMoveDirection.x);
float moveZ = Convert.ToInt32(localMoveDirection.z);
front = new Vector3(moveX, 0, moveZ);
// 如果到达目标位置,返回 true
distance = Vector3.Distance(transform.position, position);
return distance < 0.05f;
}
public override Vector3 RandomTargetPosition() {
float randomX = UnityEngine.Random.Range(-10.0f, 10.0f);
float randomZ = UnityEngine.Random.Range(-10.0f, 10.0f);
return transform.position + new Vector3(randomX, 0, randomZ);
}
public override void StopMoving() {
currentSpeed = 0;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 699b617ae51a79a4390529e4e03405a2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,3 @@
{
"name": "MuHua.Character"
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 856a56044e2bfce4dbc2d22bfb5a926f
guid: f71c71a343ef5c8459a9f7773cc07460
AssemblyDefinitionImporter:
externalObjects: {}
userData:
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 486ec7d219c795b4f82614d02f4e8e58
guid: 1c84ca502025179419c2b8afb29080aa
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -0,0 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
public abstract class VisualField : MonoBehaviour {
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e4d36e9e525a8a7429e5a7d9edf17cb2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
public abstract class VisualFieldStandard : VisualField {
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3595d54d26ddd5c47b4d4a3025935ecb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: abc53960d2470184c807cea21744653e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-17
View File
@@ -1,17 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua
{
public abstract class MachineState
{
protected Machine machine;
public MachineState(Machine machine) => this.machine = machine;
public abstract void Enter();
public abstract void Update();
public abstract void Exit();
}
}
-14
View File
@@ -1,14 +0,0 @@
{
"name": "MuHua.FSM",
"rootNamespace": "",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 3e92c6f04caccae40bb8e24b5307132d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-18
View File
@@ -1,18 +0,0 @@
{
"name": "muhua-fsm",
"version": "1.0.0",
"displayName": "MuHua FSM",
"description": "FiniteStateMachine\u6709\u9650\u72b6\u6001\u673a\u6846\u67b6",
"author": {
"name": "MuHua",
"email": "muhua233@qq.com"
},
"type": "tool",
"samples": [
{
"displayName": "示例",
"description": "",
"path": "Samples"
}
]
}
-7
View File
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: ab0f2027431743d43afe689084dcd33c
PackageManifestImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 004a039923c4e3845b77cdbaae4fae09
guid: 1a2850bc9ac8725479e46f5d43a2304c
DefaultImporter:
externalObjects: {}
userData:
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: f76a1c2d2c424dd4a9bbb9ddf5f95eb9
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-6
View File
@@ -221,12 +221,6 @@
"source": "embedded",
"dependencies": {}
},
"muhua-fsm": {
"version": "file:FSM",
"depth": 0,
"source": "embedded",
"dependencies": {}
},
"muhua-label-follow": {
"version": "file:LabelFollow",
"depth": 0,