Unity3d QuickTip – czyli szybkie porady, rozwiązania częstych problemów i sztuczki w Unity3d!

Dzisiejszy odcinek: Odwołanie się do skryptu JavaScript z poziomu C#

Uwaga! Jest to poradnik typu QuickTip. Zatem skupia się on na osiągnięciu założonego celu. Zatem zakładamy że użytkownik zna na tyle program Unity3d, aby samodzielnie wykonać najprostsze czynności, jak np. dodanie modelu kostki do sceny czy dodanie modelowi jakiegoś komponentu. Jeżeli brakuje Ci tej podstawowej wiedzy, zapraszam do tutoriala:
Unity Tutorial – Podstawy

Jednym z najczęstszych problemów występujących przy pisaniu w Unity3d, zaraz po problemie komunikacji skryptów między sobą, jest problem komunikacji skryptu napisanego w C# ze skryptem napisanym w JavaScript. Ogólnie wydaje się to praktycznie niewykonalnym zadaniem. Jednak istnieje rozwiązanie.

Zacznijmy jednak od odrobiny teorii. Z czego w ogóle wynika problem? Jest to dość proste zagadnienie. Zarówno C# jak i JavaScript wymagają kompilacji – czyli przetworzenia kodu napisanego przez programistę, na kod maszynowy, zrozumiały dla komputera. Jednak Unity nie jest w stanie kompilować wszystkiego na raz. Efekt jest taki, że o ile skrypty C# współpracują ze sobą, oraz skrypty JavaScript ze sobą, o tyle dwa różne języki współpracować ze sobą nie chcą.

Jednak z pomocą przychodzą nam foldery specjalne. Unity posiada pewną hierarchię kolejności kompilowania skryptów, która wygląda następująco:

  1. Skrypty znajdujące się w folderach: “Standard Assets“, “Pro Standard Assets“, “Plugins“.Skrypty z tej grupy, nie mogą się odwoływać bezpośrednio do inncyh skryptów spoza tych folderów, jednak mogą z nimi wchodzić w interakcję za pomocą funkcji SendMessage.
  2. Skrypty znajdujące się w folderach: “Standard Assets/Editor“, “Pro Standard Assets/Editor“, “Plugins/Editor“Te skrypty, mogą się odwołać do skryptów grupy pierwszej.Jeżeli w skrypcie chcesz używać przestrzeni (namespace) UnityEditor (using UnityEditor;), to skrypt powinieneś umieścić w jednym z tych folderów, lub folderze grupy 4.
  3. Skrypty znajdujące się po za folderem: “Editor“Te skrypty, mają dostęp tylko do skryptów z pierwszej grupy. W tym miejscu znajduje się nasza odpowiedź na pytanie: Co zrobić, jeśli chcemy by nasz skrypt C# mógł pobrać wartości ze skryptu JavaScript? Odpowiedź: Umieścić skrypt JavaScript np. w folderze Plugins lub Standard Assets, a skrypt C#, gdzieś po za tymi folderami, np. w przygotowanym przez nas folderze Scripts. (Zauważ, że to dzięki temu, że Frist Person Controller, jest domyślnie w folderze Standard Assets, możemy modyfikować np. prędkość ruchu z innego skryptu)Odnośnie tej grupy, jest jeszcze jedna ważna kwestia. Jeżeli skrypty z grupy pierwszej, zostaną zmodyfikowane i muszą zostać skompilowane ponownie, wymuszone zostaje ponowne skompilowanie skryptów z grupy trzeciej. Dlatego dobrym nawykiem jest unikanie wstawiania często modyfikowanych skryptów do folderów grupy pierwszej.
  4. Skrypty znajdujące się w folderze “Editor“Te skrypty, mogą się odwołać do wszystkich innych.Jeżeli w skrypcie chcesz używać przestrzeni (namespace) UnityEditor (using UnityEditor;), to skrypt powinieneś umieścić w tym folderze, lub jednym z folderów grupy drugiej.

Istnieje jeszcze jeden bonusowy folder o nazwie: WebPlayerTemplates. Skrypty umieszczone w tym folderze, nie zostaną skompilowane w ogóle.