Unity手动控制动画播放

一般情况下animator只要一运行,就会自动播放当前的clip,有时候我们想通过代码来控制,比如,用户按住按扭,就正向播放,按住另一个就反向播放。

虽然通过speed也可以做到,但终究有点麻烦,好了,话不多说,上代码

using UnityEngine;
using System.Collections;
//[ExecuteInEditMode]
//此动画1.7秒
public class Test_AnimSeek : MonoBehaviour {

    Animator animator;
    const float kDuration = 1.7f;
    bool init = false;
	// Use this for initialization
	IEnumerator Start () {
        init = true;
        Debug.Log("start");
	    animator = GetComponent<Animator>();
        const float frameRate = 30f;
        const int frameCount = (int)((kDuration * frameRate) + 2);
        animator.Rebind();
        animator.StopPlayback();
        animator.recorderStartTime = 0;

        // 开始记录指定的帧数
        animator.StartRecording(frameCount);

        for (var i = 0; i < frameCount - 1; i++) {
            // 记录每一帧
            animator.Update(1.0f / frameRate);
        }
        animator.speed = 0;
        yield return new WaitForEndOfFrame();
        animator.speed = 1;
        // 完成记录
        animator.StopRecording();
        Debug.LogFormat("{0},{1}",animator.recorderStartTime,animator.recorderStopTime);

        // 开启回放模式
        animator.StartPlayback();
	}
    float m_CurTime = 0f;
    void Update() {
        if ( !init) {
            Start();
        }
        int i = 0;
        if (Input.GetKey(KeyCode.LeftArrow)) {
            i = -1;
        }
        if (Input.GetKey(KeyCode.RightArrow)) {
            i = 1;
        }
        //Debug.Log(m_CurTime);
        animator.playbackTime = m_CurTime;
        animator.Update(0);
        m_CurTime+=(1/70f)*i;
        if (m_CurTime>1.7f) {
            m_CurTime = 0;
        }
        if (m_CurTime < 0) {
            m_CurTime = 1.7f;
        }
    }
}


大家可以注意到,运行时章鱼是没有动的,后面它动了起来是我在按<-和->键来控制的,脚本中的kDuration填写动画的时长,然后把代码挂在模型上就可以看到 效果了

### 如何在 Unity播放 Animation 动画 #### 使用 Animation 组件播放动画Unity 中,`Animation` 组件可以用来管理并播放简单的动画剪辑。以下是实现这一功能的关键方法: - **Play 方法** 可以通过 `Animation.Play()` 来启动指定的动画剪辑[^2]。例如,在脚本中调用此方法来触发特定动画。 ```csharp using UnityEngine; public class PlayAnimationExample : MonoBehaviour { public Animation myAnimation; // 将 Animation 组件拖拽到该字段上 void Start() { if (myAnimation != null) myAnimation.Play(); // 开始播放默认动画 } } ``` 如果需要播放某个具体的动画剪辑,则可以通过传递名称参数给 `Play(string clipName)` 函数完成操作[^3]。 ```csharp void Start() { if (myAnimation != null && myAnimation["Walk"] != null) myAnimation.Play("Walk"); // 播放名为 "Walk" 的动画剪辑 } ``` --- #### 控制动画状态(暂停/停止) 除了播放之外,还可以利用其他函数进一步控制动画的状态,比如暂停或停止当前正在运行的动画。 - **Pause 和 Rewind** - 调用 `animation.Pause()` 可使当前帧保持不动而不会继续更新。 - 如果希望回到初始位置再重新开始,则可使用 `Rewind()` 方法重置时间轴至零点处后再执行一次常规播放逻辑即可[^1]。 ```csharp // 暂停动画 if (myAnimation.isPlaying) myAnimation.Pause(); // 返回起始点 if (!myAnimation.isPlaying) myAnimation.Rewind(); ``` 需要注意的是当只附加了一个单独的 `Animation` 实例却没有关联任何控制器时,默认情况下是不会自行激活渲染管线从而导致视觉效果缺失现象发生;因此必要时候记得手动开启其开关选项或者调整相关设置项以便正常显示预期成果出来[^4]。 --- #### 高级特性:跨帧插值与速度调节 对于更复杂的交互需求来说,我们还能够借助 API 对象属性来自定义某些行为表现形式。例如改变播放速率甚至反转方向等等都是可行之选。 - 设置播放速度: 修改 `speed` 属性可以让动画加速减速甚至是反向回放。 ```csharp float speedValue = -1f; // 设定负数表示逆序播放 if (myAnimation != null){ myAnimation.speed = speedValue; } ``` 以上就是关于如何运用 Unity 引擎内置资源库里的基础类目之一 —— “Animation” 进行开发制作过程中涉及到的一些常见技巧总结说明文档内容概览介绍完毕啦! ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值