# 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绘制的);

+ 根据需求,在当前场景中添加 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;
+ 将 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文件夹等。