2014-10-03 16 views
9

(Utilizzo di Unity 4.6.0b20)Unity 4.6: le istanze di pulsante aggiunte in fase di esecuzione non vengono ridimensionate in base alla risoluzione di riferimento?

Ho riscontrato un problema in cui le dimensioni dei pulsanti prefabbricate funzionano correttamente quando aggiunte nell'editor ma sembrano ignorare la risoluzione di riferimento quando aggiunte dallo script.

Questo utilizza una tela con risoluzione di riferimento 1280x720 e MatchWidthOrHeight. La tela ha un gruppo di layout verticale per i pulsanti. Il pulsante ha larghezza e altezza preferite e viene salvato come prefabbricato in modo da poter creare nuove istanze dalle risorse in fase di runtime.

enter image description here

In l'editor posso trascinare il prefabbricato di scena per aggiungere istanze al pannello che ha anche la larghezza 102 e impilare e la scala ben:

enter image description here

Ma quando invece ho aggiungi nuove istanze del prefabbricato tramite script al Pannello che compaiono con le dimensioni sbagliate. Guardando le dimensioni la mia ipotesi è la dimensione 102 pixel non viene scalato dalla risoluzione Riferimento:

enter image description here

Il codice script crea l'istanza tramite GameObject.Instantiate() e aggiunge al pannello impostando trasformare. parent:

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

presumo o c'è di più che deve essere fatto quando si aggiunge il pulsante al Pannello di Parent solo l'impostazione, o si tratta di un bug con la beta ...

Suggerimenti?

+1

Non sicuro di aver capito quello che vuoi dire "quando viene esportato – mwk

+0

** ben macchiato ** - si Per impostazione predefinita, quando esegui l'Instantiate, il ** ridimensiona il valore predefinito a zero ** nel rectTransform. Improvvisamente stupido muovere per conto dell'unità, ma poi, questo è Unity. – Fattie

risposta

24

utilizzare il metodo transform.SetParent passando falso nel secondo parametro:

transform.SetParent(transform, false); 

In questo modo è possibile evitare il posizionamento mondo e ridimensionamento. Puoi trovare maggiori informazioni nel manuale dell'unità, cercando "UICreateFromScripting".

+0

Risposta migliore, grazie! Vorrei che avessero avuto quel manuale mentre era in beta :) – mwk

+0

Racr soluzione molto bella - roba fantastica. – Fattie

2

Ho trovato la causa: quando il prefabbricato viene aggiunto tramite script, i valori di Scala sono impostati in modo errato; in questo test la scala era impostata su 1.186284.

Ma se i set di script scalabili in 1.0 subito dopo l'aggiunta del tasto:

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; 

le nuove istanze del pulsante sono correttamente dimensionati.

IMHO questo è un bug unità perché aggiungendo l'istanza prefabbricato nei set di Editor in scala 1.0, la stessa ha prefabbricato in scala 1.0, quindi non posso vedere un motivo per cui l'aggiunta da script dovrebbe agire in modo diverso. Ma sto tipo di indovinare come non c'è molto documentazione per la nuova interfaccia utente ancora :)

+0

degno di menzione qui poiché ho appena trascorso del tempo su un bug simile ... assicurati che tutta la tua scala prefabbricata dell'interfaccia utente sia sempre impostata su 1.0, altrimenti l'ancoraggio non sembra funzionare correttamente –

+0

Non è un comportamento tanto stupido da parte di Unity. racr0x ha fornito t a soluzione, buono. – Fattie

3

Questo non è un bug, è un problema di ordine di esecuzione. Quando si utilizzano i nuovi componenti di layout di Unity, i valori sono guidati dai componenti di layout, che vengono calcolati una volta alla fine del fotogramma che viene effettuata una chiamata di ricostruzione del layout. Se stai basando qualcosa su uno script fuori dal nuovo rectTransform.calcoli retti guidati dagli elementi di layout, è necessario attendere che questo calcolo sia stato eseguito o chiamarlo utilizzando

LayoutRebuilder.MarkLayoutForRebuild (trasformarsi come RectTransform);

Dovrai ancora attendere la fine del fotogramma per quei calcoli che devono aver luogo prima di utilizzare qualsiasi cosa da rectTransform come scala, pos, ecc. Questo mi ha bloccato per un po 'quando ho iniziato a creare dinamicamente un'interfaccia utente elementi e la scala era zero a seconda di quando li ho istanziati.

Si può leggere su che ricostruire chiamata e l'ordine di esecuzione delle cose layout di calc qui:? http://docs.unity3d.com/Manual/UIAutoLayout.html

+1

Sebbene questa informazione sia corretta, la risposta è semplicemente che devi ricordare di usare l'argomento ", falso" su SetParent. – Fattie

Problemi correlati