NodeWorld

Ce qu’un monde peut contenir

Depuis SDK 0.2.1

Un monde n’a pas de code à lui : ses scripts sont des scripts FL#. Sa scène peut quand même poser des composants sur des objets, avec les valeurs que tu leur as données, et Unity les démarre dès que la scène se charge. Avant de charger un monde, le jeu de chaque joueur le compare donc à la liste ci-dessous et le charge sans ce qui n’est pas autorisé ; le reste du monde se charge comme d’habitude. Le World Publisher fait le même contrôle quand tu construis : tu le sais avant eux.

Autorisé

FamilleComposants
RenduTransform, mesh filters et renderers, skinned meshes, LOD groups, lumières, light probes, reflection probes, volumes URP et leurs effets, decals, lens flares, particules (Particle System, VFX Graph), traînées, lignes, sprites et tilemaps, terrains et leurs arbres, skybox, wind zones, zones et portails d’occlusion, texte 3D
Physiquerigidbodies, tous les colliders, joints, forces constantes, tissu (cloth), articulation bodies, et leurs versions 2D
AudioAudio Source, zones de réverbération, filtres audio (passe-bas, passe-haut, écho, distorsion, chorus, réverbération)
AnimationAnimator, Animation, Playable Director (Timeline et ses pistes), contraintes (parent, position, rotation, échelle, visée, regard)
InterfaceCanvas, Canvas Group, tout uGUI (Event Trigger et les raycasters physiques compris), TextMeshPro
VidéoVideo Player qui lit un clip vidéo inclus dans le monde
XR Interaction Toolkitobjets saisissables et simples (grab, simple interactables), snap volumes, socket interactors, grab transformers, filtres d’interaction, zones et ancres de téléportation, prises d’escalade, Tracked Device Graphic Raycaster et Physics Raycaster, Lazy Follow, récepteurs et thèmes d’affordance
SDK NodeWorldFL# Script, NW World, son NW World Config, Platform Switch, Network Template, Play Mode Bootstrap
Caméragardée pour ses réglages : le jeu donne son fond à la caméra du joueur, puis l’éteint

Shaders : tous acceptés.

Retiré

QuoiPourquoi
Audio Listenerles oreilles du joueur sont celles du jeu
Event System et les modules d’entrée (Standalone, Touch, Input System UI, XR UI)les commandes du joueur sont celles du jeu
XR Interaction Manager, et le rig du joueur : interacteurs autres que les sockets, locomotion, lecteurs d’entrées, XR Originle jeu a les siens
Video Player qui lit une URLle Video Player d’un monde lit un clip inclus dans le monde ; les vidéos d’Internet passent par FL#
assets et réglages du pipeline de renduce sont ceux du jeu
tout autre script : les tiens, ceux du jeu, ceux d’un paquetle code d’un monde, c’est FL#
un composant qui porte une valeur [SerializeReference] d’un type hors de la listeUnity crée cette valeur au chargement de la scène

Un composant retiré laisse son objet en place, avec tout le reste de ce qu’il porte.

Appels d’événements

Un UnityEvent d’un composant autorisé (le On Click () d’un bouton, le On Value Changed d’un slider…) garde ses appels aux méthodes des composants autorisés et du GameObject (GameObject.SetActive, AudioSource.Play, Animator.SetTrigger…). Un appel est retiré quand :

  • sa cible est un composant retiré, une Camera ou un objet hors du monde ;
  • il nomme un type qui n’est pas dans la liste (sans cible, Unity appellerait une méthode statique de ce type) ;
  • sa méthode est l’une de celles-ci : SendMessage, SendMessageUpwards, BroadcastMessage, StartCoroutine, Invoke, InvokeRepeating, Destroy, DestroyImmediate, DontDestroyOnLoad, hideFlags, url et source d’un Video Player, interactionManager et snapCollider de l’XR Interaction Toolkit. Elles appellent des méthodes par leur nom, atteignent ce qui est hors du monde, gardent un objet après le départ du joueur, ou touchent aux fichiers ou au réseau.

Toutes les autres méthodes des composants autorisés ont été vérifiées une fois : aucune ne touche au réseau ni aux fichiers. Ce que ces appels ne peuvent pas faire, tes scripts FL# le font.

Un événement d’animation est gardé quand sa fonction est une méthode qu’un événement peut appeler sur un script autorisé (le Select d’un bouton, par exemple) ; sinon il est retiré.

Quand tu publies

Après la construction de chaque plateforme, le World Publisher contrôle son bundle. Chaque chose non autorisée s’affiche sous Contrôle du contenu dans l’onglet Build et dans la Console, par exemple :

Le composant AudioListener sur l'objet Bar/Camera n'est pas autorisé : il sera retiré chez les joueurs

Le monde est construit quand même. Corrige la scène et reconstruis, ou laisse : les joueurs le chargent sans ces éléments. Les messages sont en anglais si ton ordinateur n’est pas en français (Content check).

Dans le jeu des joueurs

Le jeu contrôle chaque version d’un monde une seule fois, puis garde le monde contrôlé pour le charger plus vite la fois suivante. Une nouvelle version de la liste le contrôle à nouveau. Le journal du jeu dit ce qu’il a retiré et de quel objet (lignes qui commencent par [ContentCheck]).

Ce qu’aucun contrôle ne couvre : un monde fabriqué pour exploiter un bug du lecteur de bundles de Unity lui-même, et les shaders, qui tournent sur la carte graphique.