I have created a C# Script that randomly instantiates a specified amount of cubes inside a specified box collider.
The script works fine, but i dont know how to make the cubes not overlap. I am aware there are many answers on this topic, but I cant work out how to implement them into my script.
using UnityEngine;
using System.Collections;
public class Instantiate : MonoBehaviour {
[SerializeField]
private GameObject obj;
[SerializeField]
private int NumOfCubes = 10;
[SerializeField]
private GameObject SpawnBox;
private Vector3 SetBoxBoundaries()
{
Vector3 LocalPosition;
BoxCollider Boundaries = SpawnBox.GetComponent<BoxCollider> ();
float random = Random.value;
LocalPosition.x = Mathf.Lerp (Boundaries.center.x + SpawnBox.transform.position.x - Boundaries.extents.x * SpawnBox.transform.localScale.x,
Boundaries.center.x + SpawnBox.transform.position.x + Boundaries.extents.x * SpawnBox.transform.localScale.x, random);
random = Random.value;
LocalPosition.y = Mathf.Lerp(Boundaries.center.y + SpawnBox.transform.position.y - Boundaries.extents.y * SpawnBox.transform.localScale.y,
Boundaries.center.y + SpawnBox.transform.position.y + Boundaries.extents.y * SpawnBox.transform.localScale.y, random);
random = Random.value;
LocalPosition.z = Mathf.Lerp(Boundaries.center.z + SpawnBox.transform.position.z - Boundaries.extents.z * SpawnBox.transform.localScale.z,
Boundaries.center.z + SpawnBox.transform.position.z + Boundaries.extents.z * SpawnBox.transform.localScale.z, random);
return LocalPosition;
}
// Use this for initialization
void Start () {
Generate ();
}
void Generate(int i = 0)
{
for(i = 0; i < NumOfCubes; i++)
{
Instantiate (obj, SetBoxBoundaries (), Quaternion.identity);
}
}
void Update()
{
// Generate ();
}
}
Does anyone know how to do it?
Thanks
Tuncer
February 19, 2015, 12:31pm
3
You need to check distance between new position and existings, if it is okay, you can instantiate your object.
using UnityEngine;
using System.Collections;
public class Instantiate : MonoBehaviour
{
[SerializeField]
private GameObject obj;
[SerializeField]
private int NumOfCubes = 10;
[SerializeField]
private GameObject SpawnBox;
private float sizeOfObj = 1f; // SET THIS
public List<Vector3> objPositions = new List<Vector3>();
private Vector3 SetBoxBoundaries()
{
Vector3 LocalPosition;
BoxCollider Boundaries = SpawnBox.GetComponent<BoxCollider> ();
float random = Random.value;
LocalPosition.x = Mathf.Lerp (Boundaries.center.x + SpawnBox.transform.position.x - Boundaries.extents.x * SpawnBox.transform.localScale.x,
Boundaries.center.x + SpawnBox.transform.position.x + Boundaries.extents.x * SpawnBox.transform.localScale.x, random);
random = Random.value;
LocalPosition.y = Mathf.Lerp(Boundaries.center.y + SpawnBox.transform.position.y - Boundaries.extents.y * SpawnBox.transform.localScale.y,
Boundaries.center.y + SpawnBox.transform.position.y + Boundaries.extents.y * SpawnBox.transform.localScale.y, random);
random = Random.value;
LocalPosition.z = Mathf.Lerp(Boundaries.center.z + SpawnBox.transform.position.z - Boundaries.extents.z * SpawnBox.transform.localScale.z,
Boundaries.center.z + SpawnBox.transform.position.z + Boundaries.extents.z * SpawnBox.transform.localScale.z, random);
if( isAvailable(LocalPosition) )
{
objPositions.Add( LocalPosition );
return LocalPosition;
}
else
return SetBoxBoundaries();
}
private bool isAvailable( Vector3 pos )
{
for(int i=0; i<objPositions.Count; i++)
{
if( Vector3.Distance(pos,objPositions*) < sizeOfObj )*
return false;
}
return true;
}
void Start () {
sizeOfObj = obj.transform.localScale.x; // OR WHATEVER YOU WANT
Generate ();
}
void Generate(int i = 0)
{
for(i = 0; i < NumOfCubes; i++)
{
Instantiate (obj, SetBoxBoundaries (), Quaternion.identity);
}
}
void Update()
{
//Generate ();
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Instantiate : MonoBehaviour {
[SerializeField]
private GameObject obj;
[SerializeField]
private int NumOfCubes = 10;
[SerializeField]
private GameObject SpawnBox;
public List<Vector3> storeCubeVector = new List<Vector3>();
private Vector3 SetBoxBoundaries()
{
Vector3 LocalPosition;
BoxCollider Boundaries = SpawnBox.GetComponent<BoxCollider> ();
float random = Random.value;
LocalPosition.x = Mathf.Lerp (Boundaries.center.x + SpawnBox.transform.position.x - Boundaries.extents.x * SpawnBox.transform.localScale.x,
Boundaries.center.x + SpawnBox.transform.position.x + Boundaries.extents.x * SpawnBox.transform.localScale.x, random);
random = Random.value;
LocalPosition.y = Mathf.Lerp(Boundaries.center.y + SpawnBox.transform.position.y - Boundaries.extents.y * SpawnBox.transform.localScale.y,
Boundaries.center.y + SpawnBox.transform.position.y + Boundaries.extents.y * SpawnBox.transform.localScale.y, random);
random = Random.value;
LocalPosition.z = Mathf.Lerp(Boundaries.center.z + SpawnBox.transform.position.z - Boundaries.extents.z * SpawnBox.transform.localScale.z,
Boundaries.center.z + SpawnBox.transform.position.z + Boundaries.extents.z * SpawnBox.transform.localScale.z, random);
if(storeCubeVector.Contains(LocalPosition)){
SetBoxBoundaries();
}else{
storeCubeVector.Add(LocalPosition);
}
return LocalPosition;
}
// Use this for initialization
void Start () {
Generate ();
}
void Generate(int i = 0)
{
for(i = 0; i < NumOfCubes; i++)
{
Instantiate (obj, SetBoxBoundaries (), Quaternion.identity);
}
}
void Update()
{
// Generate ();
}
}