如何向现有编队添加/销毁新对象?

时间:2018-06-29 01:50:20

标签: 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;
    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;
        }
    }
}

以及队形脚本:

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

public class Formations : MonoBehaviour
{
    public List<Vector3> newpositions;

    private int numberOfSquadMembers;
    private int columns;
    private int gaps;
    private List<Quaternion> quaternions;

    private Vector3 FormationSquarePositionCalculation(int index)
    {
        float posX = (index % columns) * gaps;
        float posY = (index / columns) * gaps;
        return new Vector3(posX, posY);
    }

    private void FormationSquare()
    {
        newpositions = new List<Vector3>();
        quaternions = new List<Quaternion>();

        for (int i = 0; i < numberOfSquadMembers; i++)
        { 
            Vector3 pos = FormationSquarePositionCalculation(i);
            Vector3 position = new Vector3(transform.position.x + pos.x, 0, transform.position.y + pos.y);
            newpositions.Add(position);
        }
    }

    public void Init(int numberOfSquadMembers, int columns, int gaps)
    {
        this.numberOfSquadMembers = numberOfSquadMembers;
        this.columns = columns;
        this.gaps = gaps;
        FormationSquare();
    }
}

我想要做的是在Updates的FormationsManager中,不仅调用GenerateSquad,而且还要将新的一次添加到现有已经形成的队形的最后/下一个位置。

void Update()
        {
            if (numofmembers != numberOfSquadMembers)
            {
                GenerateSquad();
            }
        }

如果numberOfSquadMembers的值是第一次20,然后我将其更改为21,则将新对象添加到编队的末尾;如果将numberOfSquadMembers的值从20更改为19,或从21更改为5,则将其破坏。从头到尾保持一定数量,并保持地层形状。

Formation

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

1 个答案:

答案 0 :(得分:2)

有可能将GameObject实例保留在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;
}

但是,我建议您考虑使用GameObject Pool(对象池),它可以彻底解决此类对象回收问题。为此,可以使用ClientScene.RegisterSpawnHandler。转到this Unity Documentation page,然后搜索文本“ GameObject pool”。您可以在此处看到示例代码。