【问题标题】:Destroying Clone in Unity在 Unity 中销毁克隆
【发布时间】:2014-12-14 20:58:06
【问题描述】:

大家好,我有点卡在这里。我在随机时间有我的 gameObject Enemy Spawn。但问题是我只希望敌人在游戏中停留 5 秒。问题是我根本无法破坏对象。在这里,我编写了这段代码来尝试销毁 Enemy Object:

public class SpawnManager : MonoBehaviour {

public GameObject Enemy;
public float mytimer;
public float enemyHealth = 5.0f;

void Start()
{
    GameObject player = GameObject.Find("Player");
}

void spawnEnemy() {
    Transform enemy;
    GameObject enemySpawnPoint = GameObject.Find("EnemySpawn");
    enemy =  Instantiate(Enemy,enemySpawnPoint.transform.position,enemySpawnPoint.transform.rotation) as Transform; 
}

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.name == "EnemyTrigger") {
        mytimer = Random.Range(0,10);
        //Debug.Log("Now Destroying");
        Invoke("spawnEnemy", mytimer);
        Debug.Log("Spawn Normal");

        if(Enemy.name == "BloodyMary(Clone"){
            Destroy(Enemy, enemyHealth);
            Debug.Log("Now Destroying");
        }
        }
    }

    }

每次我遇到触发器时,它都会产生一个“BloodyMary(克隆)”,我正试图摧毁它。有什么建议吗?

【问题讨论】:

  • 所提供的任何答案是否正确回答了您的问题?

标签: c# unity3d clone destroy


【解决方案1】:

在我看来,让敌人处理自己的毁灭会更有意义。这意味着敌人要为自己的持续时间负责

我会创建一个co-routine,它会简单地等待 5 秒,然后调用 Destroy(gameObject) 函数来销毁自己。它可能看起来像这样:

IEnumerator DeathTimer(float duration)
{
    yeild return new WaitForSeconds(duration);
    Destroy(gameObject);
}

然后在你的“Start()”方法中,我会调用协同程序(不是作为普通方法完成的)。这将使用类似这样的东西来完成:

void Start()
{
    // calls the coroutine to start
    StartCoroutine("DeathTimer", duration);
}

注意:通过使用字符串调用协程(如上),您可以调用 "StopCoroutine("MethodName");"这将随时停止协程。这比将方法参数传入 StartCoroutine() 更好。

这意味着你的刷怪笼现在完全负责生成敌人,如果它们持续太久,它们会为自己的死亡负责。这样您就不会尝试在生成器上管理多个敌人,也无需担心在那里跟踪它们。

前几天我有一个朋友问了一个非常相似的问题,他用了这个,效果很好。

【讨论】:

  • 我在第一个代码sn-ps中编辑了语法,有朋友指出有点不对。
【解决方案2】:

上面写着的代码:

Invoke ("spawnEnemy", myTimer);

正在调用您的 spawnEnemy() 函数,该函数会创建另一个 Enemy 克隆。它还使用延迟计时器进行呼叫。

如果您不想要另一个敌人,只需删除该部分代码


你也在用计时器破坏。您可以使用Destroy(Enemy) 立即销毁。

【讨论】:

  • @Ghostdre 如果我的回答解决了您的问题,您可以接受它让其他人知道它已解决。如果我没有,请告诉我。
  • 谁对我的回答投了反对票,请解释一下。如果你提出一个有效的观点,我很乐意删除我的答案。但是,我知道我的答案是正确的。
  • 我不明白这怎么可能值得投反对票。不确定是谁做的,但作为最小的答案值得一票。我唯一要说的是,问题是关于 5 秒后销毁,而您的答案是针对每 5 秒生成一次。过去,有一个 +1。
  • @BlueHat 谢谢。我看到类似的事情发生在你身上。也 +1。
  • 谢谢。不过没关系,答案似乎解决了问题。希望它能帮助其他人。
【解决方案3】:

我看到一个错字,因为您错过了名称检查的右括号。 linter 没有选择它的原因是括号在字符串中,所以对于程序来说,检查“bloodymary(clone”而不是“bloodymary(clone)”似乎是完全合理的。

【讨论】:

    【解决方案4】:

    解决方案很简单。

    在您启动该游戏对象后使用Destroy(gameobject,5);

    例子

    <-- line initiate gameobject -->
    Destroy(gameobject,5);
    

    哪个 5 是游戏对象销毁前的第二个目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多