系统环境:Windows 10
Unity 版本:2019.4.0f1 Personal
问题描述
最近初学 Unity,期望能复刻游戏「分手骰子」,游戏中有个场景是这样的:骰子滚动,触屏交互停止滚动并记录点数。
今天做到这部分,发现记录骰子点数需要获取动画停止时当前的帧数,学习了相关 API 的使用,最终效果如下:

完成后的骰子滚动和计数效果(使用 gifcam 录制)
解决
主要使用了 GetCurrentAnimatorStateInfo() 方法和 normalizedTime 属性。
GetCurrentAnimatorStateInfo() 方法获取当前状态的动画片段(Clip),返回类型为 AnimatorStateInfo。
AnimatorStateInfo 官方文档
调用 AnimatorStateInfo 类型变量的 normalizedTime 属性记录了当前状态的归一化时间,这是一个 float 类型的值,整数部分为目前已经经历的循环(loop)周期数,小数部分为未满一次循环的部分占一次循环的时间比例。
normalizedTime 官方文档

normalizedTime 官方文档说明
骰子动画一共有 6 个关键帧,只需要取归一化时间的小数部分乘六向上取整即得到点数值。
如果需要获取具体帧数,需要用到 GetCurrentClipInfo() 方法获取动画片段 ClipInfo(结果是一个数组,需从中索引自己需要的片段),访问 .clip.frameRate 属性获取帧率,再计算得出。
其他
AnimatorStateInfo 类型还有其他一些非常有用的属性,记录 3 个比较简单的:
| 属性 | 类型 | 意义 |
|---|---|---|
length |
float |
当前的状态持续的时间(由动画长度决定) |
loop |
bool |
当前的状态是否循环播放 |
speed |
float |
播放速度,1 为常速 |