Tool
ExpandClass
MonoSingleton
BindableProperty
ToolFunction:计算角色与某个方向/角度的夹角,根据角色在空中高度计算初速度
GameService
InputService
InputService:从读取输入到使用输入信号中间封装处理层GetMoveHorizontalValue
:返回水平方向的移动输入(只保留 X,归一化)GetMoveVerticalValue
:返回前后方向的移动输入(只保留 Y,归一化)Move
:把摇杆/按键的二维向量量化为 -1/0/1(八向/四向),常用于动画状态机或栅格移动Shift
:是否按着冲刺键(跑步键)Interactive
:交互键是否触发Scroll
:滚轮/缩放类输入的二维向量
这样,角色控制器、相机控制器等代码不用关心 Input Actions 的读值细节,也不用关心平台差异(键鼠/手柄/触屏),直接消费这些属性即可
KeyBoardUIController:这个类确保界面永远有焦点,并用 Tab 在控件间跳转、用 Enter 执行“提交/点击”,让纯键盘(或手柄)操作 UI 顺畅可用。
Event Service
没有用到,解析见阅读优秀代码 – Skyshin34的博客
TimerService
AnimacerController
为什么要分离State Machinebase和Statemachine,如果有多角色,之间的state一定有区别,但是底层是不变的,所以将来如果有其他角色可以创建更多派生自tate Machinebase的XXStateMachine
Animacer
Animacer可以创建这几种资源
ManualMixerState
手动权重混合器”——你往里放多个子动画(Clip/State),自己控制每个子动画的权重,由它把结果混成一个输出给当前 Layer。
SmoothedFloatParameter
用来平滑地把一个浮点参数从当前值推向目标值,内部用 Mathf.SmoothDamp
维护 Current/Target/Velocity
等状态;这个参数再去驱动 Animancer 的混合器(Mixer)或其它动画/逻辑数值,避免“跳变、抖动、卡顿”
比如声明了一个standValueParameter
变量,把“是否站立”做成 0~1 的连续浮点(通常 1=站立、0=蹲伏)standValueParameter.Parameter.Value = 1;
→ 默认站立。
为什么做成“可复用数据”
多处共享:不仅能驱动动画权重,还可以同时插值角色控制器高度 / 摄像机高度 / 移动速度上限等,让整体“站↔蹲”统一协调。
跨状态保留惯性:切到别的状态再回来不会“跳回 0 或 1”,而是延续当前的平滑进度与 velocity
,观感更自然。
AnimationClip:只有“原始关键帧数据”。
ClipTransition:配方(包含 Clip + 播放参数 + 事件)。
StringAsset
“可拖拽、可复用、可比较、可查找创建的字符串标识资源”。用它把易错的硬编码字符串变成类型安全、项目可管理的资产