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

