【问题标题】:Respawn an enemy prefab after its destroyed在被摧毁后重生一个敌人的预制件
【发布时间】:2013-10-05 12:45:10
【问题描述】:
var respawn : Transform;
var dead : boolean = false;

function OnTriggerEnter(theCollision : Collider)
{
   if(theCollision.gameObject.name=="Spotlight") 
   {
     Destroy(gameObject);
     Debug.Log("Dead");
     dead = true;

   }
}


function Respawn()
{

    if(dead == true)
    {
       Instantiate(respawn, Vector3(0,0,0), Quaternion.identity);
    }

}

我很难让我的敌人重生,目前我只有一个敌人跟着我。在他撞到我的聚光灯后,我正试图重新生成他。

我有一个预制的 Enemy,一旦它被摧毁,我想用它来创建更多的 Enemy 实例。

我很确定我上面的代码正在破坏预制件本身,因此无法创建更多实例,但我不确定如何只破坏预制件的实例。上面的代码附在我的敌人身上。

【问题讨论】:

  • 你需要在你的重生者身上写一个脚本来跟踪活着的敌人,当所有人都死了,等一会儿再生成另一个。

标签: unity3d instance


【解决方案1】:

我很确定你正在使用脚本破坏 gameObject

if(theCollision.gameObject.name=="Spotlight") 
{
    Destroy(gameObject);
    Debug.Log("Dead");
    dead = true;
}

你应该有Destroy(theCollision.gameObject)

并在代码块的末尾销毁,而不是开始。

另外Respawn 函数应该在Update 或其他东西上才能工作,你也可以在销毁之前在触发器函数上调用Respawn,它应该每次都产生一个新函数。

不要忘记引用你的预制件Project窗口而不是Hierarchy

【讨论】:

  • 你能把它放在文本中,而不是图像中吗?
  • 我从原始代码中截取了截图...我没有修改它。我只是说应该改变一条线。
  • 是的,我认为这里需要以文本格式添加。图像中的文本不适用于剪贴板、搜索引擎机器人和屏幕阅读器,因此不是呈现代码的最佳方式。
【解决方案2】:

正如我在评论中所说,您需要跟踪敌人死亡后的时间,而最好的地方是在您的重生对象中。这是它的一个示例实现:

Respawner.js

#pragma strict

var enemyToSpawn : Enemy;
var respawnTime : int = 10; //In seconds.
private var dead : boolean = true;
private var deadTime : int = 0; //Time the enemy died, keep at 0
private var nextRespawn : int = 0; 

private function Respawn() {
    var enemy : GameObject = GameObject.Instantiate(enemyToSpawn.gameObject, transform.position, transform.rotation);
    enemy.GetComponent(Enemy).respawner = this;
}

function Update() {
    if (Time.time >= nextRespawn && dead) { //If the time is due and the enemy is dead
        Respawn(); //create a new enemy
        dead = false; //and tell our script it is alive
    }
}

function EnemyDied(theEnemy : Enemy) {
    dead = true;
    deadTime = Time.time;
    nextRespawn = Time.time+respawnTime;
    GameObject.Destroy(theEnemy.gameObject);
}

敌人.js

#pragma strict

public var respawner : Respawner; // The respawner associated with this enemy

function OnTriggerEnter(collision : Collider) {
    if (collision.gameObject.name.Equals("Spotlight")) {
        respawner.SendMessage("EnemyDied", this); //Tell the respawner to kill us
    }
}

当然,你的敌人职业将拥有成为真正敌人所需的任何其他东西,而你的重生者可能会产生影响。 这只是一个例子,不应盲目复制粘贴。

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2021-11-07
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多