# HKUnityTools **Repository Path**: WuNanXiang/hk_-unity-tools ## Basic Information - **Project Name**: HKUnityTools - **Description**: Unity的工具集(基于QFramework和Dotween) - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 17 - **Created**: 2024-02-14 - **Last Updated**: 2024-02-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HKUnityTools介绍: 团队在Unity项目中积累的工具集,包含两部分:编辑器功能、运行时功能。目的在于优化团队制作及开发的工作流,以及减少相关制作和开发的工作量。
本项目部分模块依赖于:**Dotween**和**QFramework**,如有问题可联系:QQ 511919078
**(号外号外!团队在青岛,主要做VR、AR、MR、虚拟仿真项目,目前招开发小伙伴,有意向的可发私信或QQ!)**
# 运行时功能: ## 1. HK_FreeCam: **功能描述:** + 漫游摄像机控制脚本,主要用于场景编辑、开发期间,测试观察使用; + 运行时可通过鼠标键盘,控制相机移动、旋转、缩放,方便开发及制作人员对场景进行自由观察; + 开发测试结束后可直接将该组件移除; **使用方式:** + 将该脚本添加到Main Camera上,点击运行后即可使用; + 按住WASD键进行前后左右移动,QE键进行上下移动; + 按住鼠标右键进行视角旋转; + 按住Shift进行位移加速; + 按住鼠标右键,旋转视角; + 滚动鼠标滚轮,视野缩放; **外部依赖:** + 无
--- ## 2. HK_TargetCam(引入了QF框架): **功能描述:** + Camera多目标切换管理工具,可在三维可视化项目中控制Camera在多个Target之间切换; + Target分为三种:RotTarget、AreaTarget、FollowTarget; + 切换至RotTarget目标点后,相机可围绕Target进行旋转、缩放操作; + 切换至AreaTarget目标点后,相机可在Target标识区域进行前后左右平移、缩放操作; + 切换至FollowTarget目标点后,相机可跟随目标点移动,且可围绕移动的Target进行旋转、缩放操作; + 可根据Target的枚举值进行切换,切换时可更改Camera缩放速度、移动速度、切换的延时时间、切换后是否锁住相机等; + TargetCamera下有个Mask子物体,其材质球为 BuildIn 渲染管线,若用URP或HDRP渲染管线,需手动调整Mask的shader。 **使用方式:** + 在当前项目的 Architecture 中注册 IHK_TargetCamSystem; ```csharp public class HKTargetCam_Architecture : Architecture { protected override void Init() { this.RegisterSystem(new HK_TargetCamSystem()); } } ``` + 将 HK_TargetCamController 脚本中的 Architecture 修改为当前项目的 Architecture; ```csharp public class HK_TargetCamController : MonoBehaviour, IController { public IArchitecture GetArchitecture() { return HKTargetCam_Architecture.Interface; } } ``` + 删除场景中默认的Main Camera,将 TargetCamera 预设体,拖入场景中; + 在 Scene视窗右上角,开启Gizmos单选按钮(本工具可视化编辑是基于Gizmos绘制的); ![Image text](https://gitee.com/JingChanChangFan/hk_-unity-tools/raw/master/READMEIMG/TargetGizmos.png) + 根据需求,在当前场景中添加 RotTarget、AreaTarget、FollowTarget(可将预设体拖入场景中进行编辑); + 编辑 HK_RotTarget、HK_AreaTarget、HK_FollowTarget 等组件的枚举标记(TargetEnum),该属性是本工具最重要的属性之一,相机通过判断该属性进行切换,请确保该属性在当前场景的唯一性,若存在重复,则将提示警告; ![Image text](https://gitee.com/JingChanChangFan/hk_-unity-tools/raw/master/READMEIMG/TargetEnum.png) + 编辑 HK_RotTarget、HK_AreaTarget、HK_FollowTarget 等组件的其他属性:FOV、默认距离等; + 调整 TargetCamera 物体上的 HK_TargetCamera 组件,对其进行初始化参数编辑; + 若 HK_TargetCamera 组件指定了 initTarget (初始化目标点),则运行后 TargetCamera 会自动转换到 initTarget 对应的目标; + 运行时,可发送 **CMD_SetDefaultSpeed** 指令(并传入对应参数)设置 Camera 默认的MoveSpeed(默认值为2)和ZoomSpeed(默认值为4); ```csharp // 设置相机默认的moveSpeed和zoomSpeed this.SendCommand(new CMD_SetDefaultSpeed(2, 4)); ``` + 运行时,可发送 **CMD_ChangeCamTarget** 指令(并传入对应参数)进行 Camera 目标切换; ```csharp // 相机切换至 RotTarget_01 this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01)); ``` + 可通过 **SetMoveSpeed** 链式方法,设置切换后相机的移动速度(否则为DefaultMoveSpeed数值); ```csharp // 相机切换至 RotTarget_01,切换后将相机的moveSpeed设为4 this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01).SetMoveSpeed(4)); ``` + 可通过 **SetZoomSpeed** 链式方法,设置切换后相机的缩放速度(否则为DefaultZoomSpeed数值); ```csharp // 相机切换至 RotTarget_01,切换后将相机的zoomSpeed设为4 this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01).SetZoomSpeed(4)); ``` + 可通过 **SetDelayTime** 链式方法,设置相机切换的延时时间; ```csharp // 延时1s后,相机切换至 RotTarget_01 this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01).SetDelayTime(1)); ``` + 可通过 **SetUsingFlash** 链式方法,设置相机切换为闪现方式(默认启用眨眼特效,若不启用则传入false); ```csharp // 相机切换至 RotTarget_01,使用闪现的方式 this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01).SetUsingFlash()); ``` + 可通过 **SetCamLock** 链式方法,设置切换后,是否锁住相机; ```csharp // 相机切换至 RotTarget_01,且切换后锁住相机 this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01).SetCamLock()); ``` + 可订阅事件,在摄像机目标切换前后进行响应: + 订阅 **Event_SwitchTargetBegin** 事件,当目标切换开始时接受到该事件; + 订阅 **Event_SwitchTargetEnd** 事件,当目标切换完成后接受到该事件; + 具体用法,可参考 Test_UseTargetCam 脚本。 ```csharp public class Test_UseTargetCam : HK_TargetCamController { [SerializeField] Transform testMoveNPC; [SerializeField] Text tips_Txt; void Start() { // 设置相机默认的moveSpeed和zoomSpeed this.SendCommand(new CMD_SetDefaultSpeed(2, 4)); // 注册 开始切换 Target 事件 this.RegisterEvent(args => { Debug.LogFormat("开始 切换至新目标,Target:{0}", args._targetEnum); }).UnRegisterWhenGameObjectDestroyed(gameObject); // 注册 完成切换 Target 事件 this.RegisterEvent(args => { Debug.LogFormat("完成 切换至新目标,Target:{0}", args._targetEnum); tips_Txt.text = string.Format("当前Camera目标为:{0}", args._targetEnum); }).UnRegisterWhenGameObjectDestroyed(gameObject); } void Update() { // 相机切换至 RotTarget_01 if (Input.GetKeyDown(KeyCode.Alpha1)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01)); } // 相机切换至 RotTarget_02,且切换后锁住相机 if (Input.GetKeyDown(KeyCode.Alpha2)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_02).SetCamLock()); } // 相机切换至 RotTarget_03,切换后将相机的zoomSpeed设为1 if (Input.GetKeyDown(KeyCode.Alpha3)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_03).SetZoomSpeed(1)); } // 延时1s后,相机切换至 RotTarget_04,切换后将相机的zoomSpeed设为8 if (Input.GetKeyDown(KeyCode.Alpha4)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_04).SetDelayTime(1).SetZoomSpeed(8)); } // 相机切换至 AreaTarget_01 if (Input.GetKeyDown(KeyCode.Alpha5)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.AreaTarget_01)); } // 相机切换至 AreaTarget_02,切换后将相机的moveSpeed设为4,将zoomSpeed设为10 if (Input.GetKeyDown(KeyCode.Alpha6)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.AreaTarget_02).SetMoveSpeed(4).SetZoomSpeed(10)); } // 相机切换至 FollowTarget_01 if (Input.GetKeyDown(KeyCode.Alpha7)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.FollowTarget_01)); /*---------------------测试-----------------*/ testMoveNPC.position = new Vector3(-15f, 1, 4.5f); testMoveNPC.DOMoveX(13f, 6f).SetEase(Ease.Linear).SetDelay(1f); /*------------------------------------------*/ } // 相机切换至 RotTarget_01,使用闪现的方式 if (Input.GetKeyDown(KeyCode.Q)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_01).SetUsingFlash()); } // 相机切换至 RotTarget_02,使用闪现的方式,且切换后锁住相机 if (Input.GetKeyDown(KeyCode.W)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_02).SetUsingFlash().SetCamLock()); } // 相机切换至 RotTarget_03,使用闪现的方式,切换后将相机的zoomSpeed设为1 if (Input.GetKeyDown(KeyCode.E)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_03).SetUsingFlash().SetZoomSpeed(1)); } // 延时1s后,相机切换至 RotTarget_04,使用闪现的方式,切换后将相机的zoomSpeed设为8 if (Input.GetKeyDown(KeyCode.R)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.RotTarget_04).SetUsingFlash(false).SetDelayTime(1).SetZoomSpeed(8)); } // 相机切换至 AreaTarget_01,使用闪现的方式 if (Input.GetKeyDown(KeyCode.T)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.AreaTarget_01).SetUsingFlash()); } // 相机切换至 AreaTarget_02,使用闪现的方式,切换后将相机的moveSpeed设为4,将zoomSpeed设为10 if (Input.GetKeyDown(KeyCode.Y)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.AreaTarget_02).SetUsingFlash(true).SetMoveSpeed(4).SetZoomSpeed(10)); } // 相机切换至 FollowTarget_01,使用闪现的方式 if (Input.GetKeyDown(KeyCode.U)) { this.SendCommand(new CMD_ChangeCamTarget(HK_TargetEnum.FollowTarget_01).SetUsingFlash(true)); /*---------------------测试-----------------*/ testMoveNPC.position = new Vector3(-15f, 1, 4.5f); testMoveNPC.DOMoveX(13f, 6f).SetEase(Ease.Linear).SetDelay(1f); /*------------------------------------------*/ } } } ``` --- **外部依赖:** * Dotween
*** ## 3. HK_RoamingCam(引入了QF框架): **功能描述:** + PC端、WebGL端、Android端虚拟展厅类体验相机控制管理工具; + 支持通过鼠标点击、手指触摸两种方式进行交互; + 视角控制分为:第一人称漫游、三维俯视漫游、鸟瞰正交漫游三种模式; + 第一人称漫游(RoamView):通过点击地面标识点进行位移(依赖Unity Navigation); + 鸟瞰正交漫游(BirdView):上帝视角进行观察,相机为 Orthographic + 三维俯视漫游(ThreeDView):上帝视角进行观察,相机为 Perspective **使用方式:** + 在本项目的 Architecture 中注册 IHK_RoamingCamSystem; + 将 HK_RoamingCamController 中的 Architecture 修改为本项目的 Architecture; + 在场景中设置好Navigation Static,并进行 Navigation烘焙,生成合适的NavMesh; + 在场景中指定 RoamView 使用的 Point点位(附带HK_Point脚本),并设置好LookAtType; + 在场景中指定好 BirdView和ThreeDView 使用的 OverlookPos及RotAroundTarget; + 将HK_RoamPlayer预设体放入场景中,并进行初始化设置; + 具体用法,可参考Test_UIRoamCamCtrl 脚本; **外部依赖:** + Dotween *** ## 4. HK_FirstPersonCam(引入了QF框架) **功能描述:** + PC端的第一人称视角控制相机; + 支持通过鼠标、键盘进行第一人称角色控制; **使用方式:** + 在本项目的 Architecture 中注册 IHK_FirstPersonCamSystem; + 将 HK_FirstPersonCamController 中的 Architecture 修改为本项目的 Architecture; + 将场景中需碰撞的物体(如地面等),设置好碰撞体,并设置好Layer; + 将 FirstPersonPlayer 预设体,拖入场景中; + 在 FirstPersonPlayer 预设体的 HK_FirstPersonCtrl 组件中,设置好 GroundMask 层级; + 设置完成后即可通过鼠标、键盘进行操控,按住鼠标右键控制角色旋转,按WASD键控制角色移动; + 在表现层脚本中通过发送 CMD_ChangeFirstPersonPos 指令(并传入对应参数),可根据目标切换位置; + 参考 Test_FirstPlayerCamChangePos 进行位置切换设置; **外部依赖:** + Dotween *** ## 5. HK_SimpleTaskSystem(引入了QF框架): **功能描述:** + 简易任务管理系统(无外部配置方式,只可应用于线性任务流); + 本工具通过Enum定义“任务流”及“任务”,修改TaskQueueType和TaskType中的类型,对应自己的业务需求; **使用方式:** + 在应用本工具的应用层脚本,需引用命名空间**HKTools.SimpleTask**,本工具的脚本均放在该命名空间下;
```csharp using HKTools.SimpleTask; ``` + 在当前项目的 Architecture 中注册 IHK_SimpleTaskSystem; ```csharp public class HKSimpleTask_Architecture : Architecture { protected override void Init() { RegisterSystem(new HK_SimpleTaskSystem()); } } ``` + 本系统分两个层级:任务队列 TaskQueue 和任务 Task; + 初始化并开始任务流时候,使用**CMD_InitTaskQueue**指令; ```csharp taskList = new List { TaskType.步骤01_放置干扰天线支架, TaskType.步骤02_安装干扰天线, TaskType.步骤03_连接干扰天线与干扰源, TaskType.步骤04_放置抗干扰天线支架, TaskType.步骤05_安装抗干扰天线, }; // 初始化 任务流 STL_01 this.SendCommand(new CMD_InitTaskQueue(TaskQueueType.STL_01, taskList)); ``` + 完成当前任务时,使用**CMD_CompleteCurrentTask**指令(按顺序完成); ```csharp // 按顺序完成 当前任务 this.SendCommand(new CMD_CompleteCurrentTask(TaskQueueType.STL_01)); ``` + 使用**CMD_CompleteAppointTask**指令可通过TaskType来完成当前任务,但同样为顺序执行任务,没法跳过完成其他任务; ```csharp // 完成步骤1 this.SendCommand(new CMD_CompleteAppointTask(TaskQueueType.STL_01, TaskType.步骤01_放置干扰天线支架)); ``` + 需要打断并终止一个任务流时,使用**CMD_BreakUpTaskQueue**指令; ```csharp // 中断 任务流 STL_01 this.SendCommand(new CMD_BreakUpTaskQueue(TaskQueueType.STL_01)); ``` + 本工具对外提供如下5个事件,可在需要时进行注册使用(任务流开始事件、任务流结束事件、任务流中断事件、任务开始事件、任务完成事件) ```csharp // 注册 任务流开始 事件 this.RegisterEvent(args => { Debug.LogFormat("-------开始任务流:{0}--------", args._taskQueueType); }); // 注册 任务流结束 事件 this.RegisterEvent(args => { Debug.LogFormat("-------结束任务流:{0}--------", args._taskQueueType); }); // 注册 任务流中断 事件 this.RegisterEvent(args => { Debug.LogFormat("-------中断任务流:{0}--------", args._taskQueueType); }); // 注册 任务开始 事件 this.RegisterEvent(args => { Debug.LogFormat("TaskStart: {0}", args._taskType); }); // 注册 任务完成 事件 this.RegisterEvent(args => { Debug.LogFormat("TaskFinish: {0}", args._taskType); }); ``` + 具体用法,可参考 Test_UseSimpleTask 脚本。 ```csharp public class Test_UseSimpleTask : MonoBehaviour, IController { public IArchitecture GetArchitecture() { return HKSimpleTask_Architecture.Interface; } List taskList; void Update() { if (Input.GetKeyDown(KeyCode.F1)) { taskList = new List { TaskType.步骤01_放置干扰天线支架, TaskType.步骤02_安装干扰天线, TaskType.步骤03_连接干扰天线与干扰源, TaskType.步骤04_放置抗干扰天线支架, TaskType.步骤05_安装抗干扰天线, }; // 初始化 任务流 STL_01 this.SendCommand(new CMD_InitTaskQueue(TaskQueueType.STL_01, taskList)); } if (Input.GetKeyDown(KeyCode.Escape)) { // 中断 任务流 STL_01 this.SendCommand(new CMD_BreakUpTaskQueue(TaskQueueType.STL_01)); } if (Input.GetKeyDown(KeyCode.Space)) { // 按顺序完成 STL_01 当前任务 this.SendCommand(new CMD_CompleteCurrentTask(TaskQueueType.STL_01)); } if (Input.GetKeyDown(KeyCode.Alpha1)) { // 完成步骤1 this.SendCommand(new CMD_CompleteAppointTask(TaskQueueType.STL_01, TaskType.步骤01_放置干扰天线支架)); } if (Input.GetKeyDown(KeyCode.Alpha2)) { // 完成步骤2 this.SendCommand(new CMD_CompleteAppointTask(TaskQueueType.STL_01, TaskType.步骤02_安装干扰天线)); } if (Input.GetKeyDown(KeyCode.Alpha3)) { // 完成步骤3 this.SendCommand(new CMD_CompleteAppointTask(TaskQueueType.STL_01, TaskType.步骤03_连接干扰天线与干扰源)); } if (Input.GetKeyDown(KeyCode.Alpha4)) { // 完成步骤4 this.SendCommand(new CMD_CompleteAppointTask(TaskQueueType.STL_01, TaskType.步骤04_放置抗干扰天线支架)); } if (Input.GetKeyDown(KeyCode.Alpha5)) { // 完成步骤5 this.SendCommand(new CMD_CompleteAppointTask(TaskQueueType.STL_01, TaskType.步骤05_安装抗干扰天线)); } } } ``` **外部依赖:** + 无 *** ## 6. HK_TaskSystem(引入了QF框架): **功能描述:** + 任务管理系统(通过配置文件对任务流进行配置及编辑); + 可在Unity编辑器中对任务流进行编辑,编辑后在运行时进行使用。 **使用方式:** + 在当前项目的 Architecture 中注册 IHK_TaskSystem; + 将 HK_TaskSystemController 中的 Architecture 修改为本项目的 Architecture; + 本系统分三个层级:任务链 TaskList、任务 Task、条件 Condition; + 对外方法有四个:
StartNewTaskList(string taskDataName) //开启 新的 任务链
BreakOffTaskList() // 中断 当前 任务链
AchieveCondition(HK_ConditionType condition) // 达成指定条件
StopTaskAudio() // 停止当前播放的任务语音
ImmediateFinishTaskList() // 立即完成当前任务连(主要用于开发测试)
+ 推荐使用Command指令来使用TaskSystem,四个对外方法分别对应四个Command:
CMD_StartNewTaskList :开启新的任务链指令
CMD_BreakOffTaskList :中断当前任务链指令
CMD_AchieveCondition :达成指定条件指令(可传入延时时间,延时达成条件)
CMD_StopTaskAudio :停止当前播放的任务语音指令
CMD_ImmediateFinishTaskList :立即完成当前任务连(主要用于开发测试)
+ 可通过Query来查询某条件是否达成:
Query_ConditionState : 查询某条件是否达成
+ 外部可监听事件有六个:
Event_TaskListStart // 任务链开始 事件
Event_TaskListFinish // 任务链结束 事件
Event_TaskListBreadOff // 任务链中断 事件
Event_TaskStart // 任务开始 事件
Event_TaskFinish // 任务结束 事件
Event_ConditionAchieve // 条件达成 事件
**外部依赖:** + ActionKit + AudioKit **示例代码:** ```csharp public class Test_TaskUse : HK_TaskSystemController { void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { this.SendCommand(); } if (Input.GetKeyDown(KeyCode.P)) { this.SendCommand(); } if (Input.GetKeyDown(KeyCode.F1)) { this.SendCommand(new CMD_StartNewTaskList("到应聘公司")); } if (Input.GetKeyDown(KeyCode.Alpha1)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C1_1到电梯门口)); } if (Input.GetKeyDown(KeyCode.Alpha2)) { // 延时 1s 达成条件 this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C1_2跟门卫打招呼, 1)); } if (Input.GetKeyDown(KeyCode.Alpha3)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C2_1按电梯按键)); } if (Input.GetKeyDown(KeyCode.Alpha4)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C2_2走到光圈位置)); } if (Input.GetKeyDown(KeyCode.Alpha5)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C3_1选择指示标)); } if (Input.GetKeyDown(KeyCode.F2)) { this.SendCommand(new CMD_StartNewTaskList("参与面试")); } if (Input.GetKeyDown(KeyCode.Q)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C4_1回答问题1)); } if (Input.GetKeyDown(KeyCode.W)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C4_2回答问题2)); } if (Input.GetKeyDown(KeyCode.E)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C5_1做笔试题1)); } if (Input.GetKeyDown(KeyCode.R)) { this.SendCommand(new CMD_AchieveCondition(HK_ConditionType.C5_2做笔试题2)); } if (Input.GetKeyDown(KeyCode.Space)) { bool isConditionFinish = this.SendQuery(new Query_ConditionState(HK_ConditionType.C1_1到电梯门口)); Debug.Log("Condition_C1_1到电梯门口 是否完成:" + isConditionFinish); } if(Input.GetKeyDown(KeyCode.Backspace)) { this.SendCommand(); } } } ``` *** ## 7. HK_SimpleDialogSystem(引入了QF框架): **功能描述:** + 简易对话系统(通过CSV配置文件对话进行配置及编辑); + 在Excel中对对话流程进行编辑,编辑后另存为CSV文件,放在Resource文件夹下; + 需确保CSV文件为UTF-8编码格式; + 目前支持3D的对话UI,主要为适配VR开发; **使用方式:** + 在本项目的 Architecture 中注册 IHK_SimpleDialogSystem; + 将 HK_SimpleDialogController 中的 Architecture 修改为本项目的 Architecture; + 使用Command指令来使用HK_SimpleDialogSystem,三个指令分别为:
CMD_StartNewDialog3D :开启新的3D对话指令
CMD_EndCurDialog3D : 停止当前的3D对话指令
CMD_PlayForwardDialog :继续推进对话指令
+ 外部可监听事件:
Event_DialogStart // 对话开始 事件
Event_DialogEnd // 对话结束 事件
Event_OptionChoiced // 选项做出选择 事件
**外部依赖:** + Dotween *** ## 8. HK_Tips(引入了QF框架): **功能描述:** + 本工具是三维场景中,进行悬浮提示标签的便捷工具; + 可在场景中快速摆放编辑,运行时可通过点击的方式进行事件响应; **使用方式:** + 将 HK_TipsController 中的 Architecture 修改为本项目的 Architecture; + 在场景中摆放Prefabs文件夹下的 HK_Tip 预设体,并进行编辑; + 运行时可点击 HK_Tip 标签,会自动发送点击事件 Event_HKTipClick; + 使用Command指令来进行整体控制:
CMD_HideAllHKTips : 控制所有 HKTip 隐藏
CMD_ShowAllHKTips : 控制所有 HKTip 显示
CMD_SetAllHKTipActiveState : 控制所有 HKTip 激活状态
+ 外部可监听事件:
Event_HKTipClick : HKTip点击事件
**外部依赖:** + Dotween *** ## 9. HK_NetworkSystem(引入了QF框架): + 对Unity的Nedecode进行封装,提供便捷的使用方式 *** ## 10. HK_DebugTool: + 对Unity原生的Debug进行封装,通过HKDebug.Log等方法进行调用 + Log时,可通过设置LogColor、LogStyle等参数,快捷设置Log的字体颜色及样式
+ 示例代码如下: ```csharp HKDebug.Log("红色斜体", LogColor.Red, LogStyle.Italic); HKDebug.Log("黄色", LogColor.Yellow); HKDebug.Log("绿色粗斜体", LogColor.Green, LogStyle.BoldAndItalic); HKDebug.Log("蓝色粗体", LogColor.Blue, LogStyle.Bold); HKDebug.Log("青色", LogColor.Cyan); ``` *** ## 11. HK_Video: **功能描述:** + 在UGUI的视频播放的功能模块,对VideoPlayer进行了封装。 **使用方式:** + 包含完整版播放器 HK_VideoPanel 和 简易版播放器 HK_SimpleVideoPanel 两种。 + 将 HK_VideoPanel 或 HK_SimpleVideoPanel 预设体拖拽入当前场景中进行使用(放置在Canvas下)。 + 通过获取 HK_VideoPanel 或 HK_SimpleVideoPanel 脚本进行使用。 + 调用对应脚本的 PlayAssignedVideoA() 方法,传入视频的URL或VideoClip进行播放。 **外部依赖:** + 无 *** ## 12. HK_UGUITools: #### HK_CollapsibleMenu(引入了QF框架) + 折叠菜单UI预设,可直接推拽至Canvas下进行适用。 + 通过改1、2、3级MenuItem的预设体,适配不同的UI。 + MenuItem按钮点击后发送指令。 #### HK_UIOverride + 重写的UGUI Button组件:
通过在Inspector面板中修改AudioType,播放对应的Button点击音效(需注册对应的音效播放事件)。
通过在Inspector面板中修改AnimType,启用相应的Button动效(使用Dotween,可自行在脚本中修改)。
+ 重写的UGUI Toggle组件:
通过在Inspector面板中修改AudioType播放对应的Toggle点击音效(需注册对应的音效播放事件)。
+ 重写的UGUI Dropdown组件:
通过在Inspector面板中修改AudioPressType和AudioSelectType,播放对应的点击及选中音效(需注册对应的音效播放事件)。 #### HK_SlidePage + 图片轮播功能,将预设体拖拽到Canvas下,修改部分参数配置即可使用。
#### HK_Curve2D + 自定义的UI组件,用于在UGUI中绘制2D曲线,并可控制曲线默认显示状态,以及沿不同方向生长出现。
+ HK_Curve2DCtrl中的SetCurveInitState(bool isShow)方法:设置曲线的默认显示状态。
+ HK_Curve2DCtrl中的PlayGrowAnim(CurveGrowAnimType animType)方法:调用曲线的生长动画(根据动画类型)。
+ 曲线的形状、纹理、颜色等编辑在 HK_Curve2D 脚本中。
#### HK_UIFramesAnimator + 提供两个类型的控制器脚本进行序列帧播放:HK_SingleFramesAnimator、HK_CircleFramesAnimator。 + HK_SingleFramesAnimator:用来单次播放序列帧动画的控制脚本,添加在Image组件相关物体上,用在一些不考虑性能问题的按钮交互动效上。 + HK_CircleFramesAnimator:用来循环播放序列帧动画的控制脚本,添加在Image组件相关物体上,序列帧分为:初始时序列帧、循环序列帧、结束时序列帧。
用在一些不考虑性能问题的循环播放UI面板动效上 *** ## 13. HK_SimpleQuiz: + (引入了QF框架)简单的考题功能,目前包含了:单选题、多选题、判断题,可通过Json或Excel文件对题库进行配置其中通过Excel配置的方式只支持PC端。 *** ## 14. HK_SplitAnim: +模型拆分动画控制功能,可在Scene视窗中对模型动画目标位置进行设置,方便进行管理。 *** ## 15. HK_FileLoad: + (引入了QF框架,该模块仅可用于PC端)从电脑中读取图片、视频,并存储在StreamingAssets中。 *** ## 16. HK_LoginRegister: * (引入了QF框架)用户注册登录功能模块,Server端是NodeJs的,客户端为Unity。 *** # 编辑器功能: ## 0. HK_GlobalSetting: * 全局设置面板。 *** ## 1. HK_SmartCopy: * 对选中的物体进行智能复制,按Ctrl+Shift+D进行复制(只能且必须选中一个物体),第一次复制时会记录便宜的位移、旋转、缩放,之后再次按Ctrl+Shift+D可根据偏移量增量连续进行复制(借鉴Maya中的复制功能)。 *** ## 2. HK_MakeGroup: * 对选中的物体进行打组操作。 *** ## 3. HK_HierarchyPro: * 在Hierarchy面板中显示物体的:激活状态、某些组件图标、Tag名称等。 *** ## 4. HK_ShortCutsExtension * Unity中部分MenuItem的快捷键拓展。 *** ## 5. HK_ReName: * 该工具中包含了:根据指定字符串查找物体、替换选中物体名称中的指定字符串、对选中物体进行重命名。 *** ## 6. HK_RandomRotOrScale: * 对选中的物体进行随机旋转和缩放。 *** ## 7. HK_DotweenEaseShow: * (依赖Dotween)该工具可对Dotween内置Ease缓动动画进行预览,可查看所有缓动类型的动画曲线及相应预览动画。 --- ## 8. HK_CreateGoByPath * 根据LineRenderer路径生成模型,可用于数字城市项目中如生成沿路路灯、公共座椅等模型。 *** ## 9. HK_AutoSwitchToUTF8: 自动将新建的脚本,转为UTF-8编码,防止脚本在Inspector面板预览时产生乱码。 *** ## 10. HK_WebsiteCollection Unity开发相关站点的集合。 *** ## 11. HK_Foldup(Attribute): 将脚本中的序列化变量,在Inspector面板中进行折叠收纳整理。 *** ## 12. HK_ReadOnly(Attribute): 将脚本中的序列化变量,在Inspector面板中变为ReadOnly,只能看不能改。 *** ## 13. HK_OverWrite: 对Unity中的某些功能进行重写,改善原本Unity默认功能中不大合适的地方,提高项目开发效率。目前包含:Image、Text组件重写,新建时默认取消勾选RaycastTarget,因为绝大多数时候这两个组件并不需要RaycastTarget,这样可以提高运行时效率。 *** ## 14. HK_TagAndLayerView: 场景中Tag和Layer的管理工具,对项目中所有的Tag标签及Layer层级进行显示,显示当前场景中对应Tag标签(或Layer层级)包含的物体数量,且可进行选择。 *** ## 15. HK_HierarchySearch: 根据条件(名字、组件),对Hierarchy中选择的物体进行查询并重新选定。 *** ## 16. HK_TextureSetting: 贴图批量化设置及压缩工具(目前只支持 Windows、WebGL、Android 目标平台),使用时选择包含贴图的单一文件夹进行操作,工具只会压缩设置当前文件夹下的贴图。 *** ## 17. HK_AutoGenerateTemplate 自动生成项目脚本模板的工具。(若Assets根目录下有 _Scripts 文件夹,则取消操作)
+ 自动生成 _Scripts→Commands、Events、Models、Systems、ViewControllers 文件夹结构; + 自动生成 “项目名”+“_Architecture”框架脚本; + 自动生成 “Controller”视图层模板脚本; + 自动生成 “IRuntimeModel”模型层模板脚本; + 自动生成 “Events_Global”空脚本; *** ## 18. HK_ProjectPro 在Project面板中显示某些文件夹的特定图标,如:Script(脚本文件夹)、Prefabs(预设体文件夹)、Resources文件夹等。