【问题标题】:(Unity) To remove from a Transform array(Unity) 从 Transform 数组中移除
【发布时间】:2023-01-03 02:14:24
【问题描述】:
    public Transform[] spawnPoints;
    void Awake()
    {
        spawnPoints = GetComponentsInChildren<Transform>();
    }

    public void Spawn()
    {
        GameObject enemy = GameManager.instance.objectManager.Get(GameManager.instance.objIndex);
        enemy.transform.position = spawnPoints[Random.Range(1,spawnPoints.Length)].transform.position;
       enemy.GetComponent<Enemy>().Init(GameManager.instance.spawnData[GameManager.instance.level]); 
    }

我从特定位置召唤了一个怪物。 我想创建一个函数来防止在销毁特定对象时在该位置创建怪物,但我尝试了 Transform.RemoveAt(0) 并且这是不可能的。 以Transform[]的形式从数组中移除元素是不可能的吗?

我的 Unity 技能非常初级。 我试过 Transform.Remove(0)。 但是,这不可能

【问题讨论】:

  • 那里有一些错误。例如,为什么要从 1 随机到数组的长度?数组从 0 开始,元素的实际数量是 length - 1。另外,既然你是随机生成的,你不希望之前使用的生成点消失吗?第三,为什么总是要在0处移除? (再次与随机冲突)。

标签: unity3d


【解决方案1】:

我想你的意思是

spawnPoints.Remove(0);

不,从数组的开头删除任何内容是“不可能”的,但是有许多或多或少的惰性与高效方法可以做到这一点,例如:

spawnPoints = spawnPoints.Skip(1).ToArray();

另一种可能更好的方法是使用 List 代替:

 public List<Transform> spawnPoints;
 void Awake()
 {
     spawnPoints = GetComponentsInChildren<Transform>().ToList();
 }

然后你就可以做你一开始尝试的事情了:

spawnPoints.Remove(0);

请注意,列表不会具有“长度”属性。它被称为“计数”。

【讨论】:

  • 你是对的,但它不适用于 OP 的代码。他正在使用随机重生点,因此删除 0 将始终从列表中删除第一个,而不是他已经使用过的那个。或者看起来是这样。
【解决方案2】:

首先,使用列表。

public List<Transform> spawnPoints;  

您可以使用 StartAwake 或 Inspector 来填充它们。 (如果您不熟悉编码,我推荐 Inspector,这似乎是这种情况)

Because you use random points, you need to remember what index you used inorder to remove that specific one. Here is how: 

public void Spawn()
{
    GameObject enemy = GameManager.instance.objectManager.Get(GameManager.instance.objIndex);
    int posIdx= Random.Range(0,spawnPoints.Count-1);
    enemy.transform.position = spawnPoints[posIdx].transform.position;
    enemy.GetComponent<Enemy>().Init(GameManager.instance.spawnData[GameManager.instance.level]); 
    spawnPoints.RemoveAt(posIdx)
}

我添加了一个局部变量来“记住”您使用的转换,然后将其从数组中删除。

【讨论】:

  • 它应该是计数而不是长度。最后可能会出现问题,因为这会不断删除项目,因此当列表用完时,posIdx 将得到 0 但列表为空,因此它会中断。您可以恢复以前删除的项目。
  • 不好意思,复制粘贴后忘记调整了。设计确实很奇怪。但它可能是当前级别的列表,例如目标。可能是。
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多