简体   繁体   English

从调用后停用的脚本中调用协程后如何继续

[英]How can I continue Coroutine after calling it from a script that I deactivated after that call

I have a Coroutine in a class Enamy that is attached to a gameobject. 我在与Enamy对象相连的Enamy类中有一个协程。 Now I am using a Projectile to hit that enemy and disable both of them. 现在,我正在使用Projectile击中该敌人并将其禁用。 The problem is that I don't want to deactivate the projectile in the same time as the enemy. 问题是我不想与敌人同时停用弹丸。 The enemy has some special effects that need to be executed before disable. 敌人有一些特殊效果,需要在禁用之前执行。

To solve this problem I come up with this: 为了解决这个问题,我想出了这个:

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

public class Enamy : MonoBehaviour {

    public IEnumerator DestroyEnamy()
    {
        yield return new WaitForSeconds(1f);
        Debug.Log("Execute after 1 second");
        gameObject.SetActive(false);
    }
}

I want to call the DestroyEnamy coroutine in the Projectile class than deactivate the Projectile class while still continuing the DestroyEnamy coroutine. 我想在抛射类中调用DestroyEnamy协程,而不是在继续继续DestroyEnamy协程的同时停用Projectile类。 However that is not happening, the coroutine is executed only if I keep the Projectile class enabeled, if I disable before the ending of the coroutine it executes the first part of the coroutine then after the "Projectile" gameObject is disabeled the coroutine stops as well. 但是这没有发生,只有在我保持Projectile类启用的情况下,协程才会执行,如果在协程结束之前禁用它,它将执行协程的第一部分,然后在取消“ Projectile” gameObject之后,协程也会停止。

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

public class Projectile : MonoBehaviour
{

    private bool firstCollision = false;

    private void OnEnable()
    {
        firstCollision = false;
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (!firstCollision)
        {
            //if the projectile has landed a hit
            firstCollision = true;

            Transform colliderTransform = collision.transform;

            if (colliderTransform.CompareTag("Enamy")) 
            {
                Score.UpdateMainScore(20);
                Score.UpdateProjCount(1);
                colliderTransform.gameObject.SetActive(false);
            }
            gameObject.SetActive(false);
        }
    }
}

Well, not entirely sure if this is what you want but your problem is order of operations, so to solve it you could wrap the coroutine in another function and get the component from the collision object and call the function that will invoke the coroutine 好吧,不是完全确定这是否是您想要的,但是您的问题是操作顺序,因此要解决此问题,您可以将协程包装在另一个函数中,并从碰撞对象中获取组件,然后调用将调用协程的函数

public class test : MonoBehaviour
{
    public void CallDestroy ()
    {
        StartCoroutine (DestroyThis ());
    }
    public IEnumerator DestroyThis ()
    {
        yield return new WaitForSeconds (1f);
        Debug.Log ("Execute after 1 second");
        gameObject.SetActive (false);
    }
}

and your projectile like this 这样子弹

public class testTwo: MonoBehaviour
{

    public void OnCollisionEnter (Collision other)
    {
        if (other.transform.CompareTag ("Enemy"))
        {
            other.transform.GetComponent<test> ().CallDestroy ();
            this.gameObject.SetActive (false);
        }
    }
}

Although instead of comparing tag, you should probably check that the component is there. 尽管您不应该比较标记,但应该检查一下组件是否在那里。

if (other.transform.GetComponent<test> () != null)

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM