# HKUnityTools
**Repository Path**: WongKayKKK/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-09-03
- **Last Updated**: 2024-09-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HKUnityTools介绍:
团队在Unity项目中积累的工具集,包含两部分:编辑器功能、运行时功能。目的在于优化团队制作及开发的工作流,以及减少相关制作和开发的工作量。
本项目部分模块依赖于:**Dotween**和**QFramework**,如有问题可联系:QQ 511919078
**(号外号外!团队在青岛,主要做XR、虚拟仿真、数字化展项等项目,目前招开发小伙伴,有意向的可发私信或QQ!)**

HKUnityTools Gitee地址:[传送门](https://gitee.com/JingChanChangFan/hk_-unity-tools)
QFramework Github地址:[传送门](https://github.com/liangxiegame/QFramework)
In-game Debug Console Github地址:[传送门](https://github.com/yasirkula/UnityIngameDebugConsole)
# 运行时功能:
## 1. HK_FreeCam:
**功能描述:**
+ 本工具其实没什么实际作用,写着玩的,但它是工具库写的第一个工具,舍不得删!
+ 这是一个用于Unity引擎的自由摄像机测试脚本,可以通过键盘和鼠标实现3D视角的自由移动和旋转。
+ 此脚本工具适用于在开发和调试期间对场景中的摄像机视角进行灵活控制,进行场景游览。
+ 开发测试结束后可直接将该组件移除。
**使用方式:**
+ 将 HK_FreeCam.cs 脚本文件添加到 Unity 项目中的任一 GameObject 上,通常是添加到主摄像机上。
+ 调整脚本中暴露的参数,如 moveSpeed 表示移动速度,rotateSpeed 表示旋转速度,以及 xAxisRange 表示摄像机俯仰角度限制。
+ 按住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());
}
}
```
+ 将 HKTargetCam_BaseController 脚本中的 Architecture 修改为当前项目的 Architecture;
```csharp
public class HKTargetCam_BaseController : MonoBehaviour, IController
{
public IArchitecture GetArchitecture()
{
return HKTargetCam_Architecture.Interface;
}
}
```
+ 删除场景中默认的Main Camera,将 TargetCamera 预设体,拖入场景中;
+ 在 Scene视窗右上角,开启Gizmos单选按钮(本工具可视化编辑是基于Gizmos绘制的);

+ 根据需求,在当前场景中添加 RotTarget、AreaTarget、FollowTarget(可将预设体拖入场景中进行编辑);
+ 编辑 HK_RotTarget、HK_AreaTarget、HK_FollowTarget 等组件的枚举标记(TargetEnum),该属性是本工具最重要的属性之一,相机通过判断该属性进行切换,请确保该属性在当前场景的唯一性,若存在重复,则将提示警告;

+ 编辑 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;
+ 将 HKRoamingCam_BaseController 中的 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;
+ 将 HKFirstPersonCam_BaseController 中的 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;
+ 本系统分三个层级:任务链 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框架):
**功能描述:**
+ 本工具是三维场景中,进行悬浮提示标签的便捷工具;
+ 可在场景中快速摆放编辑,运行时可通过点击的方式进行事件响应;
**使用方式:**
+ 在当前项目的 Architecture 中注册 IHK_SimpleTaskSystem;
```csharp
public class HKTips_Architecture : Architecture
{
protected override void Init()
{
this.RegisterSystem(new HK_TipSystem());
}
}
```
+ 将 HK_TipsController 中的 Architecture 修改为本项目的 Architecture;
```csharp
public class HK_TipsController : MonoBehaviour, IController
{
public IArchitecture GetArchitecture()
{
return HKTips_Architecture.Interface;
}
}
```
+ 在场景中摆放Prefabs文件夹下的 HK_Tip 预设体,并进行编辑;
+ 运行时可点击 HK_Tip 标签,会自动发送点击事件 Event_HKTipClick;
+ 使用Command指令来进行整体控制:
CMD_HideAllHKTips : 控制所有 HKTip 隐藏
CMD_ShowAllHKTips : 控制所有 HKTip 显示
CMD_SetAllHKTipActiveState : 控制所有 HKTip 激活状态
```csharp
// 显示所有的 HKTip
this.SendCommand();
// 隐藏所有的 HKTip
this.SendCommand();
// 禁用所有的 HKTip
this.SendCommand(new CMD_SetAllHKTipActiveState(false));
// 激活所有的 HKTip
this.SendCommand(new CMD_SetAllHKTipActiveState(true));
```
+ 外部可监听事件:
Event_HKTipClick : HKTip点击事件
```csharp
this.RegisterEvent(args =>
{
Debug.Log("点击的Tip名称为:" + args._tipName);
Debug.Log("点击的Tip类型为:" + args._tipType);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
```
**外部依赖:**
+ Dotween
***
## 9. HK_DebugTool:
**功能描述:**
该工具是对Unity内置Debug功能的封装工具。该工具提供了更灵活的日志打印功能,支持设置日志的颜色和样式,并且能够将日志保存到本地文件。通过使用HKDebug,可以更方便地控制和管理日志输出。以下是HKDebug的主要功能:
+ 日志颜色设置: 允许设置日志字体颜色,包括白色、红色、黄色、绿色、蓝色和青色。
+ 日志样式设置: 允许设置日志字体样式,包括普通、粗体、斜体和粗体斜体。
+ 日志类型: 支持普通日志 (HKDebug.Log) 、警告日志 (HKDebug.LogWarning) 和错误日志 (HKDebug.LogError) 三种类型。
+ 时间戳: 日志消息会自动附加当前时间戳,以便于日志的时间追踪和问题排查。
+ 日志保存: 可以根据配置选择是否将日志保存到文件,默认日志保存路径为项目目录下的HKLog文件夹。
**使用方式:**
+ 普通日志输出: HKDebug.Log 方法用于输出普通的日志消息,替代Unity原生的 Debug.Log,可以指定颜色和样式。
+ 警告日志输出: HKDebug.LogWarning 方法用于输出警告日志消息,替代Unity原生的 Debug.LogWarning ,默认采用黄色粗体显示。
+ 错误日志输出: HKDebug.LogError 方法用于输出错误日志消息,替代Unity原生的 Debug.LogError ,默认采用红色粗体显示。
+ 示例代码及输出结果如下:
```csharp
HKDebug.Log("白色");
HKDebug.Log("黄色", LogColor.Yellow);
HKDebug.Log("绿色粗斜体", LogColor.Green, LogStyle.BoldAndItalic);
HKDebug.Log("蓝色粗体", LogColor.Blue, LogStyle.Bold);
HKDebug.Log("青色", LogColor.Cyan);
HKDebug.Log("红色",LogColor.Red);
HKDebug.Log("白色");
HKDebug.LogWarning("报警");
HKDebug.LogError("报错");
```

+ 日志保存: (仅支持Editor及WindowsPC)可在 HKDebugConfig 中配置是否保存日志, 如果启用了日志保存功能,日志将会自动保存到项目目录下的HKLog文件夹中。每次启动项目将会创建一个新的日志文件,如下图所示:

***
## 10. HK_Video:
**功能描述:**
+ 在UGUI的视频播放的功能模块,对VideoPlayer进行了封装。
**使用方式:**
+ 包含完整版播放器 HK_VideoPanel 和 简易版播放器 HK_SimpleVideoPanel 两种。
+ 将 HK_VideoPanel 或 HK_SimpleVideoPanel 预设体拖拽入当前场景中进行使用(放置在Canvas下)。
+ 通过获取 HK_VideoPanel 或 HK_SimpleVideoPanel 脚本进行使用。
+ 调用对应脚本的 PlayAssignedVideoA() 方法,传入视频的URL或VideoClip进行播放。
**外部依赖:**
+ 无
***
## 11. HK_SerialPortSystem(引入了QF框架):
**功能描述:**
+ 串口通信管理系统层;
+ 可通过配置文件 HK_SerialConfig.json 在外部进行配置;
+ 本系统层工具仅可应用于 Windows PC端;
**使用方式:**
+ 确认当前Unity工程的 Api Compatibility Level 选择了 .Net Framework;

+ 确认 StreamingAssets 文件夹下是否有 HK_SerialConfig.json 配置文件,可通过自动化工具生成该配置文件,或进行配置文件重置;

+ 修改 StreamingAssets/HK_SerialConfig.json 配置文件,调整串口配置;
```json
{
"PortName": "COM3",
"BaudRate": 9600,
"Parity": "None",
"DataBits": 8,
"StopBits": "None"
}
```
+ 在当前项目的 Architecture 中注册 IHK_SerialPortSystem;
```csharp
public class HK_SerialPortArchitecture : Architecture
{
protected override void Init()
{
this.RegisterSystem(new HK_SerialPortSystem());
}
}
```
+ 通过调用 InitSerialPort 方法,并传入串口通信指令长度参数,进行初始化;
```csharp
this.GetSystem().InitSerialPort(6);
```
+ 通过调用 OpenSerialPort 方法,开启串口;
```csharp
this.GetSystem().OpenSerialPort();
```
+ 通过调用 CloseSerialPort 方法,关闭当前串口;
```csharp
this.GetSystem().CloseSerialPort();
```
+ 注册 Event_ReceiveSerialPortData 事件,接口串口通信数据;
```csharp
this.RegisterEvent(args =>
{
Debug.Log("接收到串口数据: " + args._serialPortData);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
```
**外部依赖:**
+ ActionKit
***
## 12. HK_UGUITools:
### HK_UIFramework(引入了QF框架)
**功能描述:**
本UI框架旨在管理各种UI面板的打开、关闭及其层级、排序关系,本框架提供了一套机制,使得开发者可以方便地操控UI元素,确保界面层级按照预期显示,并且不同面板类型(全局面板和层级面板)能够和谐共存。
全局面板(Global Panel):
+ 全局性面板,通常涵盖应用的全局功能,例如顶部栏、全局设置窗口、确认窗口等。
+ 全局面板通常具有较高的显示优先级顺序 (Order 属性)。
层级面板(Hierarchy Panel):
+ 层级面板,通常覆盖整个应用界面,由栈来进行管理,例如软件的各层级页面等。
+ 层级面板以栈的形式管理,栈顶的面板总是当前活动面板。
+ 打开新的层级面板时,当前活动的层级面板会被暂停,新的面板成为活动面板。
+ 关闭栈顶层级面板时,之前被暂停的面板将重新变为活动状态。
**使用方式:**
+ 在当前项目的 Architecture 中注册 IHK_UISystem
```csharp
public class HKUIFramework_Architecture : Architecture
{
protected override void Init()
{
this.RegisterSystem(new HK_UISystem());
}
}
```
+ 将 HKUIFramework_BaseController 脚本中的 Architecture 修改为当前项目的 Architecture;
```csharp
public class HKUIFramework_BaseController : MonoBehaviour, IController
{
public IArchitecture GetArchitecture()
{
return HKUIFramework_Architecture.Interface;
}
}
```
+ 将UI_Root预设体拖入场景中,在ForDesign节点下编辑各个面板,并添加控制脚本(需继承HK_BasePanel)。
+ 编辑后的脚本作为预设体,存放在Project某目录下。
+ 若预设体实例发生修改,在Hierarchy中会显示“更新”按钮。

+ 编辑 HK_UIConfig,对各面板进行参数配置。

+ 可在 全局面板 及 层级面板 下设计子页面(子页面脚本需继承 HK_ChildPanelBase),并对子页面进行生命周期方法的同步管理。

### 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_TcpCommunicateSystem(引入了QF框架):
**功能描述:**
本系统层是一个Unity的网络通信系统(不支持WebGL),包含了Server端和Client端两个部分,使用 TCP 协议实现客户端和服务器之间的消息传递。该系统通过 QFramework 框架进行管理,提供了服务器端和客户端的启动、关闭及消息发送等功能。以下是系统的主要功能:
主要特性如下:
+ 多客户端支持:服务器端可以同时处理多个客户端连接。
+ 线程管理:使用多线程和 CancellationTokenSource 管理服务器和客户端的生命周期,确保资源的正确释放。
+ Server端功能:
+ 启动Server:监听指定端口,等待客户端连接。
+ 关闭Server:通知所有客户端即将断开连接,并关闭所有客户端连接。
+ 发送消息给所有客户端:向所有已连接的客户端发送消息。
+ 发送消息给指定客户端:通过IP和端口号或Socket向指定客户端发送消息。
+ 设置Debug状态:控制是否在控制台输出Debug信息。
+ Client端功能:
+ 启动Client:连接到指定的服务器IP和端口。
+ 关闭Client:通知服务器即将断开连接,并关闭客户端连接。
+ 发送消息给服务器:向服务器发送消息。
+ 设置Debug状态:控制是否在控制台输出Debug信息。
+ 事件和指令:通过 QFramework 的事件和指令,使用该系统层,并将接收到的消息传递到主线程,方便在 Unity 环境中进行处理。
**使用方式:**
+ 在本项目的 Architecture 中注册 Server端或Client端的系统层;
```csharp
public class HKTcp_Architecture : Architecture
{
protected override void Init()
{
// 注册 Client端系统层
this.RegisterSystem(new HK_TcpClientSystem());
// 注册 Server端系统层
this.RegisterSystem(new HK_TcpServerSystem());
}
}
```
+ 通过指令开启 Server端;
```csharp
// 作为 Server端,开启
this.SendCommand(new CMD_StartAsServer());
```
+ 通过指令给Client端发送消息;
```csharp
// 作为 Server端,给 所有的Client端 发送指令
this.SendCommand(new CMD_SendMsg_ServerToAllClients("Hello Client"));
```
+ Server端订阅事件;
```csharp
// 当 Client端 连接时
this.RegisterEvent(args =>
{
HKDebug.Log($"Event:Client端 {args._address}:{args._port} 加入", LogColor.Green);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
// 当 Client端 断开连接时
this.RegisterEvent(args =>
{
HKDebug.Log($"Event:Client端 {args._address}:{args._port} 退出", LogColor.Green);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
// 作为 Server端,接收 Client端 发送的消息
this.RegisterEvent(args =>
{
HKDebug.Log($"Event:Client端 {args._address}:{args._port} 发送消息 {args._msg}", LogColor.Green);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
```
+ 通过指令关闭 Server端;
```csharp
// 关闭 Server端
this.SendCommand(new CMD_CloseServer());
```
+ 通过指令开启 Client端;
```csharp
// 作为 Client端,开启,并传入 Server端的Ip及端口号
this.SendCommand(new CMD_StartAsClient("192.168.0.135", 8080));
```
+ 通过指令给Server端发送消息;
```csharp
// 作为 Client端,给 Server端发送指令
this.SendCommand(new CMD_SendMsg_ClientToServer("Hello Server"));
```
+ Client端订阅事件;
```csharp
this.RegisterEvent(args =>
{
HKDebug.Log($"Event:连接入Server端", LogColor.Green);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
this.RegisterEvent(args =>
{
HKDebug.Log($"Event:与Server端断开连接", LogColor.Green);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
this.RegisterEvent(args =>
{
HKDebug.Log($"Event:Server端 发送消息 {args._msg}", LogColor.Green);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
```
+ 通过指令关闭 Client端;
```csharp
// 关闭 Client端
this.SendCommand(new CMD_CloseClient());
```
-----------------------------------------------------------------------------------------------------------------------------------------------
## 14. HK_UdpCommunicateSystem(引入了QF框架):
**功能描述:**
本工具是一个为Unity设计的UDP通信工具。提供了通过指令和事件,来进行发送、接收和广播UDP消息。该工具适用于需要实时通信的应用程序,例如多人VR或展厅多端通信应用。
主要功能及特性如下:
+ 启动和关闭UDP通信:可以在指定的本地端口上轻松启动和停止UDP通信系统。
+ 消息发送:向特定的远程端点发送消息。
+ 消息广播:使用指定的广播端口向网络上的所有设备广播消息。
+ 异步消息接收:异步接收消息,不会阻塞主线程。
**使用方式:**
+ 在本项目的 Architecture 中注册 IHK_UdpSystem 系统层;
```csharp
public class HKUdp_Architecture : Architecture
{
protected override void Init()
{
this.RegisterSystem(new HK_UdpSystem());
}
}
```
+ 通过指令开启 UDP通信;
```csharp
// 传入端口号,开启UDP通信
this.SendCommand(new CMD_StartUDP(7878));
```
+ 通过指令广播消息;
```csharp
// 给本网段下所有主机的7878端口广播消息
this.SendCommand(new CMD_BroadcastMsg("模式1", 7878));
```
+ 订阅消息接收事件;
```csharp
this.RegisterEvent(args =>
{
HKDebug.Log("接收到UDP广播消息:" + args._msg);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
```
+ 通过指令关闭 UDP通信;
```csharp
// 关闭 Client端
this.SendCommand(new CMD_CloseUDP());
```
## 15. HK_AutoRunSystem(引入了QF框架):
**功能描述:**
+ 软件自启动工具;
+ 本工具是通过注册表实现的软件自动启动,因此仅支持 Windows 平台中应用;
+ 本系统层工具仅可应用于 Windows PC端,且在Unity Editor下无效,需将程序打包后方可使用;
**使用方式:**
+ 确认当前Unity工程的 Api Compatibility Level 选择了 .Net Framework;

+ 方法1 — 通过预设组件实现:
+ 将 HK_UseAutoRun 脚本挂载在初始场景的某个物体上;
+ 将程序打包为Windows平台后,“以管理员身份运行”;
+ 运行后按F9键,在左上角出现设置按钮,再次按下则隐藏;
+ 点击 “设置自动启动” 按钮,自动写入注册表,下次开机该软件则自动启动;
+ 点击 “取消自动启动” 按钮,自动删除注册表;
+ 方法2 — 通过API实现:
+ 在本项目的 Architecture 中注册 IHK_AutoRunSystem;
```csharp
public class HKAutoRun_Architecture : Architecture
{
protected override void Init()
{
this.RegisterSystem(new HK_AutoRunSystem());
}
}
```
+ 通过调用 SetupAutoRun 方法,设置软件自动启动;
```csharp
this.GetSystem().SetupAutoRun();
```
+ 通过调用 CancelAutoRun 方法,取消软件自动启动;
```csharp
this.GetSystem().CancelAutoRun();
```
+ 将程序打包为Windows平台后,“以管理员身份运行”后,方可启用;
**外部依赖:**
+ 无
***
## 16. HK_SimpleQuiz:
+ (引入了QF框架)简单的考题功能,目前包含了:单选题、多选题、判断题,可通过Json或Excel文件对题库进行配置其中通过Excel配置的方式只支持PC端。
***
## 17. HK_NetworkSystem(引入了QF框架):
+ 对Unity的Nedecode进行封装,提供便捷的使用方式
+ 需确保在Package Manager中,已导入Netcode for GameObjects 包
+ 再将 HK_NetworkSystem 包导入本工程中进行使用
***
## 18. HK_SplitAnim:
+ 模型拆分动画控制功能,可在Scene视窗中对模型动画目标位置进行设置,方便进行管理。
***
## 19. HK_FileLoad:
+ (引入了QF框架,该模块仅可用于PC端)从电脑中读取图片、视频,并存储在StreamingAssets中。
***
## 20. HK_LoginRegister:
* (引入了QF框架)用户注册登录功能模块,Server端是NodeJs的,客户端为Unity。
***
# 复用工具:
## 1. HKUtility(非Mono单例工具类):
### 1.1 IsClickUI:
* 判断是否点击到UI上了,如果点在 UI 则返回 true,如果没点击到 UI 返回false。
```csharp
void OnMouseDown()
{
// 判断是否点击到UI,如果点击的是UI则返回
if (HKUtility.Instance.IsClickUI())
return;
Debug.Log("点击到了GameObject");
}
```
### 1.2 IsInTheFront:
* 判断 物体B 是否在 物体A的前方,如果在前方,返回 true,如果在后方,返回 false
### 1.3 IsOnTheRight:
* 判断 物体B 是否在 物体A的右边,如果在右边,返回 true,如果在左边,返回 false
## 2. HKMonoUtility(Mono单例工具类):
### 2.1 GetJsonFromStreamingAssets:
* 从 StreamingAssets 中获取Json文件并解析,通过callback返回
```csharp
HKMonoUtility.Instance.GetJsonFromStreamingAssets("JsonDatas/TestData", jsonData =>
{
Debug.Log(jsonData.Name);
});
```
### 2.2 GetJsonFromURL:
* 从 URL 中获取Json文件并解析,通过callback返回
### 2.3 GetSpriteFromStreamingAssets
* 从 StreamingAssets 中加载Sprite,通过callback返回
```csharp
HKMonoUtility.Instance.GetSpriteFromStreamingAssets("Image/Texture.png", sprite =>
{
GetComponent().sprite = sprite;
});
```
# 编辑器功能:
## 0. HK_GlobalSetting:
* 全局设置面板。
***
## 1.1 HK_SmartCopy:
本工具模仿 Maya 中的智能复制功能,用于智能复制选中的游戏对象。通过新增位置、旋转和缩放的偏移量,允许用户快速创建连续的、增量复制的游戏对象。这一功能类似于Maya中的复制功能,使得一些排列和布局任务变得更加高效,使用方式如下:
+ 按 Ctrl+Shift+D 进行复制操作,只能且必须选中一个物体
+ 对复制的物体进行位移、旋转、缩放调整操作。
+ 再次按 Ctrl+Shift+D 时,会根据记录的偏移量进行连续复制。
+ 如果当前选择的物体发生变动或者用户选择了不同的物体,工具会自动重启复制过程。
+ 工具操作及效果示意如下图所示:

***
## 1.2 HK_MakeGroup:
本工具模仿 Maya 中的打组功能,用于将选中的多个 Unity 游戏对象(GameObjects)打组操作。生成一个新的父对象,将所有选中的对象作为该新父对象的子对象,并将新父对象在层次视图中位置与第一个选中物体保持一致。使用方式如下:
+ 选择物体: 在层级(Hierarchy)窗口中,选中需要打组的多个物体(GameObjects)。
+ 执行打组操作:在 HKTools 菜单下,选择 MakeGroup(打组工具),或按下快捷键 Ctrl + G 或 Cmd + G。
+ 查看结果: 此时会创建一个名为 Parent_Go 的新父对象,并按照预期层次结构和位置将选中的对象作为其子对象,如下图所示:

***
## 1.3 HK_ShortCutsExtension
* Unity中部分MenuItem的快捷键拓展。
***
## 2.1 HK_TodoList(代办事项清单工具)
本工具提供了在Unity中进行代办事项清单管理的功能,使用方法如下:
+ 添加 Todo 注释:在编写代码时,可以在需要标记为待办事项的行添加注释,工具会自动识别这些注释并将其记录为 Todo 条目,默认支持的注释前缀如下:
+ //TODO
+ //Todo
+ //todo
+ // TODO
+ // Todo
+ // todo
+ 存储 Todo 条目:识别出的 Todo 条目将自动存储在 HKTodoList 中,方便集中管理和查看。
+ 全局刷新:点击 “全局刷新” 按钮,工具会遍历整个 Unity 工程中的所有脚本文件,识别并更新所有 Todo 条目。
+ 快捷跳转:在 HKTodoList 中点击 “打开脚本” 按钮,可以快速打开包含该 Todo 条目的代码脚本,并自动跳转到对应的行数,方便快速定位和处理。
+ 关键词自定义:可以修改 HK_TodoConstants 脚本中的 TodoKeyWords 和 SkipKeyWords,来自定义 Todo 条目识别的注释关键字,以及需要过滤的路径关键字,如下图所示:

+ 工具界面如下图所示:

***
## 2.2 HK_ResetName(重命名工具):
本工具提供了两大主要功能:替换选中物体名称中的特定字符串 和 对选中物体进行重命名。
该工具使得开发者可以更高效地管理游戏对象的命名,提高项目的组织和维护便利性。
+ 替换功能: 查找选中物体名称中的特定字符串,并将其替换为新的字符串。适用于需要对名称进行部分修改的场景。
+ 重命名功能: 对选中物体进行批量重命名,并按照用户设定的起始编号进行命名排序。适用于需要对大量对象进行统一命名的场景。
使用方式如下:
+ 选择目标物体: 在Unity编辑器的Hierarchy窗口中,选择需要操作的物体;
+ 选择操作模式: 在工具界面中,从“Replace”和“Rename”两种模式中进行选择;
+ Replace 模式:输入待查找的字符串和替换的字符串,工具将扫描所有选中物体的名称,并将符合条件的部分替换为新字符串。
+ Rename 模式:输入新的名称和起始编号,工具将对选中物体进行重命名,并按编号顺序进行排序。
+ Tips:如需将所有选中物体修改为统一命名,直接在Inspector界面的输入框中输入目标名称,将自动替换所有选中物体的名称为统一名称,无需使用本工具。
+ 工具界面如下图所示:


***
## 2.3 HK_RandomRotOrScale(随机旋转缩放工具):
* 对选中的物体进行随机旋转和缩放。
***
## 2.4 HK_DotweenEaseShow(Dotween动效预览工具):
* (依赖Dotween)该工具可对Dotween内置Ease缓动动画进行预览,可查看所有缓动类型的动画曲线及相应预览动画。
***
## 2.5 HK_TagAndLayerView(标签与层级预览工具):
* 场景中Tag和Layer的管理工具,对项目中所有的Tag标签及Layer层级进行显示,显示当前场景中对应Tag标签(或Layer层级)包含的物体数量,且可进行选择。
***
## 2.6 HK_TextureSetting(贴图设置工具):
* 贴图批量化设置及压缩工具,可批处理图片的分辨率(调整为4的倍数),也可批量设置图片的压缩格式;
* 目前只支持 Windows、WebGL、Android 目标平台);
* 设置图片分辨率时,直接选择图片文件进行操作;
* 设置压缩格式时,选择包含贴图的单一文件夹进行操作,工具只会压缩设置当前文件夹下的贴图;
***
## 2.7 HK_HierarchySearch(查找物体工具):
* 根据条件(名字、组件),对Hierarchy中选择的物体进行查询并重新选定。
***
## 2.8 HK_CreateGoByPath(基于路径创建工具):
本工具,可帮助用户在指定的路径上生成多个GameObject实例,并配置其位置偏移和旋转偏移。用户可以通过该工具快速在场景中布置物体,提高工作效率。使用方式如下:
+ 打开编辑窗口:打开Create Go By Path窗口:在Unity菜单栏中,选择HKTools -> CreateGoByPath,打开 HK_CreateGoByPath 窗口。
+ 生成路径:点击“生成 Path”按钮,在Scene视窗中生成路径。
+ 编辑路径:选择路径物体,在检查器窗口中的 HK_Path 组件中添加路径点(waypoints)。路径点可以直接在场景视图中通过拖动控制柄进行调整。

+ 重置坐标和路径点(可选操作):
+ 重置 Path 物体坐标轴:点击该按钮,将路径的位置设定到所有WayPoints的中心点。
+ 重置 Way Points 坐标:点击该按钮,重新对齐WayPoints到与路径对象的相对位置。
+ 配置参数:
+ 需生成的物体:选择一个要复制的模板GameObject或者Prefab。
+ 生成数量:设置要生成的物体数量。
+ 高度偏移:设置生成物体在Y轴的偏移量。
+ Y轴旋转偏移:设置生成物体的Y轴旋转。

+ 沿路径生成:确保在层次窗口中只选择具有 HK_Path 组件的路径对象,点击 “沿路径生成物体” 按钮,在路径上生成配置模板的实例对象
+ 删除生成的子物体:点击 “删除所有已生成物体” 按钮,将Path下所有已删除的物体进行删除操作。
***
## 2.9 HK_AutoGenerateTemplate(自动化生成项目模板):
自动生成项目脚本模板的工具。(若Assets根目录下有 _Scripts 文件夹,则取消操作)
+ 自动生成 _Scripts→Commands、Events、Models、Systems、ViewControllers 文件夹结构;
+ 自动生成 “项目名”+“_Architecture”框架脚本;
+ 自动生成 “Controller”视图层模板脚本;
+ 自动生成 “IRuntimeModel”模型层模板脚本;
+ 自动生成 “Events_Global”空脚本;
+ 自动生成 “IAudioSystem”音频管理系统层脚本;
***
## 3.1 HK_ReadOnly(Attribute):
* 将脚本中的序列化变量,在Inspector面板中变为ReadOnly,只能看不能改。
***
## 3.2 HK_OverWrite:
* 对Unity中的某些功能进行重写,改善原本Unity默认功能中不大合适的地方,提高项目开发效率。目前包含:Image、Text组件重写,新建时默认取消勾选RaycastTarget,因为绝大多数时候这两个组件并不需要RaycastTarget,这样可以提高运行时效率。
***
## 3.3 HK_AutoSwitchToUTF8:
本工具的主要功能是自动将新建和导入的脚本文件(包括 C# 脚本 .cs 和 CSV 文件 .csv)转换为 UTF-8 编码,以防止在 Unity Inspector 面板中预览中文时出现乱码问题。此工具提供了一种高效、可靠的方式来确保代码和数据文件的正确显示,提升开发人员的工作效率,主要功能如下:
+ 自动编码转换:自动检测导入的 C# 和 CSV 脚本文件,并将其编码转换为 UTF-8。
+ 文件检测与处理:自动判断文件是否已处理过,避免重复操作,提高性能。
+ 编码类型识别:识别文件的编码类型(包括 UTF-8 和 Unicode 等),确保文件正确转换。
+ 灵活启用与禁用:提供启用和禁用功能的接口,使用户可以根据需要自行控制工具的启用及禁用。
***
## 3.4 HK_Foldup(Attribute):
* 将脚本中的序列化变量,在Inspector面板中进行折叠收纳整理。
***
## 3.5 HK_Enum(Attribute):
* 定制的可随机插入、删除的序列化的枚举类型。
***
## 4.1 HK_HierarchyPro:
本工具用于增强 Hierarchy 面板的显示功能。通过本工具,开发者可以更直观地查看游戏对象的状态、层级和组件信息,有效地提高工作效率。该插件具备以下主要功能:
+ 显示Hierarchy列表的外边框:在 Hierarchy 面板渲染边框,高亮Hierarchy中的物体,便于快速识别。
+ Layer信息显示:在 Hierarchy 面板中显示物体所属的Layer层级名称,用于快速识别物体所属的Layer层级。
+ 激活状态切换:在 Hierarchy 面板中直接切换游戏对象的激活状态,便于快速进行状态管理。
+ 组件图标显示:在 Hierarchy 面板中显示特定组件的图标,通过图标快速了解游戏对象包含的主要组件。
+ 标记功能:按下Ctrl+M快捷键,可以对选中的游戏对象进行标记和取消标记,标记的对象会在Hierarchy中显示星型符号,方便快速定位,方便开发人员对关键物体进行临时标记。(场景关闭时,会清空标记)
使用方式如下:
+ 在 HKTools/Settings...菜单中,可开启或关闭本工具,如下图所示。

***
## 4.2 HK_ProjectPro
本工具用于在 Project 面板中为特定的文件夹显示自定义图标。这些文件夹包括但不限于脚本文件夹(Scripts)、预设体文件夹(Prefabs)、资源文件夹(Resources)等。该工具可以帮助开发者更直观地识别和管理项目中的不同类型文件夹,默认支持以下对应文件夹名称的图标显示(不区分大小写):
+ Scripts 文件夹:_Scripts, _Script, Scripts, Script
+ Prefabs 文件夹:_Prefabs, Prefabs, _Prefab, Prefab
+ Resources 文件夹:Resources
+ StreamingAssets 文件夹:Streamingassets
+ Scenes 文件夹:_Scenes, Scenes, _Scene, Scene
+ Materials 文件夹:Materials, Material, Mats, Mat, _Materials, _Material, _Mats, _Mat
+ UI 文件夹:UI, _UI, UIs, _UIs
使用方式如下:
+ 在 HKTools/Settings...菜单中,可开启或关闭本工具,如下图所示。

***
## 5.1 HK_WebsiteCollection
* Unity开发相关站点的集合。
***