Przewodnik programisty tworzenia skryptów wizualnych w usłudze Mesh

Przejdź do artykułu Omówienie skryptów wizualnych

Ograniczenia

  • Tylko podzbiór funkcji aparatu Unity jest udostępniany skryptom wizualnym.
  • Zmienne i właściwości z typami innymi niż proste (w tym odwołaniami do obiektów) nie są automatycznie udostępniane. Aby dowiedzieć się więcej na ten temat, zobacz Udostępnianie i sieć poniżej.

Witaj, świecie

Najprostszy skrypt wizualny, który można utworzyć, to taki, który po prostu otwiera okno komunikatu:

Zrzut ekranu przedstawiający wykres skryptu wizualizacji przykładu Hello world

Wygląda to w usłudze Mesh:

Okno przeglądarki siatki z wyskakującym oknem dialogowym z Hello world i przyciskiem OK

Zrzut ekranu edytora aparatu Unity z otwartymi Hello world sceny tworzenia skryptów wizualnych usługi Mesh.

Testowanie skryptów

Przed przekazaniem sceny do usługi Mesh można opracowywać i testować skrypty wizualne, nawet w przypadku wielu klientów w trybie podzielonego ekranu przy użyciu trybu emulacji siatki.

Diagnostyka skryptów wizualnych w edytorze

Po wybraniu obiektu GameObject z maszyną skryptu w hierarchii przekształcania usługa Mesh wyświetla panel Diagnostyka skryptów wizualnych usługi Mesh w dolnej części panelu Inspektor:

Zrzut ekranu przedstawiający panel diagnostyki skryptów wizualnych usługi Mesh

Panel diagnostyki przekazuje natychmiastową opinię na temat wszelkich ostrzeżeń lub błędów, które mogą uniemożliwić działanie skryptów w usłudze Mesh.

Bieżące ograniczenie: Przyszłe wersje panelu diagnostyki mogą również zapewnić wgląd w użycie zmiennych i właściwości udostępnionych przez skrypt wizualny oraz wyświetlenie dodatkowej diagnostyki i ostrzeżeń.

Przekazywanie do usługi Mesh

Przekazywanie scen zawierających skrypty wizualne za pomocą modułu przekazującego usługę Mesh . Aby otworzyć program przekazujący, w menu Mesh Toolkit (Zestaw narzędzi usługi Mesh) wybierz pozycję Environments (Środowiska).

Uwaga: Moduł przekazujący usługę Mesh weryfikuje skrypty wizualne przed przekazaniem i odmawia przekazania w przypadku wystąpienia błędów walidacji w skryptach wizualizacji. Szczegółowa diagnostyka jest danymi wyjściowymi konsoli.

Udostępnianie i sieć

Stan udostępnionego i lokalnego skryptu

Usługa Mesh używa skryptów wizualnych aparatu Unity, które jest przeznaczone do pracy bez sieci. Skrypty wizualne są uruchamiane niezależnie na każdym kliencie. Jednak środowisko usługi Mesh użytkowników jest współużytkowane; wszyscy użytkownicy korzystają z jednej udostępnionej sceny, która wygląda tak samo na wszystkich klientach.

Efektem wykonywania skryptu wizualizacji jest sposób zmiany stanu sceny.

Domyślnie usługa Mesh automatycznie replikuje zmiany sceny wykonywane przez skrypty wizualne na jednym kliencie do wszystkich innych klientów. Oprócz wszystkiego, co jest udostępniane w scenie, niektóre stany pozostają niezależne od każdego klienta (innymi słowy lokalne).

Zmiany lokalne tymczasowo mają pierwszeństwo przed zmianami pochodzącymi z klientów. Przykład: w przypadku lokalnego animowania obiektu animacja lokalna nie zostanie naruszona przez zmiany pochodzące z innych klientów.

Istnieje pewne ograniczenie szybkości aktualizacji automatycznych. Klient nie wysyła dodatkowych aktualizacji, gdy jest nadal w locie; istnieje jedna aktualizacja wysyłana w obie strony przez serwer. Oznacza to około pięciu do sześciu aktualizacji na sekundę w sytuacjach praktycznych. Oznacza to, że płynna animacja sterowana przez jednego klienta nie będzie wyglądać płynnie na innych klientach. Najlepszym rozwiązaniem jest wykonywanie płynnych animacji lokalnie, najlepiej nie za pomocą skryptów wizualnych, ale za pośrednictwem normalnego systemu animacji aparatu Unity.

Gwarantowana jest spójność ostateczna stanu udostępnionego (nawet jeśli stany klientów mogą być tymczasowo różne).

Stan lokalny:

  • Naturalny stan lokalny — dźwięki, interfejs użytkownika, renderowanie.
  • Stan lokalny kontrolowany przez użytkownika — podsieci oznaczone składnikiem Zakres skryptu lokalnego .
  • Stan lokalny techniczny — obiekty, które nie są częścią hierarchii sceny (na przykład materiały renderujące, zasoby).

Stan udostępniony:

  • Ograniczone do zmiennych skryptu wizualnego oraz właściwości obiektów GameObjects i składników sceny, które są częścią hierarchii sceny.
  • Można replikować tylko zmienne i właściwości prostych typów: liczby całkowite, liczby zmiennoprzecinkowe, wartości logiczne, ciągi, Color,3/Vector2/4 , Quaternion, Matrix4x4i .Rect

Każda zmiana stanu udostępnionego jest wysyłana przez sieć. Zwiększa to ruch sieciowy i, jeśli jest używany beztroski, może zużywać znaczną przepustowość.

Wyzwalacze udostępnionego i lokalnego skryptu

Wszystkie przepływy skryptów wizualnych są uruchamiane w odpowiedzi na zdarzenie.

  • Jeśli zdarzenie pochodzi z jednego klienta (na przykład użytkownik kliknie przycisk), skrypt wizualizacji jest wykonywany tylko na tym kliencie.
  • Jeśli zdarzenie występuje na wszystkich klientach, skrypt wizualizacji jest wykonywany na wszystkich klientach (na przykład zdarzenie czasomierza, zmiana właściwości udostępnionej, aktualizacja zmiennej udostępnionej, awatar wprowadza wyzwalacz, ciała fizyki dotyka zderzacz).

Podczas dodawania węzła do wykrywania, czy obiekt jest zaznaczony, ważne jest, aby wybrać właściwy. Dostępne są dwie opcje : Treść z możliwością interakcji z siatką: Jest zaznaczona lokalnie i Treść z możliwością interakcji z siatką: jest zaznaczona. Załóżmy na przykład, że chcesz mieć przycisk, który można kliknąć, aby wyzwolić teleportację. Aby uczestnik kliknęli przycisk i przetransportowali się tylko samodzielnie, użyj węzła Treść z możliwością interakcji z siatką: jest zaznaczona lokalnie .

Zrzut ekranu przedstawiający węzeł Treść interakcji z siatką jest wybierany lokalnie.

Aby uczestnik kliknie przycisk i teleportuj wszystkich użytkowników w środowisku, użyj węzła Treść z możliwością interakcji z siatką: jest zaznaczona . W każdym przypadku tekst nad węzłem informuje o zachowaniu, którego można oczekiwać:

Zrzut ekranu przedstawiający węzeł Treść z możliwością interakcji z usługą Mesh jest zaznaczony, co wpłynie na wszystkich klientów.

Jeśli skrypt lokalny ustawia zmienną udostępnioną, a drugi skrypt nasłuchuje zmian w tej zmiennej (przy użyciu wyzwalacza On State Changed ; zobacz poniżej), drugi skrypt zostanie wykonany na wszystkich klientach.

Usługa Mesh oferuje kilka specjalnych węzłów skryptu:

  • W przypadku wyzwalaczy interwałów w regularnych odstępach czasu synchronicznie na wszystkich klientach.
  • Po zmianie stanu wyzwalane po zmianie danych wejściowych (na przykład właściwości udostępnione, zmienne współużytkowane, lokalne).
  • Okno dialogowe Pokaż wyświetla okno dialogowe komunikatu z tekstem niestandardowym, które może opcjonalnie udostępniać przyciski jako opcje odpowiedzi.

Mesh sprawia, że pewne kompromisy na rzecz prostoty:

  • Jeśli więcej niż jeden klient próbuje zmienić te same dane, ostatni klient wygrywa (zamiast używać modelu aktualizacji danych opartych na transakcji).
  • Aby zapewnić spójność danych, skrypty wizualne uruchamiane na wszystkich klientach nie mogą odczytywać, a następnie zapisywać udostępnione właściwości lub zmienne. W takim przypadku wyzwala błąd środowiska uruchomieniowego i przerywa wykonywanie przepływu skryptu.

Najlepsze rozwiązania

Skrypty wizualne są znacznie wolniejsze niż natywny kod w języku C#. Ponadto usługa Mesh rozszerza skrypty wizualne o sieć i inne funkcje integracji, a pozornie akcje skryptów wizualizacji o niskim narzucie mogą spowodować ruch sieciowy.

Problemy z wydajnością w skryptach wizualnych są prawie zawsze spowodowane przez skrypty wykonujące aktualizacje o wysokiej częstotliwości zmiennych lub właściwości składników, które są domyślnie współużytkowane.

  • Należy używać składników zakresu skryptu lokalnego w sposób liberalny, aby upewnić się, że tylko zmienne i właściwości składników, które muszą być synchronizowane między klientami, powodują obciążenie sieci. Nie należy udostępniać żadnych elementów animowanych lokalnie za pomocą skryptu wizualnego.

  • Aby uruchomić przepływy skryptów w odpowiedzi na zmiany zmiennych lub właściwości składników, użyj wyzwalacza skryptu On State Changed . Działa to zarówno w przypadku stanu lokalnego, jak i udostępnionego. Jest to również zalecany sposób synchronizowania animacji lokalnych.

  • Należy użyć wyzwalacza skryptu interwału zamiast wyzwalacza o wysokiej częstotliwości, takiego jak Przy aktualizacji , aby uruchomić przepływy skryptów w kontrolowalnych, regularnych odstępach czasu.

Należy pamiętać o następujących zagadnieniach:

  • Jeśli to możliwe, unikaj wyzwalania skryptów wizualnych w każdej ramce. Zamiast używać opcji Przy aktualizacji, użyj opcji On State Changed lub On Interval.

  • Jeśli musisz wyzwolić skrypt wizualizacji w każdej ramce, zrób to na jak najmniejszej liczbą obiektów.

  • Nie aktualizuj właściwości udostępnionych z wysoką częstotliwością. Zamiast tego rozważ utworzenie właściwości zaktualizowanych o wysokiej częstotliwości lokalnie przy użyciu składnika Zakres skryptu lokalnego . Pamiętaj, że zmienne skryptu wizualnego są również domyślnie udostępniane.

  • Nie używaj zmiennych obiektów, jeśli zmienne przepływu będą działać.

  • Należy unikać aktualizowania udostępnionych właściwości lub zmiennych w skryptach wizualnych, które są wyzwalane jednocześnie na wszystkich klientach.

  • Unikaj ustawiania właściwości fizyki (transformacji i prędkości) na tym samym ciele fizyki na wielu klientach w tym samym czasie. Może się to zdarzyć przypadkowo w skryptach wizualnych, które reagują na wyzwalacze zmiany sceny udostępnionej.

  • Nie należy próbować rozwiązywać problemów z wydajnością, konsolidując kilka przepływów skryptów, które działają na poszczególnych obiektach w jednym przepływie skryptu, który działa na wielu obiektach. Obciążenie związane z uruchamianiem przepływu skryptu jest niewielkie, a dodatkowa złożoność, którą należy dodać w celu skonsolidowania skryptu, może bardzo dobrze negować wszelkie niewielkie korzyści z wydajności, które można uzyskać z zmniejszenia liczby skryptów ScriptMachines.

Porady

  • Właściwości składnika i zmienne skryptu wizualnego, które mają proste typy, są automatycznie współużytkowane przez klientów w sesji. Aby zmniejszyć nakład pracy, ograniczając ilość udostępniania, dodaj składnik Zakres skryptu lokalnego do odpowiedniego obiektu GameObject, a następnie wykonaj jedną z następujących czynności:

    Aby udostępnić zmienne skryptu wizualnego, ale nie właściwości składnika lub zmienne skryptu lub właściwości składników obiektów podrzędnych:
    W składniku Zakres skryptu lokalnego wybierz pozycję Udostępnij zmienne skryptu wizualnego dla tego obiektu gry.

    Zrzut ekranu przedstawiający składnik zakresu skryptu lokalnego z wybraną właściwością o nazwie

    Aby zachować wszystkie zmienne skryptu wizualizacji i właściwości składnika dla bieżącego obiektu i jego obiektów podrzędnych lokalnie:
    Można to osiągnąć przez dodanie składnika Zakres skryptu lokalnego i pozostawienie zmiennych skryptu wizualnego udziału w tym obiekcie gry niezaznaczone.

    Zrzut ekranu przedstawiający składnik zakresu skryptu lokalnego z jego właściwością o nazwie

    W rozdziale 3 samouczka mesh 101, który koncentruje się na skryptach wizualnych, można zobaczyć kilka przykładów użycia składnika Zakres skryptów lokalnych.

  • Aby wykonać coś w regularnych odstępach czasu w synchronizacji między klientami, użyj węzła wyzwalacza Interwał .

  • Aby wykonać coś w odpowiedzi na niektóre właściwości składnika lub zmienne skryptu wizualnego zmieniające się (na przykład dlatego, że ten lub inny klient ustawiał je w skry skryptie wizualizacji), użyj wyzwalacza On State Changed

  • Istnieją dodatkowe funkcje tworzenia skryptów wizualnych udostępniane przez usługę Mesh — zobacz sekcje Microsoft>Mesh i Microsoft>Events>Mesh w narzędziu Fuzzy Finder.

Zabezpieczenia

Usługa Mesh chroni użytkowników przed scenariuszami zagrożeń, takimi jak:

  • Naruszona zawartość sceny — na przykład złośliwe próby uzyskania dostępu do poufnych danych lokalnych.
  • Naruszony klient lub kanał transportu — na przykład złośliwe próby odczytu lub zapisu niedostępnych danych zdalnych na innych klientach.

Aby to osiągnąć, usługa Mesh uruchamia skrypty wizualne w piaskownicy (na przykład JavaScript w przeglądarce internetowej).

Podczas uruchamiania sceny usługa Mesh używa wyselekcjonowanych dozwolonych list, aby zweryfikować skrypty wizualne w celu ograniczenia dostępu do niektórych typów składników aparatu Unity i bezpiecznego podzestawu ich właściwości.

W czasie wykonywania sceny usługa Mesh ogranicza dostęp do niektórych części sceny:

  • Lokalnie: uniemożliwiając dostęp do elementów wewnętrznych usługi Mesh i innych poufnych danych.
  • Zdalnie: sprawdzając, czy autor sceny zamierza zmodyfikować tę część sceny. Odbywa się to przez statyczne analizowanie skryptów wizualnych po stronie odbiorcy pod kątem potencjalnych zapisów sceny.

Przykłady:

  • Złośliwy lokalny skrypt wizualny chce dać wszystkie awatary bobble głowy. W tym celu próbuje przeskanować całą scenę dla obiektów GameObject, które reprezentują głowy awatarów. Siatka automatycznie filtruje wyniki skanowania w celu wykluczenia systemu awatarów.
  • Złośliwy klient zdalny chce usunąć scenę, przerzucając wszystkie obiekty GameObjects do góry nogami. Aby to osiągnąć, wysyła aktualizację właściwości, która ustawia skalę pionową każdego obiektu GameObject w scenie. Jednak ponieważ żaden skrypt wizualny na kliencie odbierający nie jest zaprojektowany tak, klient lokalny ignoruje zdalne dane wejściowe.

Integracja z usługą Mesh

Bieżące ograniczenie: W tej sekcji opisano wersję zapoznawcza funkcji, które nadal działają w toku.

Ogólnie rzecz biorąc, integracja z innymi składnikami jest często wykonywana przez zmianę właściwości składnika i nasłuchiwanie ich. Na przykład:

  • Interakcje: obserwuj właściwości "Is Hovered" i "Is Selected".

  • Interakcje fizyki: obserwuj ciała w objętości wyzwalacza lub w kontakcie z zderzaczem.

  • Awatary: odczyt pozycji awatara, rotacji widoku i tablicy nazw. (Jeszcze niedostępne).

  • Stan sesji: wyświetlanie listy uczestników i odczytywanie informacji o uczestniku. (Jeszcze niedostępne).

  • Skrypty w chmurze: działają razem ze skryptami w chmurze, które mogą odczytywać i zapisywać zmienne i właściwości składników. (Jeszcze niedostępne).

Niektóre składniki udostępniają akcje lokalne:

  • Menedżer audio
  • Oś czasu
  • Animatorów
  • Renderowanie: odczytywanie i zapisywanie właściwości materiału i cieniowania

Fizyka jest obsługiwana specjalnie, ponieważ symulacja dla dowolnego obiektu fizyki jest zawsze autorytatywnie wykonywana tylko przez jednego klienta: jego właściciela. Aby wykonać tę pracę, ustawienie właściwości fizyki wyzwala automatyczny transfer własności do klienta, który stosuje zmianę.

Następne kroki