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

Unity中点击GameObject时如何正确执行协程实现预制体延迟生成?

问题分析与解决方案

你的核心问题是协程和预制体生成的执行顺序逻辑错误:当前代码中,启动协程后会立刻同步执行Spawn函数,协程里的延迟只对后续的Debug.Log生效,完全没作用到预制体生成上。

修正方案

把预制体生成的Spawn调用移到协程的延迟语句之后,确保等待2秒后再执行生成操作。同时可以提前缓存GameScript组件,避免重复调用GetComponent影响性能。

修改后的代码

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

public class EmptyScript : MonoBehaviour
{
    public int id;
    public GameObject camera;
    private GameScript _gameScript; // 缓存组件
    Coroutine coroutine;

    private void Awake()
    {
        // 提前获取组件,避免每次点击都调用GetComponent
        _gameScript = camera.GetComponent<GameScript>();
    }

    public IEnumerator DelaySpawn()
    {
        yield return new WaitForSeconds(2);
        Debug.Log("2 seconds");
        // 延迟后再执行预制体生成
        _gameScript.Spawn(this.gameObject, id);
    }

    private void OnMouseDown()
    {
        // 启动协程即可,Spawn的调用已经放到协程内部
        coroutine = StartCoroutine(DelaySpawn());
    }
}

额外说明

  • 如果需要支持中途取消延迟(比如重复点击时终止之前的协程),可以在OnMouseDown里先判断coroutine是否不为null,调用StopCoroutine(coroutine)再重新启动新的协程。
  • 确保camera对象上确实挂载了GameScript组件,且Spawn方法的逻辑没有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:38:11