65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
| using UnityEngine;
 | |
| using System.Collections;
 | |
| 
 | |
| public class SpawnInArea : MonoBehaviour {
 | |
| 
 | |
| 	public Texture2D SpawnMap;
 | |
| 	float Offset = 10.0f;
 | |
| 	float AboveGround = 1.0f;
 | |
| 	bool TerrainOnly = true;
 | |
| 
 | |
| 	// Use this for initialization
 | |
| 	void RandomPositionOnTerrain(GameObject obj) {
 | |
| 		Vector3 size = Terrain.activeTerrain.terrainData.size;
 | |
| 		Vector3 NewPosition = new Vector3();
 | |
| 
 | |
| 		bool done = false;
 | |
| 		while (!done) {
 | |
| 			// calculate new random position
 | |
| 			NewPosition = Terrain.activeTerrain.transform.position;
 | |
| 			float w = Random.Range(0.0f, size.x);
 | |
| 			float h = Random.Range(0.0f, size.z);
 | |
| 			NewPosition.x += w;
 | |
| 			NewPosition.y += size.y + Offset; // make sure we are above the terrain
 | |
| 			NewPosition.z += h;
 | |
| 
 | |
| 			// verify that position is in spawnmap
 | |
| 			if (SpawnMap) {
 | |
| 				int xmap = Mathf.RoundToInt((float)SpawnMap.width * w/size.x);
 | |
| 				int ymap = Mathf.RoundToInt((float)SpawnMap.height * h/size.z);
 | |
| 				float value = SpawnMap.GetPixel(xmap, ymap).grayscale;
 | |
| 				if (value>0.0f && Random.Range(0.0f, 1.0f)<value) {
 | |
| 					done = true;
 | |
| 				} else {
 | |
| 					done = false;
 | |
| 				}
 | |
| 			} else {
 | |
| 				done = true;
 | |
| 			}
 | |
| 
 | |
| 			if (done) {
 | |
| 				// verify that position is above terrain/something
 | |
| 				RaycastHit hit;
 | |
| 				if (Physics.Raycast(NewPosition, -Vector3.up, out hit)) {
 | |
| 					float distanceToGround = hit.distance;
 | |
| 					if (hit.transform.name != "Terrain") {
 | |
| 						if (TerrainOnly) done = false; // there is something else beneath us
 | |
| 					}
 | |
| 					// all is good
 | |
| 					NewPosition.y -= (distanceToGround-AboveGround);
 | |
| 				} else {
 | |
| 					done = false; // there's nothing under us as far as we care to check
 | |
| 				}
 | |
| 			}
 | |
| 				
 | |
| 		}
 | |
| 
 | |
| 		// put the object in place
 | |
| 		obj.transform.position = NewPosition;
 | |
| 		// also add random rotation
 | |
| 		transform.Rotate(Vector3.up * Random.Range(0, 360), Space.World);
 | |
| 		
 | |
| 	}
 | |
| 	
 | |
| }
 |