You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中SetActive(true)后如何禁用UI按钮动画?

问题描述

我有一个带动画的UI按钮,满足特定条件时会播放sprite1与sprite2切换的动画。按下该按钮后,其Sprite会变为sprite3,但通过代码执行SetActive(false)再重新SetActive(true)时,动画会自动播放,而我期望按钮保持显示sprite3。如何实现SetActive(true)后不让动画播放?

我的代码
using UnityEngine;
using UnityEngine.UI; 

public class ChangeClaim : MonoBehaviour
{
    [SerializeField] 
    private Animator Switch;

    [SerializeField] 
    private Image ClaimBut;

    [SerializeField] 
    private Sprite ButSprite;

    // Start is called before the first frame update
    void Update()
    {
        if (PlayerPrefs.GetInt("Compl1") == 1)
        {
            ClaimBut.sprite = ButSprite;
        }

        if (PlayerPrefs.GetInt("Complete1") == 1)
        {
            playSwitch();
        }
    }

    public void playSwitch()
    {
        if (PlayerPrefs.GetInt("Compl1") == 0)
        {
            Switch.SetTrigger("Start");
        }
    }

    public void StopSwitch()
    {
        Switch.SetTrigger("Stop");
        PlayerPrefs.SetInt("Compl1", 1);
    }
}
解决方案

方法1:通过Animator状态控制实现精准控制

  • 在Animator控制器中添加一个无动画的静止状态(命名为Idle_Sprite3),将该状态的Sprite设置为sprite3,并右键选择「Set as Layer Default State」,把它设为初始状态。
  • 在脚本中添加OnEnable方法,物体激活时直接根据状态切换到对应Animator状态:
    void OnEnable()
    {
        int complState = PlayerPrefs.GetInt("Compl1");
        if (complState == 1)
        {
            // 直接切换到显示sprite3的静止状态,跳过动画
            Switch.Play("Idle_Sprite3");
            ClaimBut.sprite = ButSprite;
        }
        else
        {
            // 未完成时正常触发动画逻辑
            if (PlayerPrefs.GetInt("Complete1") == 1)
            {
                playSwitch();
            }
        }
    }
    
  • 移除Update中每帧重复设置Sprite的逻辑,避免性能浪费,只在OnEnable和StopSwitch中设置即可。

方法2:临时禁用Animator组件

  • 在激活物体后,根据状态判断是否禁用Animator,阻止其自动播放初始动画:
    // 假设你在其他地方激活物体的代码:
    gameObject.SetActive(true);
    if (PlayerPrefs.GetInt("Compl1") == 1)
    {
        Switch.enabled = false;
        ClaimBut.sprite = ButSprite;
        // 如果后续需要再次播放动画,再手动开启Animator:Switch.enabled = true;
    }
    
    这种方法适合按钮已完成交互、无需再播放动画的场景。

方法3:调整Animator组件设置

  • 在Animator组件的Inspector面板中,取消勾选「Apply Root Motion」(如果不需要该功能),避免物体激活时的状态重置问题。
  • 确保Animator控制器中,对应sprite3的状态是优先级最高的静止状态,激活时直接进入该状态而非动画状态。

内容的提问来源于stack exchange,提问作者Chris der Hov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:32:43