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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:04:55