Reputation: 139
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);
}
}
}
Upvotes: 0
Views: 199
Reputation: 91
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.
Upvotes: 3