peachplayer Geschrieben 15. Januar 2018 Melden Share Geschrieben 15. Januar 2018 Hallo Leute Weiss jemand wie man mit Unity eine dreieckige Fläche mit 9 GameObjects zeichnen kann? Habe es mit folgendem Code versucht: void Start () { float offsetX = -3f; float offsetZ = -3f; float abstandX = 4f; float abstandZ = 4f; for (int i = 0; i < 3; i++) { for (x = 0; x < 3; x++) { //zeichne Dreieck mit 9 game objects k = i*3+ x; newX = offsetX + -x/2 * abstandX; newZ = offsetZ + i * abstandZ; Tiles[k] = Instantiate(prefabKegel, new Vector3(newX, 0.8f, newZ), Quaternion.identity) as GameObject; k = k + 1; } } Bei mir erscheinen dann leider nur 4 Gameobjects in 2 Reihen, statt 9 Gameobjects in 4 Reihen! Kann mir jemand helfen? Gruss Peachplayer Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 16. Januar 2018 Melden Share Geschrieben 16. Januar 2018 Hier eine Variante, ist zwar kein gleichseitiges Dreieck (daher muss keine Wurzel gezogen werden etc.) aber ein Dreieck und du kannst die Elemente pro Seite beliebig erhöhen (siehe auskommentierte Zeile, wird sie einkommentiert, verdoppeln sich die Objekte je Seite). Die Kantenlänge ist der Abstand zwischen den Objekten der längsten Seite (Seite c). Der Ansatz ist iterativ: using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestTriangle : MonoBehaviour { public GameObject prefabKegel; public Transform top; public float edgeLength = 3.0f; void Start() { List<Vector2> points = new List<Vector2>(); points.Add(new Vector2(top.position.x, top.position.y)); points.Add(new Vector2(points[0].x - edgeLength, points[0].y - edgeLength)); points.Add(new Vector2(points[0].x + edgeLength, points[0].y - edgeLength)); List<Vector2> pointsIterStep = Iterate(points); //pointsIterStep = Iterate(pointsIterStep); CreateObjects(pointsIterStep); } List<Vector2> Iterate(List<Vector2> points) { bool lastPointSet = false; Vector2 lastPoint = new Vector2(0, 0); List<Vector2> pointsNext = new List<Vector2>(); foreach (Vector2 point in points) { if (lastPointSet) { pointsNext.Add(lastPoint); pointsNext.Add(lastPoint + (point - lastPoint) / 2.0f); } lastPoint = point; lastPointSet = true; } pointsNext.Add(lastPoint); pointsNext.Add(lastPoint + (points[0] - lastPoint) / 2.0f); return pointsNext; } void CreateObjects(List<Vector2> points) { foreach (Vector2 point in points) { Instantiate(prefabKegel, new Vector3(point.x, 0.8f, point.y), Quaternion.identity); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 16. Januar 2018 Autor Melden Share Geschrieben 16. Januar 2018 Danke für die Antwort. Bei mir funktioniert der Code leider nicht. Kann man die GameObjects stattdessen nich von Hand positionieren und die Vektor-Koordinaten in einem Array abspeichern und dann wieder auslesen? Gruss Peachplayer Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 16. Januar 2018 Melden Share Geschrieben 16. Januar 2018 Hab die Klasse nochmal leicht verändert ... aber du musst beim Skript ein Prefab setzen, ein GameObjekt, welches die Position der Spitze des Dreiecks angibt und eine Kantenlänge z.b. 3 (die habe ich nun per Default auch gesetzt) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 16. Januar 2018 Autor Melden Share Geschrieben 16. Januar 2018 Danke für die Antwort, das hat jetzt prima geklappt! Nun habe ich noch ein Problem: Wie kann man das Skript ergänzen, so dass immer neue dreiecke erstellt werden können nachdem alle dreiecke verschwunden sind, wenn diese mit einem GameObject kollidiert sind? Gruss Peachplayer Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
peachplayer Geschrieben 17. Januar 2018 Autor Melden Share Geschrieben 17. Januar 2018 Habe es wie folgt probiert: void Update() { if (Input.GetMouseButtonDown(1)) { GameObject prefabKapsel = GameObject.CreatePrimitive(PrimitiveType.Capsule); prefabKapsel.AddComponent<Rigidbody>(); prefabKapsel.transform.position = new Vector3(-4.3f, 0.8f, 2f); List<Vector2> points = new List<Vector2>(); points.Add(new Vector2(top.position.x, top.position.y)); points.Add(new Vector2(points[0].x - edgeLength, points[0].y - edgeLength)); points.Add(new Vector2(points[0].x + edgeLength, points[0].y - edgeLength)); List<Vector2> pointsIterStep = Iterate(points); //pointsIterStep = Iterate(pointsIterStep); CreateObjects(pointsIterStep); points.Add(new Vector2(top.position.x, top.position.y)); foreach (Vector2 point in points) { Instantiate(prefabKapsel, new Vector3(point.x, 0.8f, point.y), Quaternion.identity); } } } Gruss Peachplayer Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 17. Januar 2018 Melden Share Geschrieben 17. Januar 2018 Ich habe deinen Code mal soweit gängig gemacht, es wird mit der linken Maustaste getriggert! "prefabKegel" und "top" wird nun in der Updatemethode überschrieben. using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestTriangle : MonoBehaviour { public GameObject prefabKegel; public Transform top; public float edgeLength; void Update() { if (Input.GetMouseButtonDown(0)) { prefabKegel = GameObject.CreatePrimitive(PrimitiveType.Capsule); prefabKegel.AddComponent<Rigidbody>(); top.position = new Vector3(-4.3f, 0.8f, 2f); List<Vector2> points = new List<Vector2>(); points.Add(new Vector2(top.position.x, top.position.y)); points.Add(new Vector2(points[0].x - edgeLength, points[0].y - edgeLength)); points.Add(new Vector2(points[0].x + edgeLength, points[0].y - edgeLength)); List<Vector2> pointsIterStep = Iterate(points); //pointsIterStep = Iterate(pointsIterStep); CreateObjects(pointsIterStep); prefabKegel.SetActive(false); } } List<Vector2> Iterate(List<Vector2> points) { bool lastPointSet = false; Vector2 lastPoint = new Vector2(0, 0); List<Vector2> pointsNext = new List<Vector2>(); foreach (Vector2 point in points) { if (lastPointSet) { pointsNext.Add(lastPoint); pointsNext.Add(lastPoint + (point - lastPoint) / 2.0f); } lastPoint = point; lastPointSet = true; } pointsNext.Add(lastPoint); pointsNext.Add(lastPoint + (points[0] - lastPoint) / 2.0f); return pointsNext; } void CreateObjects(List<Vector2> points) { foreach (Vector2 point in points) { Instantiate(prefabKegel, new Vector3(point.x, 0.8f, point.y), Quaternion.identity); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.