一、前提:游戏主场景有很多建筑,然后建筑上会有动画,如果存在多个同类型的建筑,就会出现多个相同动画频率一致的情况,这样子产品说体验性较差,所以考虑怎么控制动画从不同帧开始播放。
二、处理方案。
1、原理:通过设置动画状态机中的Cycle Offset,可以控制动画起始播放点,该值的区间是0到1,类型为float类型。
2、具体操作:我们首先给Animator添加一个“offset”参数,然后指定Animator状态机中所有状态使用Cycle offset属性,并且指定使用上面添加的“offset”参数。然后我们可以在动画挂上一个随机脚本,该脚本在OnEnable的时候会随机在0到1之间生成一个随机值,同时把该随机值设置为animtor的“offfset”值,即可达到效果。
三、具体代码
1、统一处理建筑prefab动画参数
public static void HandleBuildingBlockAnimRandom()
UnityEngine.Object[] selection = Selection.objects;
foreach (var obj in selection)
Animator[] anims = ((GameObject)obj).GetComponentsInChildren<Animator>();
for (int i = 0; i < anims.Length; i++)
UnityEditor.Animations.AnimatorController controller = (UnityEditor.Animations.AnimatorController)anims[i].runtimeAnimatorController;
bool is_find = false;
foreach (AnimatorControllerParameter param in controller.parameters)
if (param.name == "offset")
is_find = true;
break;
if (!is_find)
controller.AddParameter("offset", UnityEngine.AnimatorControllerParameterType.Float);
foreach (UnityEditor.Animations.ChildAnimatorState state in controller.layers[0].stateMachine.states)
state.state.cycleOffsetParameterActive = true;
state.state.cycleOffsetParameter = "offset";
AnimationRandom comp = ((GameObject)obj).GetComponent<AnimationRandom>();
if (comp == null)
((GameObject)obj).AddComponent<AnimationRandom>();
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
2、随机脚本
public class AnimationRandom : MonoBehaviour {
// Use this for initialization
void OnEnable () {
var animators = GetComponentsInChildren<Animator>(true);
foreach (var anim in animators)
anim.SetFloat("offset", Random.Range(0.0f, 1.0f));
一、探索Animator Controller动画控制器
每当为选定的游戏对象创建第一个动画剪辑时,就会自动创建动画器组件。Animator负责分配动画;但是,它不控制实际的动画剪辑。这个任务落到了动画控制器身上,它也是用第一个动画剪辑自动创建的。
1.State Machine状态机
动画控制器运行在一种称为状态机的特殊系统上。状态机跟踪对象可以执行的所有可能操作,并根据当前情况(或状态)要求选择适当的操作。传达当前状态的逻辑由外部控制,通常通过脚本进行,但从一个动作移动到另一个动作的过程由状态机.
在 Unity 动画系统中,动画播放完毕默认是停留在最后一帧的,当我们重置场景的时候,需要将动画重置到第一帧。而 Animation 和 Animator 组件中并没有 Reset 方法。本文主要提供了关于 Animation 和 Animator 动画重置的解决方法。
Animator 重置到起始帧
通过 Animator.Play 和 Animator.Update 播放来进行控制。
An...
public Animator _animator;
AnimationClip nowPlay;
public Dictionary<string, AnimationClip> animationClips;
void Awake()
//a...
关键点:因为我的判断变量为b
ool值,且不断的在FixedUpdate中刷新bool变量值。所以当Can Transition To Self 勾选时,
动画会不断从头播放造成了不断卡死在第一帧的现象 取消勾选后可正常播放。
创建动画控制器操作步骤如下:
1)新建一个Animator Controller,并拖到Player对象上。由于在本场景中将通过动画来控制角色的运动,所以需要勾选Animator Controller组件的Apply Root Motion选项
2)在Parameters中添加如下参数:
1.表示速度的float型参数speed;
2.表示角色运动方向的float型变量Direction
3.表示...
animator.speed=-1;//倒放
animator.Play("stateName",0,0);//播放指定状态(stateName是Animator窗口里各个状态的名称)
跳到指定帧,并停止
Animator animator;
animator.speed=0;//停止播...