Événements réseau
Un événement réseau lance OnNetworkEvent du même script, sur le même objet, dans d'autres jeux : « la cloche a sonné », « ce joueur a marqué ». C'est un instant, pas un état : un joueur qui arrive plus tard ne reçoit pas les événements envoyés avant. Ce qui doit durer (un score, une porte restée ouverte) va dans l'état synchronisé.
using NodeWorld.Flux;
namespace MonMonde
{
public class Cloche : FluxScript
{
public AudioSource son;
protected override void Start() => Interaction.SetInteractable(gameObject, true);
protected override void OnInteract()
{
var arguments = new NetWriter();
arguments.Write(Player.name);
SendNetworkEvent(NetworkEventTarget.All, "Sonner", arguments);
}
protected override void OnNetworkEvent(string name, NetReader arguments, int senderId)
{
if (name != "Sonner") return;
Debug.Log(arguments.ReadString() + " a sonné la cloche");
son.Play();
}
}
}Qui le lance
SendNetworkEvent(target, …) | Tourne chez |
|---|---|
NetworkEventTarget.All | chaque joueur de la salle : l'envoyeur tout de suite, les autres quand il arrive |
NetworkEventTarget.Others | chaque joueur sauf l'envoyeur |
NetworkEventTarget.Owner | le propriétaire de l'objet (tout de suite si c'est l'envoyeur) |
NetworkEventTarget.Master | le maître de la salle (tout de suite si c'est l'envoyeur) |
NetworkEventTarget.Server | le même script sur le serveur seulement (plus bas) |
SendNetworkEventToPlayer(playerId, name, arguments) le lance chez un seul joueur (tout de suite si c'est le joueur local).
OnNetworkEvent(name, arguments, senderId) reçoit le nom, les arguments à lire, et l'ID du joueur qui l'a envoyé.
Les arguments
Écris-les avec un NetWriter et relis-les dans le NetReader dans le même ordre (les types sont ceux de l'état synchronisé). Sans arguments, le lecteur est vide.
Les règles
- L'objet a besoin d'un Network Id sur son composant FL# Script. Sans lui, l'événement reste dans le jeu de ce joueur et le journal le dit une fois :
'Cloche' (MonMonde.Cloche) sends network events but has no network id: they stay on this client. - Un nom a de 1 à 128 caractères ; les arguments, 16 Ko au plus.
- Chaque joueur envoie au plus 120 messages par seconde au réseau des scripts (états synchronisés, événements et objets apparus ensemble) ; le serveur jette le reste.
Demander au serveur
NetworkEventTarget.Server lance OnNetworkEvent du même script sur le même objet sur le serveur, avec l'ID du joueur qui l'a envoyé. Le script doit tourner là-bas (pas [ClientOnly]). C'est ainsi que le script d'un joueur demande ce que seuls les scripts du serveur font, comme ouvrir un portail.
// Dans le jeu du joueur :
protected override void OnInteract() => SendNetworkEvent(NetworkEventTarget.Server, "Ouvrir");
// Sur le serveur :
protected override void OnNetworkEvent(string name, NetReader arguments, int senderId)
{
if (!World.isServer || name != "Ouvrir") return;
Debug.Log("Le joueur " + senderId + " a demandé l'ouverture");
}Les scripts du serveur n'envoient pas d'événement aux joueurs : un événement qu'ils envoient à NetworkEventTarget.Server reste sur le serveur.
