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
相关产品推荐
相关产品推荐

