Unity场景过渡开发报错:FunctionTimer不存在于当前上下文求解决
Unity报错“FunctionTimer does not exist in the current context”解决
问题描述
尝试复刻YouTube视频中的Unity场景过渡加载代码时,始终出现报错“FunctionTimer does not exist in the current context”,原代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManager; public class GameManager : MonoBehaviour { [SerializeField] private GameObject _startingSceneTransition; [SerializeField] private GameObject _endingSceneTransition; private void Start() { _startingSceneTransition.SetActive(true); FunctionTimer.Create(DisableStartingSceneTransition, timer: 5f); } private void DisableStartingSceneTransition() { _startingSceneTransition.SetActive(false); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { _endingSceneTransition.SetActive(true); FunctionTimer.Create(LoadNextLevel, timer: 1.5f); } } private static void LoadNextLevel() { SceneManager.LoadScene("menu"); } }
错误原因
FunctionTimer不是Unity引擎的内置类,它是视频作者自行封装的自定义工具类。你的项目中没有添加这个类的定义,因此编译器无法识别该类型,导致报错。
修复方案
方案1:实现自定义FunctionTimer类
如果要完全复刻视频逻辑,可以手动实现一个简单的FunctionTimer类,代码如下:
using UnityEngine; using System; public class FunctionTimer : MonoBehaviour { public static void Create(Action action, float timer) { GameObject timerObj = new GameObject("FunctionTimer"); timerObj.AddComponent<FunctionTimerBehaviour>().Initialize(action, timer); } private class FunctionTimerBehaviour : MonoBehaviour { private Action _action; private float _timer; public void Initialize(Action action, float timer) { _action = action; _timer = timer; } private void Update() { _timer -= Time.deltaTime; if (_timer <= 0) { _action?.Invoke(); Destroy(gameObject); } } } }
将该脚本放入Unity项目中,原GameManager代码即可正常运行。
方案2:使用Unity原生协程替代
若不想额外维护自定义类,可直接用Unity内置的协程实现延迟调用,修改后的GameManager代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManager; public class GameManager : MonoBehaviour { [SerializeField] private GameObject _startingSceneTransition; [SerializeField] private GameObject _endingSceneTransition; private void Start() { _startingSceneTransition.SetActive(true); StartCoroutine(DelayCall(DisableStartingSceneTransition, 5f)); } private void DisableStartingSceneTransition() { _startingSceneTransition.SetActive(false); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { _endingSceneTransition.SetActive(true); StartCoroutine(DelayCall(LoadNextLevel, 1.5f)); } } private static void LoadNextLevel() { SceneManager.LoadScene("menu"); } // 通用延迟调用协程 private IEnumerator DelayCall(System.Action action, float delay) { yield return new WaitForSeconds(delay); action?.Invoke(); } }
该方案无需额外类,利用Unity原生API即可实现相同的延迟执行效果。
内容的提问来源于stack exchange,提问作者Alfashock
相关产品推荐
相关产品推荐

