C# 如何在现有队形中添加/销毁新对象?

C# 如何在现有队形中添加/销毁新对象?,c#,unity3d,C#,Unity3d,在经理中: using System.Collections; using System.Collections.Generic; using UnityEngine; public class FormationsManager : MonoBehaviour { public Transform squadMemeberPrefab; public int numberOfSquadMembers = 20; public int columns = 4;

在经理中:

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

public class FormationsManager : MonoBehaviour
{
    public Transform squadMemeberPrefab;
    public int numberOfSquadMembers = 20;
    public int columns = 4;
    public int gaps = 10;
    public Formations formations;

    private int numofmembers;

    // Use this for initialization
    void Start()
    {
        numofmembers = numberOfSquadMembers;
        formations.Init(numberOfSquadMembers, columns, gaps);
        GenerateSquad();
    }

    // Update is called once per frame
    void Update()
    {
        if (numofmembers != numberOfSquadMembers)
        {
            GenerateSquad();
        }
    }

    private void GenerateSquad()
    {
        Transform go = squadMemeberPrefab;

        for (int i = 0; i < formations.newpositions.Count; i++)
        {
            go = Instantiate(squadMemeberPrefab);
            go.position = formations.newpositions[i];
            go.tag = "Squad Member";
            go.transform.parent = gameObject.transform;
        }
    }
}
如果numberOfSquadMembers的值第一次是20,然后我将其更改为21,将新对象添加到队形的末尾,如果我将numberOfSquadMembers的值更改为20,例如从20更改为19或从21更改为5,则从末尾销毁对象的数量并保持队形

士兵们最后一排在右边。
因此,如果我将值更改为增加更多,然后将其添加到右侧,如果我从右侧更改为减少破坏。士兵最左边的一行是第一行。

如果您将游戏对象实例保留在FormationsManager类中,然后在GenerateSquad方法中重用它们,这是可能的

在FormationsManager类中,按如下方式添加和修改代码

public GameObject squadMemeberPrefab;
List<GameObject> SquadMembers = new List<GameObject>();

void Update()
{
    if (numofmembers != numberOfSquadMembers)
    {
        numofmembers = numberOfSquadMembers;
        formations.Init(numberOfSquadMembers, columns, gaps);
        GenerateSquad();
    }
}

private void GenerateSquad()
{
    Transform go = squadMemeberPrefab;
    List<GameObject> newSquadMembers = new List<GameObject>();

    int i = 0;
    for (; i < formations.newpositions.Count; i++)
    {
        if (i < SquadMembers.Count)
            go = SquadMembers[i];
        else
        {
            go = Instantiate(squadMemeberPrefab);
            newSquadMembers.Add(go);
        }
        go.position = formations.newpositions[i];
        go.tag = "Squad Member";
        go.transform.parent = gameObject.transform;
    }

    for (; i < SquadMembers.Count; i++)
        Destroy(SquadMembers[i]);

    SquadMembers = newSquadMembers;
}
public GameObject squadMemeberPrefab;
List SquadMembers=新列表();
无效更新()
{
if(numofmembers!=numberOfSquadMembers)
{
numofmembers=numberofsquademembers;
组数.Init(组成员数、列数、间隙数);
GenerateSquad();
}
}
私有void GenerateSquad()
{
变换go=squadmemeberprefact;
List newSquadMembers=新列表();
int i=0;
对于(;i

但是,我建议您考虑GAMObject池(对象池),它可以彻底解决这样的对象循环问题。为此,可以使用ClientScene.RegisterSpawnHandler。转到并搜索文本“游戏对象池”。您可以在那里看到一个示例代码。

这是有效的,我必须更改行public Transform squadmemeberprefact;公开游戏对象SquadmeberPrefact;还要添加到newSquadMembers列表中:newSquadMembers.add(go);在循环内部。现在它工作得很好。现在我来看看如何使用对象池。@BenziAvrumi,是的,没错。我忘了一句重要的话。我编辑了我的答案。祝您在对象池中好运;)
void Update()
        {
            if (numofmembers != numberOfSquadMembers)
            {
                GenerateSquad();
            }
        }
public GameObject squadMemeberPrefab;
List<GameObject> SquadMembers = new List<GameObject>();

void Update()
{
    if (numofmembers != numberOfSquadMembers)
    {
        numofmembers = numberOfSquadMembers;
        formations.Init(numberOfSquadMembers, columns, gaps);
        GenerateSquad();
    }
}

private void GenerateSquad()
{
    Transform go = squadMemeberPrefab;
    List<GameObject> newSquadMembers = new List<GameObject>();

    int i = 0;
    for (; i < formations.newpositions.Count; i++)
    {
        if (i < SquadMembers.Count)
            go = SquadMembers[i];
        else
        {
            go = Instantiate(squadMemeberPrefab);
            newSquadMembers.Add(go);
        }
        go.position = formations.newpositions[i];
        go.tag = "Squad Member";
        go.transform.parent = gameObject.transform;
    }

    for (; i < SquadMembers.Count; i++)
        Destroy(SquadMembers[i]);

    SquadMembers = newSquadMembers;
}