Создайте как можно больше игровых объектов из одной позиции и заканчивайте в другой - PullRequest
1 голос
/ 05 июня 2019

Как создать как можно больше игровых объектов, которые начинаются в одной позиции и заканчиваются в другой. Например, создайте экземпляр gameObject в точке x = 0 и завершите его на оси x = 5. Между этими двумя значениями должно быть как можно больше игровых объектов, предпочтительно 10-12 мелкомасштабных.

public GameObject prefab;

void Awake()
{
    GameObject ref = (GameObject)Instantiate(prefab, Vector3.zero, Quaternion.identity);
}

Ответы [ 4 ]

3 голосов
/ 05 июня 2019

Это должно создать 10 GameObject между 0 и 5.

void Awake() {  
     for(float x = 0; x < 5; x+=0.5f){
          Vector3 loc = new Vector3(x, 0, 0);
          GameObject gameObject = (GameObject)Instantiate(prefab, loc, Quaternion.identity);
     }
 }
3 голосов
/ 06 июня 2019

когда вы говорите as many GameObjects as possible Я полагаю, вы имеете в виду без перекрытия?

Это решение работает, если prefab использует Collider с.

Я быинстанцировать первый объект всегда и просто получить его ограничительную рамку, чтобы мы знали, насколько он велик

 var first = Instantiate(prefab, Vector3.zero + Vector3.right * MinX, Quaternion.identity);

var bounds = new Bounds(Vector3.zero, Vector3.zero);
foreach (var col in first.GetComponentsInChildren<Collider>(true))
{
    bounds.Encapsulate(col.bounds);
}

// now you can get the size in X direction
var width = bounds.size.x;

Я подозреваю, что точка поворота вашего префаба, вероятно, будет в центре, поэтому сначала переместите его вправо на половинуего ширины

first.transform.position += Vector3.right * width / 2f;

Теперь вы можете проверить, сколько объектов поместится в заданном диапазоне.Допустим, например, что ширина была 1, тогда в диапазоне от 0 до 5 было бы в общей сложности 4 объектов.В вычислениях будут некоторые избыточности (добавление 1, затем уменьшение 1 и т. Д.), Но я оставлю это для лучшего понимания

var minPosition = MinX;
var maxPosition = MaxX;

var actualMinPosition = minPosition + width / 2;
var actualMaxPosition = maxPosition - width / 2;

// +1 here since before we reduced actualMinPosition and actualMaxPosition by 
// exactly 1 * width
var possibleAmount = (int)Mathf.Floor((actualMaxPosition - actualMinPosition) / width) + 1;

Так что теперь создайте экземпляры отсутствующих объектов

// since I guess you also want them evenly spread between the start and end position
var distanceBetween = (actualMaxPosition - actualMinPosition) / (possibleAmount - 1);

// поскольку мы уже создали первый экземпляр // мы порождаем только возможнуюAmount - еще 1 для (var i = 0; i <возможныхAmount - 1; i ++) {// +1 здесь, так как мы начали цикл с i =0, но первый // объект здесь фактически является вторым, который будет порожден в общей сложности // поэтому мы хотим, чтобы он уже был перемещен var x = actualMinPosition + distanceBetween * (i + 1); </p>

        var obj = Instantiate(prefab, Vector3.zero + Vector3.right * x, Quaternion.identity);
    }

Так что все вместе

public void Spawn()
{
    var first = Instantiate(prefab, Vector3.zero, Quaternion.identity);

    var bounds = new Bounds(Vector3.zero, Vector3.zero);
    foreach (var col in first.GetComponentsInChildren<Collider>(true))
    {
        bounds.Encapsulate(col.bounds);
    }

    // now you can get the size in X direction
    var width = bounds.size.x;

    first.transform.position += Vector3.right * width / 2f;


    var minPosition = MinX;
    var maxPosition = MaxX;

    var actualMinPosition = minPosition + width / 2;
    var actualMaxPosition = maxPosition - width / 2;

    // +1 here since before we reduced actualMinPosition and actualMaxPosition by 
    // exactly 1 * width
    var possibleAmount = (int)Mathf.Floor((actualMaxPosition - actualMinPosition) / width) + 1;


    // since I guess you also want them evenly spread between the start and end position
    var distanceBetween = (actualMaxPosition - actualMinPosition) / (possibleAmount - 1);

    // since we already instantiated the first one
    // we spawn only possibleAmount - 1 more 
    for (var i = 0; i < possibleAmount - 1; i++)
    {
        // +1 here since we started the loop with i=0 but the first
        // object here is actually the second to be spawned in total
        // so we want it to be moved already
        var x = actualMinPosition + distanceBetween * (i + 1);

        var obj = Instantiate(prefab, Vector3.zero + Vector3.right * x, Quaternion.identity);
    }
}

enter image description here

Я просто уничтожил и заново вызвал все в Update для этой демонстрации

3 голосов
/ 05 июня 2019

Вы можете зациклить количество врагов, которых хотите вызвать (например, 12), и увеличивать позицию на каждой итерации цикла.

public GameObject prefab;
public Vector3 pos;

void Awake()
{
    for (int i = 0; i < 12; i++)
    {
        Instantiate(prefab, pos, Quaternion.identity);
        pos.x += 0.5f;
    }
}
1 голос
/ 06 июня 2019

Спасибо за все ваши ответы, я сделал что-то вроде этого: (a) Создайте два gameObjects в сцене, разделенных некоторым расстоянием (b) В сценарии, дайте ссылку на эти два gameObjects (c) Укажите количество сегментов (сферы), которые должны быть получены между этими двумя точками

 public Transform PointA; public Transform PointB; public float NumberOfSegments = 3; public float AlongThePath = .25f;

// Update is called once per frame
void Start()
{

    Create();
}

void Create()
{
    StartCoroutine(StartSpheringOut());
}

IEnumerator StartSpheringOut()
{
    NumberOfSegments += 1;// since we are skipping 1st placement since its the same as starting point we increase the number by 1 
    AlongThePath = 1 / (NumberOfSegments);//% along the path

    for (int i = 1; i < NumberOfSegments; i++)
    {
        yield return new WaitForSeconds(0.05f);
        Vector3 CreatPosition = PointA.position + (PointB.position - PointA.position) * (AlongThePath * i);

        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = CreatPosition;
        sphere.transform.localScale = new Vector3(0.25f, 0.25f, 0.25f);



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