Objets et composants
Un script atteint les objets de son monde par GameObject, Transform et les composants, avec les noms de Unity. Un seul objet C# représente chaque objet du monde : == compare donc les objets eux-mêmes.
using NodeWorld.Flux;
namespace MonMonde
{
public class Interrupteur : FluxScript
{
public GameObject lampe; // réglé depuis la scène
protected override void Start() => Interaction.SetInteractable(gameObject, true);
protected override void OnInteract()
{
lampe.SetActive(!lampe.activeSelf);
var abatJour = lampe.transform.Find("AbatJour");
if (abatJour != null) abatJour.localScale = lampe.activeSelf ? Vector3.one : new Vector3(1f, 0.5f, 1f);
}
}
}Trouver un objet
| Appel | Trouve |
|---|---|
un champ réglé par la scène (public GameObject porte;) | l'objet que tu as déposé sur le composant FL# Script : le plus simple et le plus rapide |
GameObject.Find("Porte") | un objet du monde par son nom |
GameObject.FindPath("Bar/Comptoir/Porte") | l'objet à ce chemin depuis une racine de la scène |
transform.Find("Gond/Porte") | un enfant à ce chemin sous un transform |
transform.GetChild(i), childCount, parent, root | la hiérarchie |
Tes scripts ne voient que les objets de ton monde : ceux de ta scène et ceux que tes scripts créent. Les avatars, les portails, les appareils photo et les voix que NodeWorld met dans ta scène ne sont pas trouvés (ce qu'un script ne peut pas bloquer).
Le GameObject
name,tag(CompareTag("Abeille")),layer(0 à 30 : la couche 31 est celle de l'interface de NodeWorld, voir les couches). Donner un tag que les Tags and Layers du projet n'ont pas est refusé :The tag 'Abeille' is not defined in this world.SetActive(bool),activeSelf,activeInHierarchy. Un script sur un objet inactif ne reçoit pas d'Update(voir les callbacks).GetComponent<T>(),GetComponents<T>(),GetComponentInChildren<T>(),GetComponentsInChildren<T>(includeInactive).
Le transform
position, rotation, localPosition, localRotation, localScale, lossyScale, eulerAngles, localEulerAngles, forward, up, right, localToWorldMatrix, worldToLocalMatrix, et les méthodes de Unity : Translate, Rotate, LookAt, SetPositionAndRotation, TransformPoint, InverseTransformPoint, TransformDirection, TransformVector et leurs inverses, SetParent, GetSiblingIndex, SetSiblingIndex, SetAsFirstSibling, SetAsLastSibling, IsChildOf.
Déplacer un objet ici le déplace pour ce joueur seulement. Pour tous les joueurs, vois objets et valeurs synchronisés.
Les composants qu'un script peut utiliser
GetComponent<T>() marche avec ces types ; un autre type lance A FL# script cannot get the component <type>.
| Composant | Page |
|---|---|
Transform, RectTransform | cette page, interfaces |
Rigidbody, Collider, BoxCollider, SphereCollider, MeshCollider | physique |
Renderer, LineRenderer, TrailRenderer, MeshFilter, Camera, Light, ParticleSystem, Animator, Volume, LODGroup, ReflectionProbe, ParentConstraint | caméras, matériaux et effets, meshes faits par les scripts |
AudioSource | son |
Canvas, CanvasGroup, Text, Image, Button, Slider, Toggle, Dropdown, InputField, ScrollRect, Scrollbar | interfaces |
Les autres composants de ta scène (une zone de réverbération, un joint, une Timeline…) marchent comme tu les as réglés dans Unity ; un script ne les change pas.
Copier et détruire
Object.Instantiate(original, parent)etObject.Instantiate(original, position, rotation, parent)copient un objet de ton monde, avec ses enfants, pour ce joueur seulement. Les scripts FL# de la copie sont créés juste après le callback en cours. Une copie que tous les joueurs voient apparaît pour la salle.Object.Destroy(obj)détruit ce que tes scripts ont créé : une copie, une caméra, une render texture, un mesh, un lecteur vidéo, un lot. Avec un composant, il détruit son objet. Les scripts d'un objet détruit reçoiventOnDestroy.
Un objet de ta scène n'est pas détruit : éteins-le avec SetActive(false). Les appels le disent dans le journal : A FL# script can destroy only the objects it created., A FL# script can copy only the objects of its world.
