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

Unity脚本触发Toast黄油动画(YellowFade)无法播放问题求助

问题排查与修复方案

先逐个梳理你代码里的几个关键问题,这些是导致动画没触发的主要原因:

1. Animation组件获取错误

你当前是获取Toast脚本所在物体的Animation组件,但YellowFade动画应该是挂载在全屏黄色面板的yellow对象上的。你现在调用anim.Play("YellowFade")其实是在错误的物体上播放动画,自然看不到效果。

2. 计时器未重置

当计时器超过2.5秒触发动画后,myTimer没有被重置。下次再触发isCounting = true时,计时器会直接满足myTimer > 2.5f的条件,导致逻辑混乱,可能重复触发或者直接跳过计时。

3. 射线检测的方向向量错误

new Ray(transform.position, transform.forward * 100)里的方向向量被放大了100倍,Ray的方向应该是单位向量。正确的做法是在Physics.Raycast里指定检测距离,而不是放大方向。

4. 无用变量冗余

cam变量被获取但从未使用,属于冗余代码,可以直接删除。


修正后的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Toast : MonoBehaviour
{
    Ray ray;
    RaycastHit raycastHit;
    public GameObject ButterIt;
    private float myTimer = 0f;
    private bool isCounting = false;
    // 改为获取yellow对象的Animation组件
    private Animation yellowAnim;
    public GameObject yellow;

    void Start()
    {
        // 获取yellow对象上的Animation组件
        yellowAnim = yellow.GetComponent<Animation>();
        yellow.SetActive(false);
    }

    void Update()
    {
        // 射线方向用单位向量,检测距离单独传参
        ray = new Ray(transform.position, transform.forward);
        if (Physics.Raycast(ray, out raycastHit, 100f))
        {
            if (raycastHit.transform.tag == "Death")
            {
                ButterIt.SetActive(true);
                if (Input.GetKeyDown(KeyCode.F))
                {
                    Debug.Log("Stop Touching My Junk You Pervert! - Tickle Me Bender");
                    // 开始计时前重置计时器
                    myTimer = 0f;
                    isCounting = true;
                }
            }
            else
            {
                ButterIt.SetActive(false);
                // 离开目标时停止计时并重置
                isCounting = false;
                myTimer = 0f;
            }
        }
        else
        {
            // 没有检测到任何物体时也关闭提示并重置计时
            ButterIt.SetActive(false);
            isCounting = false;
            myTimer = 0f;
        }

        if (isCounting)
        {
            myTimer += Time.deltaTime;
        }

        if (myTimer > 2.5f)
        {
            yellow.SetActive(true);
            Debug.Log("WEE WOO WEE WOO - Patrick");
            isCounting = false;
            // 在正确的对象上播放动画
            yellowAnim.Play("YellowFade");
            // 重置计时器,避免重复触发
            myTimer = 0f;
        }
    }
}

额外注意事项

  • 确保yellow对象是一个全屏的UI面板(比如Image),并且已经添加了Animation组件,其中包含名为YellowFade的动画剪辑(动画要设置面板的透明度从0渐变到1,或者颜色从透明黄变实黄)。
  • 检查Death标签是否正确挂在吐司对象上,避免射线检测不到目标。
  • 测试时可以把myTimer > 2.5f改成更小的值(比如0.5f),方便快速验证动画是否正常播放。

内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:37:07