一、前提:游戏主场景有很多建筑,然后建筑上会有动画,如果存在多个同类型的建筑,就会出现多个相同动画频率一致的情况,这样子产品说体验性较差,所以考虑怎么控制动画从不同帧开始播放。

二、处理方案。

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;//停止播...