简体   繁体   中英

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. Now I am using a Projectile to hit that enemy and disable both of them. 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. 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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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