Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C#-Quelltext |
|
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 |
Vector3 planetCenter; void Start() { planetCenter = GameObject.FindGameObjectWithTag("Planet").transform.position; } void OnCollisionEnter(Collision other) { if(other.gameObject.tag == "SpawnObject") { Vector3 thisPos = transform.position; Vector3 otherPos = other.gameObject.transform.position; float thisLength = Mathf.Sqrt(Mathf.Pow(thisPos.x - planetCenter.x, 2) + Mathf.Pow(thisPos.x - planetCenter.x, 2) + Mathf.Pow(thisPos.x - planetCenter.x, 2)); float otherLength = Mathf.Sqrt(Mathf.Pow(otherPos.x - planetCenter.x, 2) + Mathf.Pow(otherPos.x - planetCenter.x, 2) + Mathf.Pow(otherPos.x - planetCenter.x, 2)); if (thisLength<otherLength) { Destroy(gameObject); } else { Destroy(other.gameObject); } } } |
C#-Quelltext |
|
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 |
float objectCount = 300; public void PlaceObjectsOnPlanet(GameObject planet, GameObject[] planetPrefabs) { List<GameObject> objectList = new List<GameObject>(); for (int i = 0; i < objectCount; i++) { float angleWidth = Random.Range(-Mathf.PI, Mathf.PI); float angleHeight = Random.Range(-Mathf.PI, Mathf.PI); float angleZ = Mathf.Sin(angleWidth); Vector3 spawnPos = new Vector3( planet.transform.position.x + planet.transform.localScale.x * Mathf.Cos(angleWidth) * Mathf.Cos(angleHeight), planet.transform.position.y + planet.transform.localScale.y * Mathf.Cos(angleWidth) * Mathf.Sin(angleHeight), planet.transform.position.z + planet.transform.localScale.z * angleZ); GameObject spawnedObject = (GameObject)Instantiate(planetPrefabs[Random.Range(0, planetPrefabs.Length)], spawnPos, Quaternion.identity); objectList.Add(spawnedObject); } foreach (GameObject obj in objectList) { obj.GetComponent<ObjectDestroyer>().enabled = false; } } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Garzec« (16.11.2016, 19:42)
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
C#-Quelltext |
|
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
private float objectCount = 100; public void PlaceObjectsOnPlanet(GameObject planet, GameObject[] planetPrefabs) { List<GameObject> spawnList = new List<GameObject>(); for (int i = 0; i < objectCount; i++) { float angleWidth = Random.Range(-Mathf.PI, Mathf.PI); float angleHeight = Random.Range(-Mathf.PI, Mathf.PI); float angleZ = Mathf.Sin(angleWidth); Vector3 spawnPos = new Vector3( planet.transform.position.x + planet.transform.localScale.x * Mathf.Cos(angleWidth) * Mathf.Cos(angleHeight), planet.transform.position.y + planet.transform.localScale.y * Mathf.Cos(angleWidth) * Mathf.Sin(angleHeight), planet.transform.position.z + planet.transform.localScale.z * angleZ); GameObject objectToSpawn = planetPrefabs[Random.Range(0, planetPrefabs.Length)]; bool canPlace = true; foreach (GameObject listedObject in spawnList) { if (CheckPlacement(listedObject, spawnPos, objectToSpawn.transform.localScale.x, objectToSpawn.transform.localScale.y, objectToSpawn.transform.localScale.z)) { canPlace = false; } } if (canPlace) { Instantiate(objectToSpawn, spawnPos, Quaternion.identity); spawnList.Add(objectToSpawn); } } } private bool CheckPlacement(GameObject placedObject, Vector3 nextSpawnPos, float nextScaleX, float nextScaleY, float nextScaleZ) { // Vorhandenes Objekt Vector3 placedObjectPos = placedObject.transform.position; float placedObjectScaleX = placedObject.transform.localScale.x; float placedObjectScaleY = placedObject.transform.localScale.y; float placedObjectScaleZ = placedObject.transform.localScale.z; // Eckpunkt Objekt A Vector3 cornerA = new Vector3(placedObjectPos.x + placedObjectScaleX, placedObjectPos.y + placedObjectScaleY, placedObjectPos.z + placedObjectScaleZ); // Radius Objekt A float radiusA = Mathf.Sqrt(Mathf.Pow(cornerA.x - placedObjectPos.x, 2) + Mathf.Pow(cornerA.y - placedObjectPos.y, 2) + Mathf.Pow(cornerA.z - placedObjectPos.z, 2)); // neues Objekt Vector3 cornerB = new Vector3(nextSpawnPos.x + nextScaleX, nextSpawnPos.y + nextScaleY, nextSpawnPos.z + nextScaleZ); // Radius neues Objekt float radiusB = Mathf.Sqrt(Mathf.Pow(cornerB.x - nextSpawnPos.x, 2) + Mathf.Pow(cornerB.y - nextSpawnPos.y, 2) + Mathf.Pow(cornerB.z - nextSpawnPos.z, 2)); // Distanz der Mittelpunkte float distanceCenterToCenter = Mathf.Sqrt(Mathf.Pow(nextSpawnPos.x - placedObjectPos.x, 2) + Mathf.Pow(nextSpawnPos.y - placedObjectPos.y, 2) + Mathf.Pow(nextSpawnPos.z - placedObjectPos.z, 2)); // Summe der Radien float sumRadius = radiusA + radiusB; if (distanceCenterToCenter < sumRadius) { // Objekte berühren sich return false; } return true; } |
Werbeanzeige