【问题标题】:Respawn AI after destroy摧毁后重生 AI
【发布时间】:2021-01-13 01:10:31
【问题描述】:

我是新手,在他被摧毁后我很难重生我的 AI(现在他只是一个跟随我的玩家的立方体)。我相信这是因为脚本位于被破坏的对象上。但是我需要做什么才能重生它?

(虽然我确定我的重生代码不好:\(它是 mobile-android 项目))

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyTesting : MonoBehaviour
{

    [SerializeField]
    public GameObject player;
    public GameObject enemy;
    private Rigidbody body;

    Vector3 accelerationDir;

    // Use this for initialization
    void Start()
    {
        body = GetComponent<Rigidbody>();
    }
    private void Update()
    {
        accelerationDir = Input.acceleration;

        if (accelerationDir.sqrMagnitude>=5)
        {
            EnemyDead();
        }
    }

    void EnemyDead()
    {

        Destroy(enemy);
        Invoke("Respawn", 5);
    }
    void Respawn()
    {
        enemy = (GameObject)Instantiate(enemy);
        enemy.transform.position = transform.position;
    }
   

    // Update is called once per frame
    void FixedUpdate()
    {
        Vector3 toTarget = player.transform.position - transform.position;
        float speed = 1.5f;

        transform.Translate(toTarget * speed * Time.deltaTime);
    }
}

非常感谢!

【问题讨论】:

  • 您正在破坏enemy 实例.. 那么您想如何在5 秒后将其用作Instantiate 的预制件?不如只将其设置为非活动/活动而不销毁和重生它呢?
  • 但是我想重生它,如果它不活跃并且反应迟钝,它只会从他不活跃的地方激活它。
  • 将其设置为非活动状态 -> 移动到新位置 -> 如果需要(如健康等)重置其他值 -> 设置为活动状态 .... => 就像重生一样,实际上不会造成开销销毁和实例化

标签: c# unity3d


【解决方案1】:

我假设您的 enemy GameObject 位于包含您的 EnemyTesting MonoBehaviour 实例的场景中(如果我错了,请纠正我)。

如果是这种情况,您将无法实例化已销毁的游戏对象。

正如@derHugo 指出的那样,you should not use Destroy and Instantiate for your use case。最好将enemy GameObject 设置为非活动状态,将其移动到您想要的位置,然后(重新)将其设置为活动状态。看起来敌人重生了。

如果以后想深挖话题,看object pooling game optimization pattern


否则,如果您仍想使用 Instantiate 进行重生,我会在您的 enemy GameObject 中使用 create a prefabEnemyTesting 字段(在 Inspector 视图中)中引用的 enemy GameObject 将是项目层次结构中的预制件,而不是场景中的 GameObject。

这样,您可以根据需要多次实例化enemy GameObject(并在其他场景中使用它!)。不要忘记保存对实例化的enemy GameObject 的引用,这样您就可以知道要销毁哪个。它看起来像这样:

enemy = Instantiate(enemyPrefab, transform.position, transform.rotation);

您可以将transform 替换为您选择的变换,例如场景中空enemyRespawnPoint 游戏对象的变换。

您在控制台中看到任何错误吗?

【讨论】:

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