Make sure objects are not instantiated on each other

I am currently working on a 2d endless runner. when i generate platforms, i randomly decide if there is a coin on the platform and if there’s an obstacle, then i calculate where they are above the platform. If both a coin and obstacle are instantiated, how would i make sure they aren’t instantiated on each other?

Instantiate your obstacle at a random point, then Instantiate the coin at a random point. Check if the coin intersects with the obstacle. If not then you’re done, else you wanna pick a new random position and repeat the check until you find a position that’s free.

Something like this in code:

public GameObject coin = null;
public GameObject obstacle = null;

void Start()
{
	GameObject obstacleInstance = null;

	// Decide if we want an obstacle
	if(Random.value < 0.5f){

		Vector3 position = Vector3.zero; // Add your logic tp Calculate a new position here
		obstacleInstance  = (GameObject)Instantiate(obstacle, position, Quaternion.identity); // Instantiate obstacle at calculated position
	}

	// Decide if we want a coin
	if(Random.value > 0.5f){

		// Create a coin at a random position
		Vector3 position = Vector3.zero; // Add your logic to Calculate a new position here
		GameObject coinInstance = (GameObject)Instantiate(coin, position, Quaternion.identity);

		if(obstacleInstance){
			
			// If there is an obstacle calculate a new position until the  objects don't intersect

			while (coinInstance.renderer.bounds.Intersects(obstacleInstance.renderer.bounds)) {
				position = Vector3.zero; // Add your logic to Calculate a new position here
				coinInstance.transform.position = position;
			}
		}
	}
}

you can use random.range too make it spawn a different Gameobject and location.