我在类Enamy
中有一个附加到游戏对象的Coroutine。现在我使用Projectile
击中敌人并禁用它们。问题是我不想在与敌人同时停用射弹。敌人有一些特殊效果需要在禁用之前执行。
为了解决这个问题,我提出了这个问题:
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);
}
}
我想在Projectile类中调用DestroyEnamy
协程,而不是在继续Projectile
协程的情况下停用DestroyEnamy
类。然而,这没有发生,只有当我保持Projectile
类被禁用时才执行协程,如果我在协程结束之前禁用它执行协程的第一部分然后在“Projectile”游戏对象被取消之后协程也停止了。
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);
}
}
}
答案 0 :(得分:3)
好吧,不完全确定这是否是你想要的,但你的问题是操作顺序,所以要解决它你可以将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);
}
}
和你的射弹一样
public class testTwo: MonoBehaviour
{
public void OnCollisionEnter (Collision other)
{
if (other.transform.CompareTag ("Enemy"))
{
other.transform.GetComponent<test> ().CallDestroy ();
this.gameObject.SetActive (false);
}
}
}
虽然不是比较标记,但您应该检查组件是否存在。
if (other.transform.GetComponent<test> () != null)
希望这有帮助。