Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
upir102
Založen: 21. 09. 2015 Příspěvky: 9
|
Zaslal: 9. listopad 2015, 22:38:14 Předmět: Zmena farby Unity 5 |
|
|
Ahojte,
snažím sa vyriešiť problém pri zmene farby objetku . Mám dva objekty , ktoré po prejdení myšou zmenia farbu . Ale iba jeden z nich musí zmeniť farbu. A problém je v tom že ked prejdem myšou na prvý objekt farbu zmenia obidva naraz a neviem ako to vyriešiť tak aby iba jeden objekt zmenil farbu .
Ďakujem za každú pomoc
tu je kód, ktorý používam
#pragma strict
var ray : Ray;
var hit : RaycastHit;
var a : GameObject;
function Update ()
{a = GameObject.FindGameObjectWithTag("b");
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, hit) && a.gameObject.tag == "b" )
{Debug.Log(hit.collider.name);
a.GetComponent.<Renderer>().material.color = Color.Lerp(Color.black, Color.green, Time.time);
Debug.Log("zmena");
}
else {
a.GetComponent.<Renderer>().material.color = Color.Lerp(Color.white, Color.red, Time.time);
}
} |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 10. listopad 2015, 10:38:04 Předmět: |
|
|
Pravděpodobně máš k oboum objektům přířazeu stejnou isntanci materiálu. Zkus každému dát deep kopii originálního a pak to měnit. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 10. listopad 2015, 12:20:45 Předmět: |
|
|
perry: Ne, getter property "material" vytvori kopii materialu (pri prvnim pristupu).
upir102: Nejak nechapu, o co se presne snazis, ale ten tvuj kod dela to, ze kdyz najedes mysi na jakykoliv objekt, tak prvnimu nalezenemu objektu s tagem "b" zmenis barvu. A to asi neni uplne to, co jsi chtel
Podminka a.gameObject.tag == "b" je ve tvem pripade vzdycky true. Nechtel jsi tam nahodou dat hit.collider.CompareTag("b")? A taky hit.collider.GetComponent<Renderer>()?
a = GameObject.FindGameObjectWithTag("b") uplne oddelej...
Na co tam mas ten Lerp?
P.S. Vzhledem k tomu, ze volani Renderer.material vytvori kopii materialu, tak jsi pak taky zodpovedny za uvolneni teto kopie z pameti. Tak, jak to mas ted, ti to bude leakovat. |
|
Návrat nahoru |
|
|
upir102
Založen: 21. 09. 2015 Příspěvky: 9
|
Zaslal: 10. listopad 2015, 12:45:26 Předmět: |
|
|
Má to robiť to , že ak prejdem myšou na objekt zmení farbu a keď cursor myši nebude na objekte zmení na inú farbu . Len problém je v tom , že ak sú tam dva objekty a na hociktorý prejdem myšou zmenia farbu obidva rovnako a ja chcem docieliť to aby zmenil farbu objekt iba ten na ktorom je cursor myši. A s tým hit.collider.GetComponent<Renderer>() mi to tiež nejde, nenapíšeš promsím ťa presnejšie príkaz ?
perry : na internete som našiel tiež , že treba zmeniť instanciu materialu ale neviem ako na to ... skús mi to prosím ťa bližšie popísať |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 10. listopad 2015, 13:05:01 Předmět: |
|
|
Radis napsal: |
P.S. Vzhledem k tomu, ze volani Renderer.material vytvori kopii materialu, tak jsi pak taky zodpovedny za uvolneni teto kopie z pameti. |
Offtopic:
Správně jsou za to zodpovědní oni (Unity). Když se uvolní renderer, měl by se uvolnit i materiál, kterej vytvořil. Tváří se to jako obyč. properta a ta kopie je side effect. Ale oni to neuvolňují, je to takový polobug. Tak jak to je, by to měla být funkce pojmenovaná getOrCreateMaterial(). _________________ 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. listopad 2015, 13:29:18 Předmět: |
|
|
]semo[ Souhlas, na nektere veci v Unity si clovek holt musi zvyknout
upir102: Ach jo. Perry nema pravdu, Renderer.material opravdu vytvari kopii. Muzes si to precist v manualu, kdyz mi neveris.
Tohle zmeni barvu jenom objektu, nad ktery najedes mysi:
kód: |
void Update()
{
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
hit.collider.GetComponent<Renderer>().material.color = Color.green;
}
}
|
|
|
Návrat nahoru |
|
|
DespeRadoX
Založen: 28. 07. 2007 Příspěvky: 520
|
Zaslal: 10. listopad 2015, 13:44:44 Předmět: |
|
|
zmeni ti na oboch lebo tam mas ELSE a nejaka ina kolizia vzdy nastane, daj si do toho cyklu zvlast podmienku na oba.
ad material.... ano pri renderer.material sa vytvara nova instancia materialu a to aj pri dotazovani mpr material.getcolor takze na dotazovanie (aknejdeme menit material)treba pouzit sharedMaterial.getcolor ...vtedy sa instancia nevytvori... _________________ http://www.touchgames.eu/
http://playito.com
TW: @Despo100
Space Merchants Online ...zruseny, pracujem na mobilnej verzii space merchantu |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 10. listopad 2015, 13:54:21 Předmět: |
|
|
DespeRadoX: jenomze on v te podmince ma renderer objektu "a" a na zacatku Update() ma "a = GameObject.FindGameObjectWithTag("b");" takze stejne nechapu, jak se mu podarilo, aby to menilo barvu dvema ruznym objektum Coz nic nemeni na faktu, ze to ma spatne. |
|
Návrat nahoru |
|
|
DespeRadoX
Založen: 28. 07. 2007 Příspěvky: 520
|
Zaslal: 10. listopad 2015, 14:25:35 Předmět: |
|
|
2radis:mas recht j som ten kod riadne ani nepozeral,
ked uz teda tak takto nejak, ale ja by som to aj tak spravil uplne inac nech sa pri kazdej kolizii nieco zbytocne nenastavuje
kód: |
function Update ()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, hit)
{
if(hit.collider.gameObject.tag == "b" ) {
prvy.GetComponent.<Renderer>().material.color = Color.Lerp(Color.black, Color.green, Time.time);
}
else {
prvy.GetComponent.<Renderer>().material.color = Color.Lerp(Color.white, Color.red, Time.time);
}
if(hit.collider.gameObject.tag == "c" ) {
druhy.GetComponent.<Renderer>().material.color = Color.Lerp(Color.black, Color.green, Time.time);
}
else {
druhy.GetComponent.<Renderer>().material.color = Color.Lerp(Color.white, Color.red, Time.time);
}
} |
_________________ http://www.touchgames.eu/
http://playito.com
TW: @Despo100
Space Merchants Online ...zruseny, pracujem na mobilnej verzii space merchantu |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 10. listopad 2015, 15:41:59 Předmět: |
|
|
Radis > getter vytvoří kopii (to jsem nevěděl, nevadí ), ale nikde nevidím jak s tím @upi102 pak nakládá a jestli to někde někam nepřiřazuje ručně.
Já např. mám pool, kde mám materiál a z něj si ho vytáhnu a přiřadím modelu - mám jednu instanci materiálu na všechny modely (a jejich části). Což pokud chci změnit barvu pro model je fajn, změním barvu na isnstanci, akorát si musím dát pozor aby 1 model = 1 deep kopie, ale v rámci "sub částí" modelu už mi to netrápí a můžu mít shallow kopii _________________ Perry.cz |
|
Návrat nahoru |
|
|
upir102
Založen: 21. 09. 2015 Příspěvky: 9
|
Zaslal: 14. listopad 2015, 18:59:23 Předmět: |
|
|
Ďakujem za odpovede,
použil som do if( if(Physics.Raycast(ray, hit) && hit.collider.gameObject.tag == "b" ))...
a už to ide všetko ako má
ale jeden problém ma ešte trápi, funkciu lerp čo som pridával mala meniť farbu objetku pomaly, no aj keď ju tam mám farba sa zmení v okamžiku ..neviete kde robím chybu ?
Ďakujem za odpoveď
a.GetComponent.<Renderer>().material.color = Color.Lerp(Color.black, Color.green, Time.time); |
|
Návrat nahoru |
|
|
DespeRadoX
Založen: 28. 07. 2007 Příspěvky: 520
|
Zaslal: 14. listopad 2015, 19:48:23 Předmět: |
|
|
Takto nejak ale musis si to dat na podmienku a spustit to len ked potrebujes, predtym vzdy vynulovat i;
kód: |
float i=0;
float fade_speed = 1f;
void update(){
i+=fade_speed*Time.deltatime;
a.GetComponent.<Renderer>().material.color = Color.Lerp(Color.black, Color.green, i);
} |
_________________ http://www.touchgames.eu/
http://playito.com
TW: @Despo100
Space Merchants Online ...zruseny, pracujem na mobilnej verzii space merchantu |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 16. listopad 2015, 11:49:14 Předmět: |
|
|
Případně:
kód: |
material.color = Color.Lerp(material.color, Color.green, Time.deltaTime); |
Výhoda oproti desperadoxovu způsobu je ta, že to nepotřebuješ zapínat podmínkou. Možná nevýhoda je, že se se to nebude měnit rovnoměrně a k výsledku (Color.green) to vlastně teoreticky nikdy nedojde. Ale u barev to bude ok a bude to vypadat dobře :-).
Ještě mi připadá mi, že tomu Lerpu moc nerozumíš, proto malá osvěta:
Lerp (linear interpolation) míchá první parameter (a) s druhým (b) na základě třetího (t), který je od 0 do 1. vysledek = a + (b-a)*t; Nebo jinak vysledek = a * (1-t) + b * t;
K uvedenému kódu:
Delta time je 1/fps, takže obsahuje čísla jako třeba 0.0333... (pro 30fps). Čili když třetí parametr bude 0.00něco, tak to v mnou uvedeném případě znamená, že si výsledek ukrojí vždy malý kousek z cílový barvy.
Tipy:
pokud bys použil desperadoxův kód, můžeš si pohrát s parameterm t (desperadox mu říká i) a docílit jiných animačních efektů:
např:
kód: |
Color.Lerp(Color.black, Color.green, i * i); |
Víme, že i je od 0 do 1, takže když dáš i * i, tak se barva bude měnit nejdřív pomalu a potom rychle (v polovině animace, kdy i bude 0.5, bude i*i = 0.25 a tudíž budeš mít v polovině animace teprve čtvrtinu výsledný barvy, ovšem na konci už to bude ok, protože 1 * 1 = 1.)
Pro opačný efekt můžeš použít odmocninu z i.
Snadno rozšíříš i na cosinusovou interpolaci, kde místo i dosadíš tohle:
kód: |
1 - (cos((i * pi)+1)*0.5) |
Což vezme kus křivky z cosinusu a udělá tak animaci pozvolnější na začátku a na konci, což je vnímáno jako pěkné :-). _________________ 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: 16. listopad 2015, 13:30:29 Předmět: |
|
|
Tohle mi pripada jako lepsi pristup, zapis je IMHO prirozenejsi a nema ty dve nevyhody, co ]semo[ zminil (tzn. takto hodnota opravdu dojde k vysledku a hlavne tam dojde bez zpomalovani, linearne):
kód: |
var timeSinceStart = Time.time - startTime;
var t = timeSinceStart / duration;
material.color = Color.Lerp(Color.red, Color.green, t);
|
|
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 16. listopad 2015, 14:42:44 Předmět: |
|
|
kód: |
material.color = Color.Lerp(material.color, Color.green, Time.deltaTime); |
semův kód jsem asi trochu nepochopil, perry chce měnit barvu pozvolně, zatímco Time.deltaTime bude třeba vždy 0,0167 (pro 60 fps) nebo případně skákat semo-tamo (pun intended ) kolem té hodnoty, tudíž ten lerp jen natvrdo nastaví barvu, ale nebude se sám posouvat dál, nemá vnitřní stav, je to jen výpočet. To bych asi perrymu zdůraznil. |
|
Návrat nahoru |
|
|
|