Unity脚本触发吐司涂黄油动画失败问题求助
涂吐司屏幕变黄动画播放问题及解决方案
需求
实现涂吐司时播放屏幕变黄的动画,完成后切换场景。
现有代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Toast : MonoBehaviour { Ray ray; RaycastHit raycastHit; public Camera cam; public GameObject ButterIt; private float myTimer = 0f; private bool isCounting = false; private Animation anim; public GameObject yellow; void Start() { cam = GetComponent<Camera>(); anim = gameObject.GetComponent<Animation>(); yellow.SetActive(false); } void Update() { ray = new Ray(transform.position, transform.forward * 100); if (Physics.Raycast(ray, out raycastHit)) { if (raycastHit.transform.tag == "Death") { ButterIt.SetActive(true); if (Input.GetKeyDown("f")) { Debug.Log("Stop Touching My Junk You Pervert! - Tickle Me Bender"); isCounting = true; } } else { ButterIt.SetActive(false); } } if (isCounting) { myTimer += Time.deltaTime; } if (myTimer > 2.5f) { yellow.SetActive(true); Debug.Log("WEE WOO WEE WOO - Patrick"); isCounting = false; anim.Play("YellowFade"); } } }
遇到的报错
- Animation组件使用的AnimationClip "YellowFade"必须标记为legacy;
- 将其设为legacy后触发动画,提示主相机未附加动画;
- 尝试添加动画时,提示legacy片段不允许在Animator控制器中使用。
解决方案
方案1:改用Animator组件(推荐,Unity现代工作流)
这是Unity目前主推的动画方案,彻底规避Legacy的兼容性问题:
- 移除挂载Toast脚本的GameObject上的
Animation组件,添加Animator组件。 - 右键项目面板 → Create → Animator Controller,创建新控制器并拖入Animator组件的
Controller字段。 - 打开Animator窗口,创建默认空状态,将
YellowFade动画(保持非Legacy状态)拖入窗口,设置为该状态的动画片段。 - 修改代码中的动画逻辑:
- 替换
private Animation anim;为private Animator anim; - Start方法中改为
anim = GetComponent<Animator>(); - 播放动画时调用
anim.Play("YellowFade");
- 替换
方案2:修复Legacy Animation组件问题
如果一定要保留Legacy动画:
- 选中
YellowFade动画文件,在Inspector面板勾选Legacy选项。 - 确保挂载Toast脚本的GameObject上已添加
Animation组件,并且把YellowFade动画拖入组件的Clips列表。 - 检查代码中
anim = gameObject.GetComponent<Animation>();是否正确获取组件——若脚本没挂在主相机上,需确认挂载对象有Animation组件。 - 播放动画时可先做合法性判断:
if(anim != null && anim.GetClip("YellowFade") != null) anim.Play("YellowFade");
额外优化建议
- 屏幕变黄效果可以简化:在主相机下添加全屏UI Image(黄色),用Animator控制其透明度从0到1再到0,无需单独的yellow GameObject。
- 动画完成后切换场景,可在动画末尾添加动画事件,调用
SceneManager.LoadScene("目标场景名");,记得在代码顶部引入using UnityEngine.SceneManagement;。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

