Untiy Image动画代码控制animation的播放(循环播放和单次播放)

本文介绍了如何在Unity中通过代码控制2D图像的动画播放,包括循环播放和单次播放,无需创建复杂的动画资源。提供了简洁的代码示例。

 有时,我们做U2D的时候美术会直接给到图,不想做动画的话就可以代码来控制播放了。

不多说,直接上代码。代码很简单就不多解释了。

///<summary>
///
///</summary>
public class AnimationComponent : MonoBehaviour
{
    [SerializeField]
    private Image image;
    [SerializeField]
    public List<Sprite> animationSprites = new List<Sprite>();
    public int index;
    public string path;
    private void OnEnable()
    {
        PlayAnimation();
    }

    private int AnimationAmount { get { return animationSprites.Count; } }
    public void PlayAnimation()
    {
        if (image == null) image = GetComponent<Image>();
        if (AnimationAmount < 1)
        {
            for (int i = 1; i < index; i++)
            {
                string spritePath = path + i;
                animationSprites.Add(Resources.Load<Sprite>(spritePath));

            }
        }
        StartCoroutine(PlayAnimationForwardIEnum());
    }

    //循环播放
    private IEnumerator PlayAnimationForwardIEnum()
    {
        int index = 0;//可以用来控制起始播放的动画帧索引
        gameObject.SetActive(true);
        while (true)
        {
            //当我们需要在整个动画播放完之后 重复播放后面的部分 就可以展现我们纯代码播放的自由性
            if (index < AnimationAmount - 1)
            {
                image.sprite = animationSprites[index];
                index++;
            }  
            else
            {
                index = 0;
            }
            yield return new WaitForSeconds(0.03f);//等待间隔 控制动画播放速度
        }
    }

    //播放一次
    private IEnumerator PlayAnimationOnce()
    {
        int index = 0;//可以用来控制起始播放的动画帧索引
        gameObject.SetActive(true);
        while (true)
        {
            //当我们需要在整个动画播放完之后 重复播放后面的部分 就可以展现我们纯代码播放的自由性
            if (index < AnimationAmount - 1)
            {
                image.sprite = animationSprites[index];
                index++;
            }
            yield return new WaitForSeconds(0.03f);//等待间隔 控制动画播放速度
        }
    }

}

许愿,出魔剑

<think>我们正在处理一个关于Unity中使用C#脚本控制Animator组件播放动画的问题。 根据引用[1]引用[2]提供的信息,我们可以知道: 1. 使用Animator组件需要先获取该组件(通常在Start方法中)。 2. 可以通过调用Animator的Play方法来播放指定的动画状态(需要知道动画状态的名称)。 3. 可以通过检测用户输入(如按下空格键)来触发动画播放。 另外,引用[1]中的代码示例展示了如何通过按键(空格键)触发播放名为"CubeMove"的动画状态。 因此,我们可以按照以下步骤编写代码: 1. 在类中声明一个Animator类型的私有变量。 2. 在Start方法中,使用GetComponent方法获取附加在同一游戏对象上的Animator组件,并赋值给该变量。 3. 在Update方法中,检测输入事件(例如按下空格键),然后调用Animator的Play方法播放动画。 注意:动画状态的名称必须与Animator Controller中设置的完全一致(包括大小写)。 此外,引用[2]提到Unity动画系统是基于权重的,支持混合、叠加动画等,但基本播放控制使用Play方法即可。 下面是一个完整的脚本示例:</think>### 在Unity中使用C#脚本控制Animator播放动画Unity中通过C#脚本控制Animator播放动画,主要涉及以下步骤: #### 1. **获取Animator组件** 在脚本中声明Animator变量,并在`Start()`或`Awake()`中获取组件: ```csharp private Animator animator; void Start() { animator = GetComponent<Animator>(); } ``` #### 2. **播放动画的三种核心方法** - **方法1:通过动画状态名播放** ```csharp void PlayAnimation(string stateName) { animator.Play(stateName); } ``` 调用示例:`PlayAnimation("Run")`(需确保Animator Controller中存在同名状态) - **方法2:通过触发器控制** 在Animator Controller中设置触发器参数: ```csharp void TriggerAnimation(string triggerName) { animator.SetTrigger(triggerName); } ``` 调用示例:`TriggerAnimation("JumpTrigger")` - **方法3:直接控制布尔参数** 适用于循环动画(如行走/奔跑): ```csharp void SetBoolAnimation(string paramName, bool value) { animator.SetBool(paramName, value); } ``` 调用示例:`SetBoolAnimation("IsRunning", true)` #### 3. **输入检测示例(空格键触发动画)** ```csharp void Update() { if (Input.GetKeyDown(KeyCode.Space)) { animator.Play("Jump_Animation"); // 或:animator.SetTrigger("Jump"); } } ``` #### 4. **关键注意事项** - ✅ 动画名称/参数名必须与Animator Controller中**完全一致**(区分大小写) - ✅ 确保游戏对象已附加Animator组件并绑定了有效的Animator Controller - ✅ 复杂动画建议使用**动画状态机**配合参数控制[^1][^2] - ❌ 避免每帧重复调用`Play()`,优先使用触发器或布尔参数 > 典型应用场景:角色移动、过场动画、交互反馈等。可通过`animator.speed`控制播放速度,或使用`CrossFade()`实现平滑过渡[^2]。 --- ### 相关问题 1. 如何在Unity中实现动画的平滑过渡混合? 2. Animator Controller中的LayerAvatar Mask有什么作用? 3. 如何通过代码动态修改Animator Controller的动画状态机? 4. Unity动画系统中的Root Motion是什么?如何启用?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值