| 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 |
|
 |
|