Da das Thema bereits in Discord geklärt wurde..
Ich hätte dazu noch etwas. Die Technik ist fertig, ich kann Container hinzufügen, die Healthbar baut sich nur 1x zu beginn auf etc. etc. Die Berechnungen stimmen laut Debugger ebenfalls. Nun habe ich "nur noch" das Problem, dass die Container nicht bei den passend berechneten Koordinaten oben links erzeugt werden, sondern komplett unterhalb der Canvas. Hier mal ein kleiner Ausschnitt, wenn sich die Healthbar zu Beginn der Szene aufbaut:
|
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
|
private Transform healthBar = GameObject.FindGameObjectWithTag("HealthController").transform; // der Container für die "Herzen"
private GameObject healthWrapperObject = Resources.Load("HealthContainer") as GameObject; // Das übergeordnete Hintergrundbild, das das eigentliche "Herz" beinhaltet
private List<Image> healthContainers = new List<Image>(); // Liste aller "Herzen" für spätere Health Updates etc.
private int maxHealth = 12;
private int currentHealth;
private int healthPerHealthContainer = 4; // 4 Leben pro "Herz"
private int healthContainersPerRow = 5; // 5 "Herzen" pro Reihe
private int healthContainerStartPositionX = 0; // Healthbar beginnt bei 0 auf x
private int healthContainerStartPositionY = 0; // Healthbar beginnt bei 0 auf y
private int healthContainerSpacingX = 10; // horizontaler Abstand
private int healthContainerSpacingY = -10; // vertikaler Abstand
private void Start()
{
currentHealth = maxHealth;
InitializeHealthBar();
}
public void InitializeHealthBar()
{
int neededHealthContainers = maxHealth % healthPerHealthContainer == 0 ? maxHealth / healthPerHealthContainer : maxHealth / healthPerHealthContainer + 1; // Benötigte Container ermitteln
int counter = 0; // Zählt die Herzen pro Reihe für den nächsten Umbruch
int x = healthContainerStartPositionX; // Horizontale Position des Containers
int y = healthContainerStartPositionY; // vertikale Position des Containers
for (int i = 0; i < neededHealthContainers; i++)
{
counter++;
if (counter >= healthContainersPerRow) // Umbruch nach 5 Herzen
{
x = healthContainerStartPositionX; // Wieder ganz links anfangen
y += healthContainerSpacingY; // 1 Zeile tiefer
counter = 0; // Zähler Reset
}
else
x += healthContainerSpacingX; // nächsten Container weiterschieben
Transform newHealthContainerTransform = Instantiate(healthWrapperObject, new Vector2(x, y), healthWrapperObject.transform.rotation).transform; // Das übergeordnete Hintergrundbild erzeugen
newHealthContainerTransform.SetParent(healthBar); // Das übergeordnete Hintergrundbild der Healthbar hinzufügen
healthContainers.Add(newHealthContainerTransform.GetChild(0).GetComponent<Image>()); // Das eigentliche Herz ermitteln und der Liste hinzufügen für weitere Aktionen
}
}
|
So, nun befinden sich die Herzen bei Spielstart unterhalb der Canvas (Bild). Beigefügt habe ich noch die Transform Einstellungen der Healthbar, des Herzen("HealthContainer" Container als Hintergrund) und des eigentlichen Herzen ("HealthFill"), also dem Bild, das sich verändert. Bei allen 3 Transform Einstellungen habe ich Strg+Shift+Alt gedrückt, also Position, Verankerung etc. gesetzt.
Der Healthbar soll der erzeugte HerzContainer (verankert oben links) hinzugefügt werden und diesem dann das Herzobjekt (stretch, soll genauso groß sein, wie der HerzContainer).
Innerhalb der Schleife im Code wird x und y korrekt berechnet, aber bei Spielstart haben sie auf der y-Achse dann eine falsche Position, also außerhalb der Canvas.
Ich hoffe, jemand hat eine Idee, was ich da am Code ändern muss, damit die Container oben links im Canvas liegen.