Создание случайного игрового объекта на карте (без повторений)

#c# #unity3d #spawn

#c# #unity3d #порождение

Вопрос:

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

 using UnityEngine;

public class objectivesGeneration : MonoBehaviour
{
    GameObject[] objSpawn;
    GameObject objActual;
    public GameObject obj;
    int index;
    void Start()
    {
        objSpawn = GameObject.FindGameObjectsWithTag("spawnObj");
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I))
        {
            generateNewObj();
        }
    }

    public void generateNewObj()
    {
        index = Random.Range(0, objSpawn.Length);
        objActual = objSpawn[index];
        createObj();
    }
    public void createObj()
    {
        
        Instantiate(obj, objActual.transform.position, objActual.transform.rotation);
    }
}
 

Кто-нибудь может мне помочь?

Комментарии:

1. «случайные уникальные числа» называются «списком в случайном порядке»…

2. Ну, вы каждый раз задаете ему одну и ту же позицию…

3. Что такое «уничтожение»? Вы имеете в виду, что тип объектов повторяется или что местоположение объектов повторяется?

4. Извините, если я смутил вас своим вопросом, я из Колумбии и не пользуюсь помощью Google Translator.

5. Ответ для AlexGeorg там кажется подходящим для моей проблемы, я попробую и опубликую, сработало ли это!

Ответ №1:

Ваш вопрос можно понять двумя способами. Leoverload дал ответ на повторяющуюся позицию. Если вы не хотите повторять объекты одного и того же типа (чтобы все объекты были уникальными), выполните следующие действия:

  1. Превратите objSpawn в List<GameObject> переменную и в функции start() добавьте в нее все экземпляры из массива, который был возвращен FindGameObjectsWithTag .
  2. Превратиться objSpawn.Length в objSpawn.Count (который делает то же самое, но для списков) В той же функции добавьте: objSpawn.Remove(objActual) в конце. Если эти объекты в какой-то момент будут уничтожены, и вы захотите создать новые экземпляры уничтоженных объектов, убедитесь, что в их событии уничтожения вы Add(gameObject) снова попадаете в список.

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

Также у меня такое чувство, что вам нужно узнать, как работают аргументы параметры. Затем вы можете исключить эту объектную переменную и вместо этого передать объект createObj(GameObject theObj) напрямую.

Ответ №2:

Вы создаете объект в той же позиции objEctual.transform.position

Вы должны установить пределы появления с помощью 2 переменных, например:

 public float startx;
public float endx;
public float starty;
public float endy;
 

Затем вы можете легко создавать случайные экземпляры в этих позициях:

 float posX = Random.Range(startx, endx);
float posy = Random.Range(starty, endy);
Instantiate(obj, new Vector3(posx, posy, transform.position.z, Quaternion.Identity);
 

И так у вас есть случайное порождение!

Ответ №3:

Спасибо AlexGeorg за ответ, таков был мой окончательный код

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

public class objectivesGeneration : MonoBehaviour
{
    public GameObject recipient;

    public List<GameObject> objSpawns = new List<GameObject>();
    int spawnSelected;


    void Start()
    {
        //Set all the objs with the tag spawnLocation inside of the list
        foreach (GameObject OBJ in GameObject.FindGameObjectsWithTag("spawnLocation"))
        {
            objSpawns.Add(OBJ);
        }
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.I))
        {
            //Check if there are more possible spawns
            if (objSpawns.Count > 0)
            generateNewObj(recipient);
        }
    }

    public void generateNewObj(GameObject frasco)
    {
        //Get a random number of the list which contains one obj
        spawnSelected = Random.Range(0, objSpawns.Count);
        //Instantiate the GameObject in the location of the random selected object
        Instantiate(frasco, objSpawns[spawnSelected].transform.position, objSpawns[spawnSelected].transform.rotation);
        //Delete that possible location from the list
        objSpawns.RemoveAt(spawnSelected);
    }
}