Hallo,
in Unity habe ich einen Planeten(Kugel) mit Gravitation. Durch eine Spawnroutine werden Objekte um die Kugel erstellt und durch die Gravitation an den Planeten gezogen.
Nun möchte ich vor dem Spawnen prüfen, ob dort ein Objekt platziert werden kann, ohne das es dann beim Fallen auf die Kugel auf einem anderen Objekt landen würde.
In Kurzform: Prüfung, ob ein neu gespawntes Objekt an der Position x,y,z mit einer "Größe" nicht auf einem bereits auf der Kugeloberfläche befindlichen Objekt fallen würde.
An den Planetenmittelpunkt, den Radius, die Positionen der Objekte und die Größen der Objekte würde ich rankommen, mir fehlt leider der mathematische Teil. Ich habe mal begonnen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| public class WorldGenerator : MonoBehaviour { CalcCoordinates calculator; GameObject planet; public GameObject[] planetPrefabs; public GameObject[] skyPrefabs; public GameObject[] spacePrefabs; void Start() { calculator = GameObject.FindGameObjectWithTag("Calculator").GetComponent<CalcCoordinates>(); planet = GameObject.FindGameObjectWithTag("Planet");
SpawnObjects(planet, planetPrefabs, PlayerPrefs.GetInt("planetObjectsCount"), 50); SpawnObjects(planet, skyPrefabs, PlayerPrefs.GetInt("skyObjectsCount"), 150); SpawnObjects(planet, spacePrefabs, PlayerPrefs.GetInt("spaceObjectsCount"), 200); }
private void SpawnObjects(GameObject planet, GameObject[] prefabs, float objectCount, float distanceToPlanet) { List<gameObject> spawnObjectsList = new List<gameObject>(); for (int i = 0; i < objectCount; i++) { gameObject spawnObject = prefabs[Random.Range(0, prefabs.Length)]; Vector3 spawnPos = calculator.CalcPointOnSphere(distanceToPlanet); if(CheckSpawnPoint(spawnObjectsList, spawnObject, spawnPos)) { gameObject objectToSpawn = (gameObject)Instantiate(spawnObject, spawnPos, Quaternion.identity); spawnObjectsList.Add(objectToSpawn); } } }
private bool CheckSpawnPoint(List<gameObject> spawnObjectsList, GameObject objectToSpawn, Vector3 spawnPos) { foreach(gameObject listObject in spawnObjectsList) { if(..) { return false; } } return true; } } |
Wäre cool, wenn jemand zum unteren Teil eine Idee hätte :)
Moderiert von Th69: Topic aus C# - Die Sprache verschoben am Mi 07.12.2016 um 13:26