Jump to content
Unity Insider Forum

Text auf Sprites schreiben


Garzec

Recommended Posts

Hallo,

ich habe ein 10X10 Feld. Dabei soll es 100 Werte geben, 10 mal von 1 bis 10. Jede Zelle bekommt einen Wert zufällig zugewiesen und per Text auf dem Sprite soll dieser Wert abgebildet werden. Die Zelle sollte dann im Spiel erstmal so aussehen

YNu2g.png

aktuell sieht mein Grid bei der Erzeugung aber so aus (in der Mitte liegen alle Texte)

JCHw2.png

Nun erstelle ich die Zellen wie folgt und füge sie dem leeren GameObject "Map" hinzu

    [SerializeField]
	private GameObject cellPrefab;

    private const int CELL_COUNT_X = 10;
    private const int CELL_COUNT_Y = 10;
    private const float CELL_SPACING = 1.1f;

    private const int CELL_VALUE_MIN = 1;
    private const int CELL_VALUE_MAX = 10;

    private void Start()
    {
        List<int> freeCellValues = new List<int>();

        for (int i = CELL_VALUE_MIN; i <= CELL_VALUE_MAX; i++) // 10 mal Werte von 1 bis 10 füllen
        {
            for (int j = CELL_VALUE_MIN; j <= CELL_VALUE_MAX; j++)
            {
                freeCellValues.Add(j);
            }
        }

        for (int x = 0; x < CELL_COUNT_X; x++) // Grid erzeugen
        {
            for (int y = 0; y < CELL_COUNT_Y; y++)
            {
                float spawnPosX = x * CELL_SPACING - CELL_COUNT_X / 2;
                float spawnPosY = y * CELL_SPACING - CELL_COUNT_Y / 2;
                GameObject cell = Instantiate(cellPrefab, new Vector2(spawnPosX, spawnPosY), cellPrefab.transform.rotation);
                Cell cellComponent = cell.GetComponent<Cell>();
                int cellValue = freeCellValues[Random.Range(0, freeCellValues.Count)];

                cell.transform.SetParent(transform); // Zelle als Kind der Map hinzufügen

                cellComponent.InitCell(cellValue); // Zelle "Startmethode" aufrufen
                freeCellValues.Remove(cellValue); // genutzten Zellwert aus der Liste entfernen
            }
        }
    }

Dabei nutzt jede Zelle noch diesen Code

private Text txtCellValue;
private int cellValue;

public void InitCell(int value)
{
    txtCellValue = transform.GetChild(0).GetChild(0).GetComponent<Text>(); // Text Komponente holen
    cellValue = value; // Wert setzen
    txtCellValue.text = cellValue.ToString(); // GUI
}

Die Zelle selbst sieht in der Hierarchie so aus

cHMzX.png

Das Canvas steht auf "Scale with Screensize", der Text hat folgende Einstellungen

mYndg.png

Ich möchte erreichen, dass auf dem Sprite (die Zelle) der Wert abgebildet wird. Vielleicht geht das Ganze ja auch leichter oder anders.

Danke schon einmal.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

So ganz versteh ich deinen Script nicht, muss ich zugeben.^^

Mal meine Idee: Pack in ein Objekt ein Textlabel hinein und kopier dir das Objekt (Zelle) 10x10 mal.

Danach erzeugst du ein Array mit der Größe die du brauchst (10x10) und packst deine 10x10 Texte in das Array.

Anschließend kannst du die Werte zuweisen:

for(i = 0; i < textfelder.length; i++) {
	textfelder[i].text = ? //? = irgend eine Zahl                                             
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

LOL, da wurde etwas zu viel geblockt.^^

Jetzt seh ichs. Mhh  es gibt "Cell" "CanvasCell" und "Text". Vom Namen gehe ich einmal davon aus das alls in einem Canvas ist.

Also müsste es so aussehen:

Canvas (Position 0,0,0) -> Kindobjekt Celle (Position wie du es als graue Zelle im Bild hast) -> Text (Position 0,0,0)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du mal dein Prefab einfach so in die Szene gezogen und geschaut ob der Text so passt ?
Wenn die Anker + Pivot gesetzt sind sollte sich das eigentlich nicht mehr verschieben dann.

Btw. Microsoft empfiehlt PascalCase bei Konstanten in Unity & GetComponentInChildren sucht in allen Childs nach der Komponente.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, die Texte stehen auf 0,0,0.

@Life Is Good wie würdest du denn nach der Textkomponente suchen, außer ein Feld im Inspektor anzulegen?

Ich habe jetzt folgendes gemacht:

Beim Canvas den Render Mode auf "World" gesetzt. Dem Canvas eine Breite und Höhe von 1 gegeben (damit es genauso groß ist, wie die Zelle) und die Position des Canvas auf 0,0,0 gesetzt.

Ich bekomme es aber nicht hin, den Text so einzustellen, dass innerhalb des Canvas eine lesbare Zahl steht. Aktuell befindet sich dort nur ein schwarzer massiv verschwommener Fleck.

 

Edit: 

Um den Text passend anzuzeigen, musste ich die Breite und Höhe des Textes ebenfalls auf 1 setzen. Dann noch "Best Fit" aktivieren und die Maximale Größe auf 1 setzen.

Beim Canvas musste ich noch "Dynamic Pixels per Unit" auf 50 setzen, dann wird alles ordentlich angezeigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich versteh nicht so ganz, was du da versuchst. Normalerweise ist dein Aufbau nichts anderes als mehrere Buttons (ohne Interaktion) in einem GridLayout, also:
- 1 Canvas
- X "Buttons" (dabei besteht ein Button aus einem Sprite + Text)
- GridLayout für die Anordnung der "Buttons" in einem Grid
https://docs.unity3d.com/Manual/script-GridLayoutGroup.html

PS:
Nimmst du meinen beschriebenen Aufbau, kannst du einfach ein "Button"-Prefab erzeugen (Sprite + Text .. siehe Vorlage Button in Unity).
Das Prefab wird dann gespawnt (Instantiate) und dem GridLayout als Child untergeordnet.
Wenn du die "Buttons" dann sowieso zur Laufzeit erstellst (aus dem Prefab), dann kannst du die Referenzen zu den Textkomponenten direkt nach dem "Spawn" zwischenspeichern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich erzeuge mir ein Grid mit "Zellen", die ich hinterher anklicken kann, mit denen weiterarbeiten kann etc. 

Ich war mir nicht sicher, ob ich da jetzt ein Canvas mit Buttons nehme oder einfach wirkliche Sprites, die ich mit `void OnMouseDown()` anklicke. Also der Code funktioniert problemlos.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...