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;
}