I want all 6 objects to spawn in. I want it to pick 1 of 8 spawns and assign all 6 objects to those 8 different spawns without spawning 2 in the same spot. heres my current code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RandomSpawn : MonoBehaviour
{
public Transform spawns;
public GameObject objects;
private int randomPref;
private int randomSpawn;
void Start()
{
randomPref = Random.Range(0, 6);
randomSpawn = Random.Range(0, 8);
Instantiate(objects[randomPref], spawns[randomSpawn].transform.position, Quaternion.identity);
}
}
And it works. But not what i need it to do,I have 6 objects, I need them to to pick 1 of 8 spawn points.
So here’s the code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RandomSpawn : MonoBehaviour
{
public Transform spawns;
public GameObject objects;
private int randomPref;
private int randomSpawn;
void Start()
{
randomPref = Random.Range(0, 6);
randomSpawn = Random.Range(0, 8);
Instantiate(objects[randomPref], spawns[randomSpawn].transform.position, Quaternion.identity);
}
}
And it works, It picks 1 of 6 objects and spawns it in 1 of 8 spawns, but i want it to pick all 6 and assign all 6 to 1 on of 8 random spawn points without spawning 2 objects in the same spot.
using UnityEngine;
using System.Collections.Generic;
public class RandomSpawn : MonoBehaviour
{
public Transform[] spawns;
public GameObject[] objects;
void Start()
{
SpawnObjects( objects, spawns );
}
private void SpawnObjects( GameObject[] gameObjects, Transform[] locations, bool allowOverlap = true )
{
List<GameObject> remainingGameObjects = new List<GameObject>( gameObjects );
List<GameObject> freeLocations = new List<GameObject>( locations );
if( locations.Length < gameObjects.Length )
Debug.LogWarning( allowOverlap ? "There are more gameObjects than locations. Some objects will overlap." : "There are not enough locations for all the gameObjects. Some won't spawn.");
while( remainingGameObjects.Count > 0 )
{
if( freeLocations.Count == 0 )
{
if( allowOverlap ) freeLocations.AddRange( locations );
else break ;
}
int gameObjectIndex = Random.Range( 0, remainingGameObjects.Count );
int locationIndex = Random.Range( 0, freeLocations.Count );
Instantiate(gameObjects[gameObjectIndex], locations[locationIndex].position, Quaternion.identity);
remainingGameObjects.RemoveAt( gameObjectIndex );
freeLocations.RemoveAt( locationIndex );
}
}
}
Here is the updated code without errors.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class random : MonoBehaviour
{
public Transform[] spawns;
public GameObject[] objects;
void Update()
{
spawn(objects, spawns);
}
void spawn(GameObject[] gameObjects, Transform[] locations, bool allowOverlap = true){
List<GameObject> remainingGameObjects = new List<GameObject>( gameObjects );
List<Transform> freeLocations = new List<Transform>( locations );
if( locations.Length < gameObjects.Length )
Debug.LogWarning( allowOverlap ? "There are more gameObjects than locations. Some objects will overlap." : "There are not enough locations for all the gameObjects. Some won't spawn.");
while( remainingGameObjects.Count > 0 )
{
if( freeLocations.Count == 0 )
{
if( allowOverlap ) freeLocations.AddRange( locations );
else break ;
}
int gameObjectIndex = Random.Range( 0, remainingGameObjects.Count );
int locationIndex = Random.Range( 0, freeLocations.Count );
Instantiate(gameObjects[gameObjectIndex], locations[locationIndex].position, Quaternion.identity);
remainingGameObjects.RemoveAt( gameObjectIndex );
freeLocations.RemoveAt( locationIndex );
}
}
}