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

Unity使用Invoke调用CollisionHandler.NextScene方法无法执行报错如何解决

问题原因

你代码中用于场景切换的NextScene、ReloadScene,以及触发流程的SuccessSequence、CrashSequence都被定义在了OnCollisionEnter方法内部,属于C#的本地函数。Unity的Invoke系列API是基于类成员反射实现的,无法识别嵌套在方法内部的本地函数,因此找不到目标调用方法,抛出对应报错。

修复方案

将上述4个方法从OnCollisionEnter内部移出,作为CollisionHandler类的成员方法即可,修复后的完整代码如下:

using UnityEngine;
using UnityEngine.SceneManagement;

public class CollisionHandler : MonoBehaviour
{
    [SerializeField] AudioClip success;
    [SerializeField] AudioClip crash;

    [SerializeField] ParticleSystem successParicle;
    [SerializeField] ParticleSystem crashParicle;

    AudioSource audioSource;
    float delayTime = 2f;

    bool isTransitioning = false;
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    void OnCollisionEnter(Collision other)
    {
        if(isTransitioning)
        {
            return;
        }
        switch (other.gameObject.tag)
        {
            case "Friendly":
                Debug.Log("It's OK friend");
                break;
            case "Finish":
                SuccessSequence();
                break;
            default:
                CrashSequence();
                break;
        }
    }

    void SuccessSequence()
    {
        isTransitioning = true;
        audioSource.Stop();
        successParicle.Play();
        audioSource.PlayOneShot(success);
        GetComponent<Shutle>().enabled = false;
        Invoke(nameof(NextScene), delayTime);
    }

    void CrashSequence()
    {
        isTransitioning = true;
        audioSource.Stop();
        crashParicle.Play();
        audioSource.PlayOneShot(crash);
        GetComponent<Shutle>().enabled = false;
        Invoke(nameof(ReloadScene), delayTime);
    }

    void ReloadScene()
    {
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentSceneIndex);
    }

    void NextScene()
    {
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        int nextSceneIndex = currentSceneIndex + 1;
        if(nextSceneIndex == SceneManager.sceneCountInBuildSettings)
        {
            nextSceneIndex = 0;
        }
        SceneManager.LoadScene(nextSceneIndex);
    }
}

额外提示:代码中获取操控组件时写的Shutle大概率是拼写错误,正确应为Shuttle,如果后续出现找不到组件的报错可以优先检查此处拼写。

内容的提问来源于stack exchange,提问作者H. Motsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:54:03