.[ ČeskéHry.cz ].
Unity 4.6 NEW UI

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
McMagic



Založen: 06. 08. 2012
Příspěvky: 615

PříspěvekZaslal: 29. listopad 2014, 11:33:10    Předmět: Unity 4.6 NEW UI Odpovědět s citátem

Tak včera jsem aktualizoval na Unity na 4.6

Na první pohled je rozdíl mezi Legacy UI a NEW 4.6 UI asi tak jako:

Legacy: XHTML + CSS
NEW 4.6: Flash + action script

Zkusil jsem si přepsat pár věcí do nového a zatím jsem spokojen (i když to že vidím GUI na scéně mě nijak neohromuje - jsem naučen přes CSS si vše plánovat v Photoshopu a pixely počítat v hlavě za běhu).
A jsem rád, že jsem s ostatními věcmi spíše čekal (i když přepsání mě čeká tedy hodně - celá logika drag drop atd.)

Zkoušel nové UI už někdo dříve v beta stavu?
Hlavně mě zajímá rozdíl ve výkonu (který má být lepší).

Celkem se ale pročišťuje kód a není zahlcen GUI prvky jako dříve, na druhou stranu je to na scéně... (ale dají se udělat prefaby atd.)

Nový kód na stat bary se zmenšil na celkem slušnou velikost a přehlednost:
(vše kolem gui je nastaveno v prefabu a nemusím tak definovat hodnoty přes kód, když potřebuji aby stat bar měl jinou šířku odsazení atd.)

kód:

   void Start () {
      MAIN_LABEL_TEXT.text = LABEL;
      //set up
      if(FILL_ALIGMENT == fill_aligment.RIGHT){
         MAIN_LABEL.anchoredPosition = new Vector2( (MAIN_ELEMENT.sizeDelta.x+55f),MAIN_LABEL.anchoredPosition.y);
         MAIN_LABEL_TEXT.alignment = TextAnchor.MiddleLeft;
      }else{
         MAIN_LABEL.anchoredPosition = new Vector2(-60f,MAIN_LABEL.anchoredPosition.y);
         MAIN_LABEL_TEXT.alignment = TextAnchor.MiddleRight;
      }
      if(STAT_ALIGMENT == stat_aligment.TOP){
         ARROW_OBJ.GetComponent<RawImage>().texture = arrow_top;
         VALUE_LABEL.anchoredPosition = new Vector2(0f,12f);
      }else{
         ARROW_OBJ.GetComponent<RawImage>().texture = arrow_bottom;
         VALUE_LABEL.anchoredPosition = new Vector2(0f,-12f);
      }
      //
   }
   void Update () {
      if(CUR_VALUE != null){
         //vzorec
         float pocetP = ( CUR_VALUE / (MAX_VALUE/100f));//%
         RESULT_VALUE = (((MAIN_ELEMENT.sizeDelta.x-2f)/100f)*pocetP);
         //RESULT
         if(FILL_ALIGMENT == fill_aligment.RIGHT){
            FILL.sizeDelta = new Vector2(RESULT_VALUE,FILL.sizeDelta.y);//FILL
            ARROW.anchoredPosition = new Vector2((RESULT_VALUE-(ARROW.sizeDelta.x/2f)),ARROW.anchoredPosition.y);//ARROW
            VALUE_LABEL.anchoredPosition = new Vector2(RESULT_VALUE,VALUE_LABEL.anchoredPosition.y);//VALUE LABEL
            VALUE_TEXT.text = Mathf.Round(pocetP)+"%";
         }else{
            FILL.sizeDelta = new Vector2(RESULT_VALUE,FILL.sizeDelta.y);//FILL
            FILL.anchoredPosition = new Vector2( MAIN_ELEMENT.sizeDelta.x-RESULT_VALUE, FILL.anchoredPosition.y );//FILL POSITION
            ARROW.anchoredPosition = new Vector2((MAIN_ELEMENT.sizeDelta.x-RESULT_VALUE-(ARROW.sizeDelta.x/2f)),ARROW.anchoredPosition.y);//ARROW
            VALUE_LABEL.anchoredPosition = new Vector2(MAIN_ELEMENT.sizeDelta.x-RESULT_VALUE,VALUE_LABEL.anchoredPosition.y);//VALUE LABEL
            VALUE_TEXT.text = Mathf.Round(pocetP)+"%";
         }
         //
      }
   }


oproti předchozímu bordelu co sloužil jen jako rychlo test a čekání na přepsaní dle toho jak dopadne nové Unity UI:

kód:

   //CREATE CLASS
   public NIguiClass(NI_GUItype type,NI_GUIalignment alignment, Font font, string texture, float guiSirka, float mainElementSirka, float labelSirka, float cFv, float mFv, string label, TextAnchor labelAligment){
      //setUp
      this.ni_gui_type = type;
      this.ni_gui_alignment = alignment;
      this.ni_gui_font = font;
      this.ni_gui_texture = texture;
      this.ni_gui_sirka = guiSirka;
      this.ni_gui_mainElementSirka = mainElementSirka;
      this.ni_gui_labelSirka = labelSirka;
      //
      this.curentFloatValue = cFv;
      this.maxFloatValue = mFv;
      this.label = label;
      this.labelAligment = labelAligment;
      //
   }
   //RENDER GUI
   public void OnGUI() {
      switch(ni_gui_type){
      //STAT BAR
      case NI_GUItype.STAT_BAR:
         //
         float leftPadding = 0f;
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            leftPadding = ni_gui_sirka-(ni_gui_mainElementSirka+ni_gui_labelSirka);
         //
         GUI.skin.font = ni_gui_font;
         GUI.skin.label.alignment = labelAligment;
         //label
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            GUI.Label( new Rect((leftPadding+0f),6f,ni_gui_labelSirka,20f),label);//left
         if(ni_gui_alignment == NI_GUIalignment.RIGHT)
            GUI.Label( new Rect((0f+ni_gui_mainElementSirka),6f,ni_gui_labelSirka,20f),label);//right
         //BAR BG
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            GUI.DrawTexture(new Rect((leftPadding+ni_gui_labelSirka),10f,ni_gui_mainElementSirka,11f),(Texture2D)Resources.Load("GUI/hud/bar_black_bg_255x11") );//black bg
         if(ni_gui_alignment == NI_GUIalignment.RIGHT)
            GUI.DrawTexture(new Rect(0f,10f,ni_gui_mainElementSirka,11f),(Texture2D)Resources.Load("GUI/hud/bar_black_bg_255x11") );//black bg
         //vzorec
         float pocetP = ( curentFloatValue / (maxFloatValue/100f));//%
         float resultP = ((ni_gui_mainElementSirka/100f)*pocetP);
         //BAR FILL
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            GUI.DrawTexture(new Rect((leftPadding+(ni_gui_labelSirka+ni_gui_mainElementSirka-resultP)),10f,resultP,11f),(Texture2D)Resources.Load("GUI/hud/"+ni_gui_texture) );//fill
         if(ni_gui_alignment == NI_GUIalignment.RIGHT)
            GUI.DrawTexture(new Rect(0f,10f,resultP,11f),(Texture2D)Resources.Load("GUI/hud/"+ni_gui_texture) );//fill
         //BAR OUTLINE
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            GUI.DrawTexture(new Rect((leftPadding+ni_gui_labelSirka),10f,ni_gui_mainElementSirka,11f),(Texture2D)Resources.Load("GUI/hud/bar_outline_255x11") );//outline
         if(ni_gui_alignment == NI_GUIalignment.RIGHT)
            GUI.DrawTexture(new Rect(0f,10f,ni_gui_mainElementSirka,11f),(Texture2D)Resources.Load("GUI/hud/bar_outline_255x11") );//outline
         //INFO %
         GUI.skin.label.alignment = TextAnchor.MiddleCenter;
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            GUI.Label( new Rect((leftPadding+(ni_gui_labelSirka+ni_gui_mainElementSirka-resultP)-25f),-5f,50f,20f), Mathf.Round(pocetP)+"%" );
         if(ni_gui_alignment == NI_GUIalignment.RIGHT)
            GUI.Label( new Rect((resultP)-25f,-5f,50f,20f), Mathf.Round(pocetP)+"%" );
         //ARROW
         if(ni_gui_alignment == NI_GUIalignment.LEFT)
            GUI.DrawTexture(new Rect((leftPadding+((ni_gui_labelSirka+ni_gui_mainElementSirka-resultP)-5f)),10f,11f,11f),(Texture2D)Resources.Load("GUI/hud/bar_arrow_down_11x11") );//arrow
         if(ni_gui_alignment == NI_GUIalignment.RIGHT)
            GUI.DrawTexture(new Rect(((resultP)-7f),10f,11f,11f),(Texture2D)Resources.Load("GUI/hud/bar_arrow_down_11x11") );//arrow
         //
         break;
      default:
         //none
         break;
      }
   }

_________________


http://www.mcmagic-productions.com/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Radis



Založen: 29. 03. 2014
Příspěvky: 235

PříspěvekZaslal: 10. prosinec 2014, 08:55:14    Předmět: Odpovědět s citátem

Jo, ja pouzivam nove UI uz od bety. Oproti staremu je samozrejme jako nebe a dudy.

citace:
to že vidím GUI na scéně mě nijak neohromuje

Tak to by te ohromovat melo. To, ze se nejedna o immediate mode UI a ze muzes interface designovat primo v editoru je snad ta nejdulezitejsi zmena, ne?

citace:
Hlavně mě zajímá rozdíl ve výkonu (který má být lepší).

Jo, vykon je uplne nekde jinde, hlavne na mobilnich zarizenich.

Ukazky kodu nekomentuju, je to urcite jen docasny kod, ktery casem trochu vylepsis a urcite taky zacnes pouzivat bezne kodovaci konvence Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
McMagic



Založen: 06. 08. 2012
Příspěvky: 615

PříspěvekZaslal: 10. prosinec 2014, 09:37:29    Předmět: Odpovědět s citátem

Ad GUI na scéně:

Neohromuje mě to z toho hlediska, že jsem naučen to řešit jinak.
(vse si naplanovat v psd presne na pixel, narezat, vypocitat atd.)
Na druhou stranu je to rozhodně super a velké plus pro ladění detailu atd.

Ad kod - to je jen docasny jak legacy tak new - bylo to hlavne pro ukazku.
Legacy byl proste nutne zlo nez prijde U4.6 - a novy je rychlo test a seznamovani, ale jde o to ze se to pekne zmensilo a zprehlednilo i v takoveto test forme.

Pro mne je nejvetsi zmena v GUI uplne jiny pristup k reseni eventu a celkova vyladenost jejich chovani ci pristup k elementum a logicky resene blbosti jako odsazeni atd. - zkousel jsem prepisovat drag drop a inventar a chova se to o hodne lepe nez legacy.
_________________


http://www.mcmagic-productions.com/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 10. prosinec 2014, 09:47:30    Předmět: Odpovědět s citátem

Radis napsal:
Ukazky kodu nekomentuju, je to urcite jen docasny kod, ktery casem trochu vylepsis a urcite taky zacnes pouzivat bezne kodovaci konvence :)


To by mě teda zajímalo, co se ti na tom kódu nezdálo. Nějaké formátování si drží, nějaké konvence tam taky vidím. Vzhledem k tomu, že je to skript na vzkreslení konkrétního GUIčka, tak víc neni potřeba - takový skript je potřeba chápat spíš jako data, než kód.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 10. prosinec 2014, 09:53:49    Předmět: Odpovědět s citátem

A furt se zadává velikost komponenty v pixelech? To mi hrozně pilo krev. Jako by to nemohlo být relativní. To samý u fontů. Kolega pak pužíval na nascalování tu GUI.matrix, ale to zas způsobovalo hnusný aliasing (to ale bylo v Unity 3.5).
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Radis



Založen: 29. 03. 2014
Příspěvky: 235

PříspěvekZaslal: 10. prosinec 2014, 09:59:19    Předmět: Odpovědět s citátem

]semo[ Tak ja nevim, kdyz pracuju s nekym v tymu (i sam) tak dodrzuju aspon standardni coding conventions. TREBA_TAKTO se snad pojmenovavaji konstanty, a to jeste ke vsemu v Jave, v C# rozhodne ne, a uz vubec ne normalni promenne. Podrzitka misto camelCase taky neni standard. Kdyz clovek na necem dela sam, tak mozna konvence resit nemusi, v tymech je to nutnost. A kombinovat cestinu s anglictinou, a to dokonce v nazvu jedne promenne, to bych taky asi nedelal Smile

Jinak jsem ten kod moc nezkoumal, nicmene mit v OnGUI (= nekolikrat za frame) nekolik volani Resources.Load() taky asi nebude uplne fajn.

A upraveny kod s novym UI bych taky pojal jinak, ale to je na delsi diskuzi a nema to cenu resit, kdyz to McMagic bere jako temp reseni.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 10. prosinec 2014, 09:59:41    Předmět: Odpovědět s citátem

Cože.. to má pozicování v pixelech.. WTF. To i můj system, co jsem udělal za týden má podporu obojího... Unity Rolling Eyes
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 10. prosinec 2014, 10:10:35    Předmět: Odpovědět s citátem

Radis: jo, máš pravdu, nějak jsem se podíval špatně a přehlídnul lecos z toho, co jsi napsal.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
McMagic



Založen: 06. 08. 2012
Příspěvky: 615

PříspěvekZaslal: 10. prosinec 2014, 10:17:10    Předmět: Odpovědět s citátem

Radis - to je muj temp bordel (hlavne v legacy) - neresil bych;)

Nektere veci jsou tak schvalne viz uppercase - je to schvalne pro na prvni pohled lepsi oznaceni GUI objektu.

Resource.load() v legacy je prasarna v onGUI - byla to ale provizorni trida atd.

Legacy vubec neresit!

cz/ang mix to je takova moje divna úchylka - kterou mam vzdy v privat solo kodu - v tymu (normalni prace) to resim jinak (kdyz vim ze to po me musi nekdo cist (jak se rika kodovani je z 90% komentovani a cistota kodu a to pokud bych mel resit v privat tak to budu delat zbytecne dlouho = ja se v tom svem bordelu vyznam). Ale pro sebe si vzdy delam takove divnosti (nejedu podle nejakych pravidel co nekdo urcil a vsichni se toho musi drzet protoze to nekdo rekl/nastavil -> jsem strelec (znameni) ) Smile

Tj. pokud mě někdo začne vnucovat že XY musí být vždy ABC. A já vím že nemusí a nikomu tím neublížím. Tak to budu dělat jinak tak jak chci.
Pokud mě někdo říká, že se musí jezdit v autě vpravo a vím že vlevo bych asi hodně ublížil, tak jedu vpravo a pravidlo dodržímWink
Tj. pravidla co mají smysl dodržuji - ostatním se vnitřně bouřím (už od malička:) ), pokud v nich nevidím plus a logiku pro svoje potřeby.


------
Ad px - ted si nejsem 100% jist a mozna budu mluvit z cesty.

Ale cele to new GUI pracuje tim stylem, ze se kdyz zadas panel o velikosti 200x600px tak je treba to resit k pomeru zdroje. A scale se pak nastavuje a resi pres canvas.

Tj. v psd mam udelany layout na rozliseni 1600x900. Dle toho si udelam i dany panel 200x600 ale canvas na scene ma jasne nastaveno, ze je to pro rozliseni 1600x900 a automaticky dela scaling dle rozliseni monitoru atd. A funguje to hodne dobre - jen je treba si s tim pohrat a drzet cele GUI ve zdroji v jednom rozliseni!
_________________


http://www.mcmagic-productions.com/


Naposledy upravil McMagic dne 10. prosinec 2014, 10:30:09, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 10. prosinec 2014, 10:25:10    Předmět: Odpovědět s citátem

Jo tenhle typ pozicování se mi taky líbí, mám ho i v jedné hře. Pracovat s pozicí 0,125, když v obrázku, kde jsem to navrhl, to je 200. pixel z 1600, proč? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Radis



Založen: 29. 03. 2014
Příspěvky: 235

PříspěvekZaslal: 10. prosinec 2014, 10:29:20    Předmět: Odpovědět s citátem

]semo[ Vezmes si nejaky referencni rozliseni a v nem designujes UI. Anchors a pivoty zadavas relativne, rozmery komponent opravdu v pixelech, ale on to zase takovy problem neni, kor kdyz to vetsinou delas mysi Smile Mne treba neprijde spatne rict, ze v rozliseni 800x600 chci button 100x100px (misto 0.125x0.1666). Se starym UI to nema spolecneho vubec nic, musel bys to zkusit. Fakt to neni spatne Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
McMagic



Založen: 06. 08. 2012
Příspěvky: 615

PříspěvekZaslal: 10. prosinec 2014, 10:54:22    Předmět: Odpovědět s citátem

Takto vypada to nastaveni canvas


_________________


http://www.mcmagic-productions.com/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 10. prosinec 2014, 10:57:48    Předmět: Odpovědět s citátem

Radis napsal:
Kdyz clovek na necem dela sam, tak mozna konvence resit nemusi, v tymech je to nutnost

Dá se fungovat, i když kolega píše, jak to kulantně říct, mysteriózním způsobem a s jinými konvencemi. Akorát pak vždycky Despovi píšu na Skype, kde najdu některou funkčnost, a on mi řekne game object nebo číslo řádku ve skriptu, kde se domnívá, že to asi přibližně je. Very Happy

Jinak nové GUI jsem zkoušel zrovna předevčírem a je to fajn, co jsme dřív počítali ručně přes GUI.matrix teď pořeší vhodné ukotvení, ten event system taky vypadá příjemně intuitivně. Práci s fonty a skiny jsem ještě podrobně nezkoušel, to byl občas na Androidu opruz, ale věřím, že to taky vylepšili.


Naposledy upravil Mem dne 10. prosinec 2014, 11:04:04, celkově upraveno 2 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
McMagic



Založen: 06. 08. 2012
Příspěvky: 615

PříspěvekZaslal: 10. prosinec 2014, 10:59:30    Předmět: Odpovědět s citátem

A pak už to vše nastavuješ vše relativně k daným elementům celkem v pohodě.


_________________


http://www.mcmagic-productions.com/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna