#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 дал ответ на повторяющуюся позицию. Если вы не хотите повторять объекты одного и того же типа (чтобы все объекты были уникальными), выполните следующие действия:
- Превратите objSpawn в
List<GameObject>
переменную и в функции start() добавьте в нее все экземпляры из массива, который был возвращенFindGameObjectsWithTag
. - Превратиться
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);
}
}