Софтуерно Инженерство
Loading...
ViktorDimitrov avatar ViktorDimitrov 0 Точки

[Unity 3D] Скрипт афектира всички обекти в сцената, за които е закачен

Колеги блъскам си глават с един доста "интересен" проблем. Имам 2-3 и повече обекти които се опитвам да местя с "влачене" по екрана (Android)....имам скрипт, с който правя Ray обект от позицията на кликването върху тъч скрийна, като по този начин намирам кой обект е кликнат, след което имам друга логика дали се влачи и тн., като променяма позицията му в пространството. Не това е проблема...проблема е следния....имам публична променлва в скрипта която репрезентира празен GameObject със Textmesh в него, който съдържа някаква информация като текст. Опитвам се през кода, когато е кликнат обекта да увеличавам фонта на буквите за да постигна ефект все едно се появяват и скриват когато е кликнат...и тук идва същинския проблем че се увеличава фонта не само на TextMesha който е на кликнатия обект а и на всички останали обекти, на които е закачен скрипта. Четох някъде че проблема идва от това, че се пуска по един Ray за всеки обект а който е закачен скрипта и селектирането на всички идва от там. Някой сблъсвал ли се е с този проблем и как би могъл да се разреши?

Тагове:
0
Unity 3D 11/07/2017 11:10:16
flareset avatar flareset 139 Точки
Best Answer

Трябва в кода, в който става промяната да се посочи точно този обект. Качи някъде кода, ако не си решил да е само за лично ползване.

0
ViktorDimitrov avatar ViktorDimitrov 0 Точки

код ->  https://pastebin.com/1cQCH03i

0
yasen.dokov avatar yasen.dokov 2 Точки

Точно такъв е проблемът какъвто предполагаш (е, +-). Скриптът се изпълнява отделно за всеки обект за който е закачен, съответно който и да кликнеш, те всичките го засичат (но само за един от тях е изпълнено target == this.gameObject) и всичките променят размера на закачения за тях текст (който е различен за всяка инстанция).

Предполагам тук е по-добре да има един общ Manager/Controller, който да прави raycast само един път (това и откъм performance е по-добре) и след като засече кликнатия обект, да му променя каквото има нужда. За по-удобно може да се закачи друг скрипт за отделните обекти и Manager-а просто да му казва какво да направи, когато засече клик/драг/нещо.

0
10/07/2017 19:22:49
flareset avatar flareset 139 Точки

Пробвах го преди малко. Досега не съм използвал textMesh, а само UI text, и може да бъркам. Направих размера на фонта да се променя през определено време, променя се но не изчезва, въпреки, че в инспектора стойността му показва нула. Ако не се лъжа, минималната стойност за фонт е 1, може би затова не изчезва. Само ако не е в плей режим изчезва при нула, не изчезва, става на едва забелижимо малко петно. За този ефект по-добре е да скалираш самият обект, вместо фонта. Но, ако ще е само появяване и скриване (както ти е кода в момента), а не плавна промяна, използвай активиране и деактивиране на обекта ( опс,колегата yasen.dokov ме е изпреварил :)).

0
10/07/2017 19:54:56
yasen.dokov avatar yasen.dokov 2 Точки

Съгласен съм с flareset, че fontsize=0 не е най-добрия начин за показване/скриване. Бих заложил на enabled=false на MeshRenderer-а на текста или SetActive(false) на обекта с TextMesh-а.

0
ViktorDimitrov avatar ViktorDimitrov 0 Точки

Супер сте колеги, мерси за бързите отговори! Интересува ме сега това което е написал колегата yasen.dokov за manager/controller който да прави raycast само вендъж...може ли някакъв прост екзампъл или туториаъл от някаъде за да захапя горе долу как да го направя? А за скриването на буквите съм пробвал всички начини и всеки път резултата е че се променя на всички, но да по-удачен ми се вижда и на мен със SetActive(false) или през MeshRenderer-a.

0
yasen.dokov avatar yasen.dokov 2 Точки

Ами, то не е нещо велико. Както е сегашният ти вариант, просто не го слагаш на няколко обекта, а само на един (отделен от тези дето ще се кликат), за да се вика само един път и да raycast-ва само един път. И в него, при засичане на кликнат обект, намираш нещата които ти трябват (разбирай infoText) спрямо кликнатия обект (target в твоя код). Мисля, че това е всичко.

Ако искаш, за по-удобно може да си направиш още един MonoBehaviour, който се слага на всеки кликаем обект и в него може вече да имаш нужните параметри за отделен обект (например референция към infoText). И така, когато засечеш кой обект е кликнат, можеш да вземеш този другия компонент и от него да вземеш infoText и каквото още ти трябва. Или пък да му кажеш на него, че е кликнат и той да се оправя.

0
11/07/2017 01:33:09
ViktorDimitrov avatar ViktorDimitrov 0 Точки

Сега имам един празен обект, за който е закачен скрипта за движението, в него достъпвам полета, чайлд обекти и тн. на кликнатия обект, като вече всичко си бачка като пич. Мерси на всички колеги за помощта.

0