.[ ČeskéHry.cz ].
Zmena farby Unity 5
Jdi na stránku 1, 2  Další
 
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
upir102



Založen: 21. 09. 2015
Příspěvky: 9

PříspěvekZaslal: 9. listopad 2015, 22:38:14    Předmět: Zmena farby Unity 5 Odpovědět s citátem

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 Smile

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 10. listopad 2015, 10:38:04    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Radis



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

PříspěvekZaslal: 10. listopad 2015, 12:20:45    Předmět: Odpovědět s citátem

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 Smile

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? Very Happy

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
upir102



Založen: 21. 09. 2015
Příspěvky: 9

PříspěvekZaslal: 10. listopad 2015, 12:45:26    Předmět: Odpovědět s citátem

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
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. listopad 2015, 13:05:01    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Radis



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

PříspěvekZaslal: 10. listopad 2015, 13:29:18    Předmět: Odpovědět s citátem

]semo[ Souhlas, na nektere veci v Unity si clovek holt musi zvyknout Smile

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
DespeRadoX



Založen: 28. 07. 2007
Příspěvky: 520

PříspěvekZaslal: 10. listopad 2015, 13:44:44    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Radis



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

PříspěvekZaslal: 10. listopad 2015, 13:54:21    Předmět: Odpovědět s citátem

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 Smile Coz nic nemeni na faktu, ze to ma spatne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DespeRadoX



Založen: 28. 07. 2007
Příspěvky: 520

PříspěvekZaslal: 10. listopad 2015, 14:25:35    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



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

PříspěvekZaslal: 10. listopad 2015, 15:41:59    Předmět: Odpovědět s citátem

Radis > getter vytvoří kopii (to jsem nevěděl, nevadí Smile), 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
upir102



Založen: 21. 09. 2015
Příspěvky: 9

PříspěvekZaslal: 14. listopad 2015, 18:59:23    Předmět: Odpovědět s citátem

Ďakujem za odpovede,
použil som do if( if(Physics.Raycast(ray, hit) && hit.collider.gameObject.tag == "b" ))...

a už to ide Smile 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ď Smile

a.GetComponent.<Renderer>().material.color = Color.Lerp(Color.black, Color.green, Time.time);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DespeRadoX



Založen: 28. 07. 2007
Příspěvky: 520

PříspěvekZaslal: 14. listopad 2015, 19:48:23    Předmět: Odpovědět s citátem

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
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: 16. listopad 2015, 11:49:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Radis



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

PříspěvekZaslal: 16. listopad 2015, 13:30:29    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



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

PříspěvekZaslal: 16. listopad 2015, 14:42:44    Předmět: Odpovědět s citátem

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 Wink) 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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