我有以下代码:
void Start()
{
gameObject.SetActive(false);
StartCoroutine(Load());
}
IEnumerator Load()
{
yield return new WaitForSeconds(waitTime);
gameObject.SetActive(true);
}这给了我一个错误,它说:
无法启动Coroutine,因为游戏对象'NameOfObj‘是不活动的!
这是有意义的,因为游戏对象在运行脚本之前已经被设置为停用。即便如此,那我该怎么办呢?我试着把gameObject.SetActive(false)移到协同线,在WaitForSeconds()之前。这样做完全阻止了游戏对象的加载。
据我理解,当执行行gameObject.SetActive(false)时,脚本将停止运行,直到游戏对象被重新激活。但是,如果是这样的话,是否不可能重新激活游戏对象(因为脚本被禁用了)?
无论如何,在游戏开始后,我如何将我的游戏对象从加载延迟到2-3 (或任意时间长度)?
发布于 2018-10-25 23:54:36
您不能从已取消激活GameObject的脚本启动coroutine函数。
StartCoroutine函数是MonoBehaviour类下的函数。当您必须在已停用的GameObject上启动协同线时,您需要对具有活动GameObject的MonoBehaviour对象的引用。
实现此的两种方法
1。使用已经存在的不太可能被停用的GameObject。在我的情况下,我通常用相机。我访问相机的MonoBehaviour,因为它很可能被激活,然后使用它启动协同线功能。
我建议你用这种方法。
将Start函数中的代码替换为以下代码:
//De-activate this GameObject
gameObject.SetActive(false);
//Get camera's MonoBehaviour
MonoBehaviour camMono = Camera.main.GetComponent<MonoBehaviour>();
//Use it to start your coroutine function
camMono.StartCoroutine(Load());2。将脚本附加到空GameObject上,则空GameObject上的脚本将控制或能够激活/取消激活另一个GameObject。
在非激活的GameObject上运行coroutine函数的脚本(将其附加到希望去激活的GameObject ):
public class YourDeactivatableScript: MonoBehaviour
{
public IEnumerator Load()
{
yield return new WaitForSeconds(waitTime);
gameObject.SetActive(true);
}
}现在,假设您想要禁用一个名为"Cube“的GameObject,该YourDeactivatableScript脚本附带了YourDeactivatableScript脚本,但是仍然能够启动它的Load协同器函数,用一个新脚本创建一个空的GameObject,然后从它启动Load函数。
创建一个空的GameObject,然后将这个脚本附加到它上:
public class LoadFuncCallerScript: MonoBehaviour
{
GameObject targetObject;
public void Start()
{
//Find the GameObject you want to de-activate
targetObject = GameObject.Find("Cube");
//De-activate it
targetObject.SetActive(false);
//Get it's component/script
YourDeactivatableScript script = targetObject.GetComponent<YourDeactivatableScript>();
//Start coroutine on the other script with this MonoBehaviour
StartCoroutine(script.Load());
}
}协同线现在是从另一个名为LoadFuncCallerScript的脚本启动的。
发布于 2018-10-25 23:48:05
我所做的,以避免停止协同作用,是有一个游戏对象,不被停用。
public class CoroutineHandler : MonoBehaviour
{
private static CoroutineHandler instance = null;
public static CoroutineHandler Instance
{
get
{
if(instance == null)
{
GameObject inst = new GameObject("CoroutineHandler");
DontDestroyOnLoad(inst);
instance = inst.AddComponent<CoroutineHandler>();
}
return instance;
}
}
}然后,通过使用CoroutineHandler.Instance.StartCoroutine(RoutineMethodHere());,将其用于此类协同。
如果您不想要这样的东西,因为如果处理不当,可能出错或导致泄漏,您可以尝试使用Invoke("MethodName", delay);。
https://stackoverflow.com/questions/52999487
复制相似问题