Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 29. listopad 2014, 11:33:10 Předmět: Unity 4.6 NEW UI |
|
|
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 |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 10. prosinec 2014, 08:55:14 Předmět: |
|
|
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 |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 10. prosinec 2014, 09:37:29 Předmět: |
|
|
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 |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 10. prosinec 2014, 09:47:30 Předmět: |
|
|
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 |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 10. prosinec 2014, 09:53:49 Předmět: |
|
|
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 |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 10. prosinec 2014, 09:59:19 Předmět: |
|
|
]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
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 |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 10. prosinec 2014, 09:59:41 Předmět: |
|
|
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 _________________ Perry.cz |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 10. prosinec 2014, 10:10:35 Předmět: |
|
|
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 |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 10. prosinec 2014, 10:17:10 Předmět: |
|
|
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) )
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žím
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 |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 10. prosinec 2014, 10:25:10 Předmět: |
|
|
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č? |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 10. prosinec 2014, 10:29:20 Předmět: |
|
|
]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 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 |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 10. prosinec 2014, 10:57:48 Předmět: |
|
|
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.
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 |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
|
Návrat nahoru |
|
|
|