Как я могу добавить / уничтожить новые объекты в существующей формации? - PullRequest
0 голосов
/ 29 июня 2018

В менеджере:

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

И скрипт Formations:

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

Что я хочу сделать, так это в FormationsManager в Обновлении не только вызвать GenerateSquad, но и добавить новый один раз в последнюю / следующую позицию существующей уже формации.

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

Если значение numberOfSquadMembers в первый раз равно 20, а затем я изменил его на 21, добавьте новый объект в конец формирования, и то же самое, если я изменю значение numberOfSquadMembers, например, с 20 на 19 или с 21 на 5, уничтожим количество объектов с конца и форма формации.

Formation

Солдаты, последняя строка на правой стороне. Так что, если я изменю значение, чтобы добавить больше, то добавлю его справа, а если я изменю на меньшее, уничтожу с правой стороны. Самый левый ряд солдат - первый.

1 Ответ

0 голосов
/ 29 июня 2018

Это возможно, если вы храните экземпляры 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 (Object Pool), который может полностью решить такую ​​проблему с перезапуском объектов. Для этой цели вы можете использовать ClientScene.RegisterSpawnHandler. Перейдите на эту страницу документации Unity и найдите текст "Пул GameObject". Вы можете увидеть пример кода там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...