- Home /
Question by
UniluckStudios · Nov 11, 2017 at 11:37 PM ·
instantiaterandomspawnphysics2doverlap
Why do objects keep spawning on top of one another?
I have made a game where some spikes are spawned on the side of the screen and above the side of the screen in random places. The problem is that they spawn on top of each other. I have tried to use the Physics2D.OverlapAreaAll, but it won't work. Here is code:
void Start()
{
cameraPos = Camera.main.transform.position;
xValue.x = cameraPos.x + screenSize.x;
screenSize.x = Vector2.Distance(Camera.main.ScreenToWorldPoint(new Vector2(0, 0)), Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, 0))) * 0.5f;
screenSize.y = Vector2.Distance(Camera.main.ScreenToWorldPoint(new Vector2(0, 0)), Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height))) * 0.5f;
Debug.Log(spawnPositions);
InvokeRepeating("spawnTwoSpike", 1.0f, 1.0f);
}
private void spawnTwoSpike ()
{
Vector3 randomPositionX = getValidSpawnLocation(twoSpikes);
Instantiate(twoSpikes, randomPositionX, Quaternion.identity);
Instantiate(twoSpikesLeft, spawnPositionLeft, Quaternion.identity);
}
private void FixedUpdate()
{
cameraPos = Camera.main.transform.position;
yValue.y = cameraPos.y + screenSize.y;
maxY.y = yValue.y + 10;
spawnPositions = new Vector2(xValue.x + (screenSize.x * 2) * 0.5f, Random.Range(yValue.y + (screenSize.y * 2) * .5f, (yValue.y + (screenSize.y * 2) * .5f) + 10));
spawnPositionLeft = new Vector2(xValue.x - (screenSize.x * 2) * 0.5f, Random.Range(yValue.y + (screenSize.y * 2) * .5f, (yValue.y + (screenSize.y * 2) * .5f) + 10));
Debug.Log(spawnPositions);
}
private Vector3 getValidSpawnLocation(GameObject go)
{
// get the spawning object's collider to use for size
Collider2D objectCollider = go.GetComponent<Collider2D>();
Vector3 newPosition = Vector3.zero;
bool validPosition = false;
int failureLimit = 100;
int fails = 0;
do
{
// get a random position on screen
newPosition = spawnPositions;
// get the corners of the object at the new position
Vector3 min = new Vector3(newPosition.x, newPosition.y - objectCollider.bounds.extents.y, newPosition.z);
Vector3 max = new Vector3(newPosition.x, newPosition.y + objectCollider.bounds.extents.y, newPosition.z);
// check that area for overlaps with the layermask
Collider2D[] overlapObjects = Physics2D.OverlapAreaAll(min, max, doNotSpawnOnMe);
// if it does not overlap any objects in the layermask
if (overlapObjects.Length == 0)
{
// break out of the do while loop
validPosition = true;
fails = 0;
}
else
{
fails++;
}
} while (!validPosition && fails < failureLimit);
// return the valid position
return newPosition;
}
}
Comment