2014-10-03 3 views
9

(Mit Unity 4.6.0b20)Unity 4.6: Zur Laufzeit hinzugefügte Schaltflächeninstanzen werden nicht durch die Referenzauflösung skaliert?

Ich habe ein Problem gefunden, wo Prefab Schaltflächengröße korrekt funktioniert, wenn im Editor hinzugefügt, aber scheint Referenzauflösung zu ignorieren, wenn durch Skript hinzugefügt.

Dies verwendet einen Canvas mit Referenzauflösung 1280x720 und MatchWidthOrHeight. Canvas verfügt über eine vertikale Panel-Layoutgruppe für die Schaltflächen. Die Schaltfläche hat die bevorzugte Breite/Höhe und wird als Prefab gespeichert, sodass neue Instanzen zur Laufzeit aus Assets erstellt werden können.

enter image description here

Im Editor ich die Fertig zu Szene ziehen Instanzen auf das Panel hinzuzufügen, die auch Breite 102 und sie stapeln und skalieren schön hat:

enter image description here

Aber wenn ich stattdessen Fügen Sie dem Panel neue Instanzen des Prefab via Script hinzu, die mit der falschen Größe angezeigt werden. Mit Blick auf die Dimensionen ist meine Vermutung die 102 Pixelgröße durch die Referenz Die Auflösung wird nicht skaliert werden:

enter image description here

Der Script-Code erzeugt die Instanz über GameObject.Instantiate() und fügt in das Panel, indem verwandeln. parent:

GameObject uiInstance = (GameObject)GameObject.Instantiate(Resources.Load<GameObject>(assetPath)); 
uiInstance.transform.parent = unitButtonsPanel.transform; 

ich gehe davon aus, entweder es ist mehr, dass, wenn die Taste auf dem Panel als nur Einstellung Elternteil, oder es ist ein Fehler mit der beta ...

Vorschläge Hinzufügen getan werden muss?

+1

nicht sicher, ob ich verstehe, was du meinst „, wenn es exportiert wird – mwk

+0

** schön ** gesichtet - Sie Es ist ganz richtig, standardmäßig, wenn Sie Instantiate, die ** Skalierung standardmäßig auf Null ** in der rectTransform. atemberaubend dumme Bewegung für die Einheit im Namen - aber dann, das ist Unity. – Fattie

Antwort

24

Verwenden Sie die Methode transform.SetParent Gabe von false im zweiten Parameter:

transform.SetParent(transform, false); 

So können Sie weltweit Positionierung verhindern und Skalierung. Sie finden weitere Informationen im Einheitshandbuch, indem Sie nach "UICreateFromScripting" suchen.

+0

Bessere Antwort, danke! Ich wünschte, sie hätten dieses Handbuch gehabt, während es in der Beta war :) – mwk

+0

Sehr schöne Lösung racr - tolle Sachen. – Fattie

2

Ich habe die Ursache gefunden - wenn das Prefab per Skript hinzugefügt wird, werden die Scale-Werte falsch eingestellt; In diesem Test wurde Scale auf 1.186284 gesetzt.

Aber wenn die Skript-Sets nach dem Hinzufügen der Schaltfläche auf 1,0 sofort skalieren:

GameObject uiInstance = (GameObject)GameObject.Instantiate(Resources.Load<GameObject>(assetPath)); 
uiInstance.transform.parent = unitButtonsPanel.transform; 
// HACK force scale to 1.0 
uiInstance.transform.localScale = Vector3.one; 

die neue Schaltfläche Instanzen sind richtig dimensioniert.

Imho dies ist ein Unity-Fehler, da das Hinzufügen der Prefab-Instanz im Editor setzt Skala 1.0, das Prefab selbst hat Maßstab 1.0, so kann ich keinen Grund sehen, warum das Hinzufügen von Skript sollte anders handeln. Aber ich vermute, Art, da es für die neue Benutzeroberfläche noch nicht viel Dokumentation ist :)

+0

erwähnenswert hier, da ich gerade einige Zeit auf einem Ähnliche Bugs ... stellen Sie sicher, dass alle Ihre UI-Prefabs skalieren immer auf 1.0 gesetzt ist, sonst funktioniert die Verankerung nicht richtig –

+0

Es ist nicht so viel wie unglaublich dumme Verhalten auf Unity Seite. racr0x hat t zur Verfügung gestellt Er zur Lösung, gute. – Fattie

3

Dies ist kein Fehler, es ist eine Reihenfolge der Ausführung Problem. Wenn Sie die neuen Layout-Komponenten von Unity verwenden, werden die Werte von den Layout-Komponenten bestimmt, die einmal am Ende des Rahmens berechnet werden, für den ein Layout-Neuaufbau-Aufruf erfolgt. Wenn Sie irgendetwas in einem Skript von der neuen rectTransform ableiten.Rect-Berechnungen, die von den Layout-Elementen gesteuert werden, müssen Sie warten, bis diese Berechnung ausgeführt wurde, oder Sie rufen es selbst auf

LayoutRebuilder.MarkLayoutForRebuild (als RectTransform umzuwandeln);

Sie müssen immer noch bis zum Ende des Rahmens für diese Berechnungen warten, bevor Sie etwas aus dem rectTransform wie Maßstab, POS, etc. verwenden. Dies hatte mich für eine Weile ratlos, wenn ich zuerst dynamisch erstellen UI Elemente und die Skala war Null je nachdem, wann ich sie instanziiert.

Sie darüber lesen können hier Aufruf und die Reihenfolge der Ausführung der Layout berechnet Sachen neu zu erstellen:? http://docs.unity3d.com/Manual/UIAutoLayout.html

+1

Obwohl diese Information korrekt ist, ist die Antwort einfach, dass Sie daran denken müssen, das Argument ", false" auf SetParent zu verwenden. – Fattie