【问题标题】:Stop allowing random.range to pick up the same spawnpoint. it causes the enemies to overlap over each other停止允许 random.range 拾取相同的生成点。它使敌人相互重叠
【发布时间】:2017-11-29 23:40:04
【问题描述】:

您好,我有一个敌人生成系统,它工作正常。但是敌人在同一点重叠,因为我使用的是 random.range,我在地图上有 4 个点,我希望每个敌人随机选择一个点。因此,我希望在生成敌人后,其他敌人只有 3 个选项可以生成,而不是 4 个。

这是我的代码:

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

public class Spawn : MonoBehaviour {

    // The enemy prefab to be spawned.
    public GameObject[] enemy;  

    //public Transform[] spawnPoints;         
    public List<Transform> spawnPoints = new List<Transform>();
    private float timer = 3;

    int index = 0;    
    List <GameObject> EnemiesList = new List<GameObject>();
    private int m_enemyCount = 4;

    // Update is called once per frame
    void Update () {
        if (timer >0)
        {
            timer -= Time.deltaTime;
        }
        if (timer <= 0 )
        {               
            if ( EnemiesList.Count == 0 )
            {
                Spawner();  
                timer = 5;
            }
        }
    }

    void Spawner ()
    {
        // Create an instance of the enemy prefab at the randomly selected spawn point's position.
        //Create the enemies at a random transform 
        for (int i = 0; i<m_enemyCount;i++)
        {
            int spawnPointIndex = Random.Range (0, spawnPoints.Count);
            Transform pos = spawnPoints[spawnPointIndex];

            GameObject InstanceEnemies= Instantiate ( enemy[index] , spawnPoints[spawnPointIndex].position , Quaternion.identity) as GameObject;

            // Create enemies and add them to our list.
            EnemiesList.Add(InstanceEnemies);               
        }
    }

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    处理此问题的一种简单方法是在您的 Spawner() 方法中创建本地生成点列表,以便您可以跟踪已使用的生成点。例如:

    void Spawner ()
    {
        //create a local list of spawn points
        List<Transform> availablePoints = new List<Transform>(spawnPoints);
    
        // Create an instance of the enemy prefab at the randomly selected spawn point's position.
        //Create the enemies at a random transform 
        for (int i = 0; i<m_enemyCount;i++)
        {
            //use local availableSpawnPoints instead of your global spawnPoints to generate spawn index
            int spawnPointIndex = Random.Range (0, availableSpawnPoints.Count);
            Transform pos = spawnPoints[spawnPointIndex];
    
            GameObject InstanceEnemies= Instantiate ( enemy[index] , avaialableSpawnPoints[spawnPointIndex].position , Quaternion.identity) as GameObject;
    
            // Create enemies and add them to our list.
            EnemiesList.Add(InstanceEnemies);
    
           //remove the used spawnpoint
           availableSpawnPoints.RemoveAt(spawnPointIndex);
    
        }
    }
    

    此解决方案可确保您的全局生成点列表在您下次调用 Spawner() 方法时保持不变。

    【讨论】:

    • 哦,但是现在当我的敌人死去时,我得到这个错误参数超出范围。
    • 哎呀,我的错!请参阅我的更新答案。我忘记在 Spawner() 方法中新建一个列表,而不是直接复制 spawnPoints。这应该可以解决您的问题
    • 通过添加更新,敌人再次相互重叠 D:
    • 看起来实例化使用的是全局 spawnPoints 而不是 availableSpawnPoints。我已经更新了答案,希望是最后一次! :D
    • 更正:)你摇滚:D
    【解决方案2】:

    在 for 循环的末尾从列表 spawnPoints 中删除已获取的生成点,如下所示:

    spawnPoints.RemoveAt(spawnPointIndex);
    

    您可能希望在 for 循环之前创建该列表的副本,但要保持原样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2011-07-03
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多