
要在 Unity 中实现此内容,那么在操作前,请删除场景中的 AI,并在删除之前将其转换为预制件。
完成必要的工作之后,接着3D天堂将创建 Spawn Manager 脚本并将其附加到 Spawn Manager 游戏对象。
如下所示:

转到 Spawn Manager 并创建名为 _instance 的 Spawn Manager 类的静态变量。
如下所示:
public class SpawnManager : MonoBehaviour
{
private static SpawnManager instance;
}
接着创建一个名为 Instance 的 Spawn Manager 变量的静态公共属性,并使用大写字母。
private static SpawnManager instance;
{
}
这里还需要获取上述属性中的 _instance,使用 get 访问器执行此操作,然后需要检查 _instance 是否为 null。
如果它是 null 则抛出一个错误或者不是则返回实例。
public class SpawnManager : MonoBehaviour
{
private static SpawnManager _instance;
public static SpawnManager Instance
{
get
{
if (_instance == null)
{
Debug.Log("SpawnManager is Null:");
}
return _instance;
}
}
}
在这一步中需要初始化实例,在 Awake 方法中这样做,当场景加载时,说实例等于附加到这个游戏对象的这个脚本。
如下所示:
private void Awake()
{
_instance = this;
}
接着创建一个名为 AIPrefab 的 AI 预制件并将其序列化,以便能够在检查器中拖放 ai。
如下所示:
[SerializeField]
private GameObject _aiPrefab;
每 5 秒创建一个协程并实例化 AI。
private IEnumerator SpawnAIRoutine()
{
Instantiate(_aiPrefab,transform.position,Quaternion.identity);
yield return new WaitForSeconds(5f);
}
现在创建一个名为 SpawnEnemy 的公共方法,然后在那里创建一个名为 SpawnAIRoutine 的 startCoroutine。
public void SpawnEnemy()
{
StartCoroutine(SpawnAIRoutine());
}
为确保 AI 在第一个路径点生成,请创建一个转换变量并将其序列化。当实例化 ai 时,它会使 ai 在生成点位置实例化。
如下所示:
[serializeField]
private Transform _spawnPoint;
public static SpawnManager Instance
{
get
{
if (_instance == null)
{
Debug.Log("SpawnManager is Nul1:");
}
return _instance;
}
}
private void Awake()
{
_instance = this;
}
private IEnumerator SpawnAIRoutine()
{
Instantiate(_aiPrefab,_spawnPoint.position, Quaternion.identity);
yield return new WaitForSeconds(5f);
}
转到 AI 脚本并在更新方法中调用此函数。
void update()
{
SpawnManager. Instance.SpawnEnemy();
}
最好的做法是在 Unity 游戏管理器中调用这个方法,这样做是因为如果杀死第一个 AI,这个 AI 在项目文件夹中,下一个 AI 不会在下一帧实例化,所以调用此方法以确保始终实例化 AI 是最佳做法。
public class GameManager : MonoBehaviour
{
private static GameNanager _instance;
public static GameManager Instance
{
get
{
if (_instance == null)
{
Debug.LogError("Game Manager is Null");
}
return _instance;
}
}
private void Awake()
{
_instance = this;
}
private void Update()
{
SpawnManager.Instance.SpawnEnemy();
}
}
但…这样做是行不通的,因此要解决此重复问题,将生成点 A 重命名为生成位置,然后获取生成点 A 和 J,然后将它们拖放到 AI 中。然后在选择 AI 时将第一个和最后一个航路点添加到检查器中。
注意:如果用了很多出生点,把它们全部拿走,这里只用了 A 和 J。

但是这样玩会出现一个问题,因为每帧会生成 1 个敌人,所以你的 PC 每秒运行 60 帧,将有 60 个敌人。
要解决这个问题,可以创建一个名为 isAIspawned 的 bool 变量,然后转到 SpawnAIRoutine,在实例化后将 bool 设置为 true,然后在等待 5 秒后将其设置为 false。
如下所示:
private bool _isAISpawned;
private IEnumerator SpawnAIRoutine()
{
Instantiate(_aiPrefab,_spawnPoint.position,_spawnPoint.rotation);
_isAISpawned = true;
yield return new waitForSeconds(5f);
_isAISpawned = false;
}
最后转到 SpawEnemy 方法中的 Spawn Manager 脚本,检查 isAISpawned 变量是否等于 false 然后 StartCoroutine “SpawnAIRoutine”。
public void SpawnEnemy()
{
if (_isAISpawned ==false)
{
StartCoroutine(SpawnAIRoutine());
}
}
下面是3D天堂制作的最终结果,一起看看效果。

…
以上是关于框架下制作Spawn Manager的全部内容,如果你有任何反馈,请随时在本页面下方留言。