Jump to content
Unity Insider Forum

dreieck zeichnen


peachplayer

Recommended Posts

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...