# UnityTools **Repository Path**: gooses_edu/unity-tools ## Basic Information - **Project Name**: UnityTools - **Description**: Unity小工具 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-08-02 - **Last Updated**: 2023-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # UnityTools ## 介绍 Unity工具合集,一个超轻度,无插件依赖的工具集 工具合集中大致分为两类【工具集】【小工具集】 ### 对照表 | 类型 | 工具 | 小工具 | ----- | ----- | ----- | | 拓展性| 具有一定拓展性 | 不具有拓展性| | 使用方式 | 多个类配合使用 | 单例类的某个方法| | 脚本数量| 多个脚本 | 单个脚本| | 依赖| 可能依赖小工具集中的某些功能 | 无依赖 | ## 工具 > 所有的Manager为单例类,继承自【小工具集】中的单例模板 > ### **AudioManager(声音管理)** >声音管理器 ### **GMManager(GM管理)** >GM指令管理器,用于游戏测试的指令操作工具 > ##### 结构图 ![](ReadMePic/GMManager.png) ##### 使用方法 ````c# public class GMSub_Test : GMClassBase { [GMCommond("userId", "userId|显示玩家Id")] public string ShowId(string[] args) { string userId = args[1]; return $"userId = {userId}"; } } public class GMTest : MonoBehaviour { private void Start() { //启动GM GMManager.Instance.Invoke(); } } ```` ##### 效果图 按下‘~’键打开命令框 ![](ReadMePic/GM_Test.png) ### **LogManager(日志管理)** >日志管理器 ### **ObjectPool(对象池)** >帮助开发者快速实现对象池 #### 结构图 ![](ReadMePic/ObjectPool.png) #### 使用方法 有两种使用方式,一种是纯净版:继承ObjectPool生成新类,通过重写自定义实例化对象池要素的方法 ````C# public class CubePool : ObjectPool { public GameObject cubePrefab; public Transform root; protected override CubeItem CreateInstance() { var item = Object.Instantiate(cubePrefab,root).GetComponent(); item.gameObject.SetActive(true); return item; } } ```` 实现IObjectItem接口实现自定义的事件监听,可以酌情使用partial关键字,更清晰一点 ````c# public partial class CubeItem : IObjectPoolItem { public void OnBeforeRent() { curLifeTime = totalLifeTime; gameObject.SetActive(true); } public void OnBeforeReturn() { gameObject.SetActive(false); } public void OnRelease() { Destroy(gameObject); } public void OnCreate() { curLifeTime = totalLifeTime; } } ```` 另一种用法是直接使用GameObjectPool和GameObjectPoolItem,简单方便 ````C# private void InitRedCubePool() { GameObjectPool redCubePool = new GameObjectPool();//声明对象池 redCubePool.itemParent = layout;//设置父物体 redCubePool.itemPrefab = redCubeItem;//设置元素预制体 redCubePool.autoReturnTime = 1;//设置自动回收事件 redCubePool.maxSize = 20;//设置最大容量 createOne_red.onClick.AddListener(() => { redCubePool.RentObject(); }); recycleAll_red.onClick.AddListener(() => { redCubePool.ReturnAll(); }); destroyAll_red.onClick.AddListener(() => { redCubePool.ReleaseAll(); }); } ```` 详细使用方法可以参考项目中的示例 ### **SaveManager(存档管理)** >存档管理器 #### 结构图 ![](ReadMePic/LitSave.png) #### 使用方法 ````c# //数据类 public class TestData : SaveData { public override string SaveKey => "TestData"; public int money = 0; public override TestData GetDefaultValue() { TestData td = new TestData(); td.money = 100; return td; } } //客户端 public class Client { public TestData data; private void Init() { SaveManager.Instance.SetSaveBehaviour(newCustomFileSave(),10); TestData td = SaveManager.Instance.LoadData(); //使用 Debug.Log(td.money); //修改 td.money = 0; td.SaveData(); Debug.Log(td.monty); } } ```` ### Observer 观察器 >用于对游戏中物体的生命周期,物理碰撞,鼠标点击等事件进行监听 #### 观察期列表 | 脚本| 描述 | 功能 | | ----- | ------ | ----- | | Collider2DObserver | 2D碰撞器观察器 | 监听2D碰撞器的Enter、Stay、Exit | | ColliderObserver | 3D碰撞器观察器 | 监听3D碰撞器的Enter、Stay、Exit | | DragObserver | 拖拽观察器 | 监听2D碰撞器的Enter、Stay、Exit | | LifeTimeObserver | 生命周期观察器 | 监听生命周期的Awake、Start、FixedUpdate、Update、LateUpdate、OnDisable、OnDestroy | | MouseClickObserver | 鼠标点击观察器 | 监听鼠标的Down、Up、UpAsButton | | MouseTriggerObserver | 鼠标触发观察器 | 监听鼠标的Enter、Over、Exit | | PointerEEObserver | PointerEnter和Exit观察器 | 监听Pointer的Enter、Exit | | PointerObserver | Pointer点击观察器 | 监听Pointer的Click、Down、Up | | Trigger2DObserver | 2D触发器观察器 | 监听2D触发器的Enter、Stay、Exit | | TriggerObserver | 3D触发器观察器 | 监听3D触发器的Enter、Stay、Exit | #### 使用方法 ````c# //监听目标 [SerializeField] private Collider observableTarget; private void InitObservable() { //添加CollisionEnter事件 observableTarget.AddCollisionEnter(OnCollisionEnterTest); //移除CollisionEnter事件 //go.SubCollisionEnter(OnCollisionEnterTest); //清空CollisionEnter事件 //go.ClearCollisionEnter(); } //日志测试方法 private void OnCollisionEnterTest(Collision col) { Debug.Log(col.gameObject.name); } ```` ### 有限状态机 >Unity中实现有限状态机,可用于游戏流程控制或AI的制作 #### 结构图 ![](ReadMePic/FSM.png) #### 使用示例(关于详细使用方法,请参照工程内的示例) ````c# private void Start() { //状态机 cubeStateMechine = new StateMechine(); //状态 CubeMoveState moveState = new CubeMoveState(); moveState.cube = gameObject; CubeIdleState idleState = new CubeIdleState(); idleState.cube = gameObject; //转化器 MoveToIdle moveToIdle = new MoveToIdle(); moveToIdle.Init(cubeStateMechine, moveState, idleState); IdleToMove idleToMove = new IdleToMove(); idleToMove.Init(cubeStateMechine, idleState, moveState); //添加状态和转化器 cubeStateMechine.AddState(moveState); cubeStateMechine.AddState(idleState); cubeStateMechine.AddTranslater(moveToIdle); cubeStateMechine.AddTranslater(idleToMove); //运行状态机 cubeStateMechine.Play(idleState); } ```` ## 小工具 ### **SingleTon(单例模板)** >单例模板,快速实现单例模式 ### **CreateScriptUtility(脚本创建工具)** >用于编辑器模式下脚本的创建,可以通过字符串创建脚本文件 ### **FPSUtility(帧率工具)** >用于实时计算、获取、显示游戏内的帧率 #### 属性表 |属性|用法|说明| |-----|-----|-----| |FPS|FPSUtility.Instance.FPS|用于获取当前游戏的帧率| |ShowGUI|FPSUtility.Instance.ShowGUI|可以通过修改属性为True/False控制帧数的显示(使用GUI显示)| #### 方法表 |方法|用法|说明| |-----|-----|-----| |StartCalc|FPSUtility.Instance.StartCalc(0.1f)|用于获取当前游戏的帧率| |StopCals|FPSUtility.Instance.StopCals()|调用方法停止帧率计算| ### **TimeUtility(时间工具)** >时间管理工具,可以快速实现【时间戳管理】【帧/时间延迟】【帧/时间计时器】 #### 方法表 |方法|用法|说明| |-----|-----|-----| |AddTimeStamp|FPSUtility.Instance.AddTimeStamp("test")|添加时间戳| |GetTimeStamp|FPSUtility.Instance.GetTimeStampByKey("test")|获取当前时间到上次设置位置的时间戳| |SetFrameDely|FPSUtility.Instance.SetFrameDely(1,delyAct)|延迟一帧执行delyAct| |SetTimeDely|FPSUtility.Instance.SetTimeDely(1,delyAct)|延迟一秒执行delyAct| ## 补充说明 ### 命名规范 LitTools - 所有工具的公用命名空间 LitToolsTest - 工具的使用示例所在命名空间 LitTools/LitXXX - 工具类的Menu菜单结构 LitAssets/LitXXX - 一些工具类需要配置文件等资源的创建目录