NodeWorld

Objets apparus pour la salle

Depuis SDK 0.2.1

Networking.Instantiate(modèle, position, rotation) fait une copie d'un objet pour toute la salle : chaque joueur la voit, ceux qui arrivent plus tard aussi, et ses scripts vivent comme ceux d'un objet de la scène (Awake, Start, état synchronisé, événements réseau, propriétaire). Networking.Destroy(copie) la retire pour tout le monde. Le nombre de copies n'a pas de limite : seuls les 120 messages par seconde que chaque joueur peut envoyer au réseau des scripts freinent une rafale.

Object.Instantiate fait une copie pour le joueur local seul, sans synchronisation (objets et composants).

Marquer le modèle

  1. Fais l'objet à copier dans la scène, avec ses enfants, ses composants et ses composants FL# Script. Laisse-le inactif s'il ne doit pas vivre tout seul : les copies sont toujours actives.
  2. Ajoute-lui le composant Network Template (Add Component, NodeWorld, Network Template). L'éditeur lui donne un identifiant, le même pour chaque joueur et pour le serveur.
  3. Donne le modèle à ton script dans un champ GameObject.

Faire apparaître et retirer

csharp
using NodeWorld.Flux;

public class Launcher : FluxScript
{
    public GameObject ball;     // le modèle (composant Network Template)

    protected override void OnInteract()
    {
        var copy = Networking.Instantiate(ball, transform.position + transform.forward, transform.rotation);
        copy.GetComponent<Rigidbody>().velocity = transform.forward * 6f;
    }
}

public class Ball : FluxScript
{
    protected override void Start() => Networking.SyncTransform(gameObject, 20f);

    protected override void OnCollisionEnter(Collision collision)
    {
        if (Networking.IsOwner(gameObject) && collision.collider.gameObject.name == "Goal")
            Networking.Destroy(gameObject);
    }
}
  • La copie existe tout de suite chez le joueur qui la fait apparaître. Le serveur lui donne un identifiant réseau à elle dans la salle (~1, ~2… ; les objets en dessous reçoivent ~1/0, ~1/0/1… selon leur ordre) et la signale à chaque joueur. Tant que l'identifiant n'est pas revenu, l'état synchronisé et les événements réseau envoyés par ses scripts attendent, puis partent.
  • Son propriétaire est le joueur qui l'a fait apparaître. Une copie apparue par un script du serveur appartient au maître de la salle.
  • Networking.Destroy est pour le propriétaire de la copie, le maître ou un script du serveur. Les scripts de la copie reçoivent OnDestroy partout.
  • Networking.IsSpawned(gameObject) dit si un objet est une copie apparue.

Quand un joueur part

Les copies d'un joueur qui part restent dans la salle et passent au maître : leurs scripts reçoivent OnOwnershipChanged avec l'identifiant du maître, comme pour tout objet d'un joueur qui part (objets et valeurs synchronisés).

Les joueurs qui arrivent plus tard

Un joueur qui arrive reçoit les copies vivantes de la salle, là où leur propriétaire les a envoyées en dernier, avec leur propriétaire et le dernier état synchronisé de leurs scripts, avant leur premier Update.

Sur le serveur

Les scripts du monde sur le serveur font tourner aussi les scripts des copies (ceux qui ne sont pas [ClientOnly]), et peuvent eux-mêmes faire apparaître des copies avec Networking.Instantiate. Les références entre les objets du modèle (un champ de script qui pointe vers un enfant du modèle) pointent, dans chaque copie, vers les objets de la copie.