1
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3161d7f50e461bf4896cdd13d8b508be
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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 {
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
public Movement movement; // 运动控制器
|
||||
public Animator animator; // 动画控制器
|
||||
|
||||
/// <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: {}
|
||||
+20
-16
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abc53960d2470184c807cea21744653e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"name": "MuHua.FSM",
|
||||
"rootNamespace": "",
|
||||
"references": [],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3e92c6f04caccae40bb8e24b5307132d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ab0f2027431743d43afe689084dcd33c
|
||||
PackageManifestImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1
-1
@@ -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:
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user