Ce qu’un monde peut contenir
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é
| Famille | Composants |
|---|---|
| Rendu | Transform, 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 |
| Physique | rigidbodies, tous les colliders, joints, forces constantes, tissu (cloth), articulation bodies, et leurs versions 2D |
| Audio | Audio Source, zones de réverbération, filtres audio (passe-bas, passe-haut, écho, distorsion, chorus, réverbération) |
| Animation | Animator, Animation, Playable Director (Timeline et ses pistes), contraintes (parent, position, rotation, échelle, visée, regard) |
| Interface | Canvas, Canvas Group, tout uGUI (Event Trigger et les raycasters physiques compris), TextMeshPro |
| Vidéo | Video Player qui lit un clip vidéo inclus dans le monde |
| XR Interaction Toolkit | objets 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 NodeWorld | FL# Script, NW World, son NW World Config, Platform Switch, Network Template, Play Mode Bootstrap |
| Caméra | gardée pour ses réglages : le jeu donne son fond à la caméra du joueur, puis l’éteint |
Shaders : tous acceptés.
Retiré
| Quoi | Pourquoi |
|---|---|
| Audio Listener | les 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 Origin | le jeu a les siens |
| Video Player qui lit une URL | le 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 rendu | ce sont ceux du jeu |
| tout autre script : les tiens, ceux du jeu, ceux d’un paquet | le code d’un monde, c’est FL# |
un composant qui porte une valeur [SerializeReference] d’un type hors de la liste | Unity 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,urletsourced’un Video Player,interactionManageretsnapColliderde 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 joueursLe 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.
