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

