首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不活动/非激活的GameObject上启动协同线

在不活动/非激活的GameObject上启动协同线
EN

Stack Overflow用户
提问于 2018-10-25 23:35:48
回答 2查看 6.6K关注 0票数 1

我有以下代码:

代码语言:javascript
复制
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 (或任意时间长度)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-25 23:54:36

您不能从已取消激活GameObject的脚本启动coroutine函数。

StartCoroutine函数是MonoBehaviour类下的函数。当您必须在已停用的GameObject上启动协同线时,您需要对具有活动GameObject的MonoBehaviour对象的引用。

实现此的两种方法

1。使用已经存在的不太可能被停用的GameObject。在我的情况下,我通常用相机。我访问相机的MonoBehaviour,因为它很可能被激活,然后使用它启动协同线功能。

我建议你用这种方法。

Start函数中的代码替换为以下代码:

代码语言:javascript
复制
//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 ):

代码语言:javascript
复制
public class YourDeactivatableScript: MonoBehaviour
{
    public IEnumerator Load()
    {
        yield return new WaitForSeconds(waitTime);
        gameObject.SetActive(true);
    }
}

现在,假设您想要禁用一个名为"Cube“的GameObject,该YourDeactivatableScript脚本附带了YourDeactivatableScript脚本,但是仍然能够启动它的Load协同器函数,用一个新脚本创建一个空的GameObject,然后从它启动Load函数。

创建一个空的GameObject,然后将这个脚本附加到它上:

代码语言:javascript
复制
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的脚本启动的。

票数 6
EN

Stack Overflow用户

发布于 2018-10-25 23:48:05

我所做的,以避免停止协同作用,是有一个游戏对象,不被停用。

代码语言:javascript
复制
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);

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52999487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档