Unity3D. Essayez d'envoyer la commande pour objet, sans autorité
J'ai un multijoueur au tour par tour jeu de stratégie qui a besoin d'un gestionnaire de jeu, de contrôle d'état de jeu actuel (qui est à son tour qu'il est, etc.). Ce gestionnaire doit être commune pour tous les clients, c'est l'état doivent être synchronisés sur le serveur.
Voici comment j'ai fais ceci:
Le jeu de l'objet gestionnaire est NetworkBehaviour et il a NetworkIdentity qui n'est pas acteur local de l'autorité, ni du serveur de l'autorité. J'ai fait une coutume NetworkManager et il génère le Jeu Gestionnaire de connexion de client, de vérifier également si c'est un serveur. Voici un code:
public override void OnClientConnect(NetworkConnection conn)
{
ClientScene.Ready(conn);
if (NetworkServer.active)
{
var manager = Instantiate(MultiplayerManagerPrefab, Vector3.zero, Quaternion.identity) as GameObject;
var tacticsManager = manager.GetComponent<MultiplayerManagerModel>();
NetworkServer.RegisterHandler(MsgType.AddPlayer, tacticsManager.CreatePlayerOnServer);
NetworkServer.Spawn(manager);
}
ClientScene.AddPlayer(0);
}
Lorsque je l'exécute sur un serveur, il fonctionne très bien, il crée une instance sur un client et synchronise les variables du serveur au client. Mais lorsque j'essaie d'exécuter des commandes du client, il les ignore, lancer cet avertissement:
Essayer d'envoyer une commande pour objet, sans autorité.
UnityEngine.La mise en réseau.NetworkBehaviour:SendCommandInternal(NetworkWriter,
Int32, String)
Noter que ce Jeu Manager est généré avant tout joueur est parce qu'il doit être responsable pour la ponte des joueurs. Ce que je fais mal?
OriginalL'auteur PanCotzky | 2016-03-19
Vous devez vous connecter pour publier un commentaire.
À côté de votre fragment de code, l'avertissement
Signifie que: vous envoyez commande à partir d'un objet dont autorité, votre (le joueur) n'ont pas.
Ce que l'Unité docs états:
Commandes sont envoyés à partir de player des objets sur le client pour le joueur des objets sur le serveur. Pour la sécurité, Commandes ne peuvent être envoyés qu'à partir de VOTRE objet de joueur, de sorte que vous ne pouvez pas contrôler les objets des autres joueurs.
MAIS
Quelle est donc la solution:
Avant l'envoi de la Commande (ou de l'exécution de commande fonction), Attribuer l'autorité de cet objet à votre Lecteur. Quelque chose comme ceci
"ce" seront représente votre Lecteur de l'objet. Après avoir fait Commande appel vous pouvez retirer de l'autorité à l'aide de cet extrait de code.
De nouveau, "ce" seront représente votre Lecteur de l'objet.
Remarque importante: j'ai l'habitude d'attribuer l'Autorité d'un objet (Si je veux l'utiliser) à l'aide de OnTriggerEnter et supprimer autorité sur OnTriggerExit. Il dépend de scénario que lors de quel événement que vous souhaitez acquérir ou de supprimer un objet d'autorité.
OriginalL'auteur Muhammad Faizan Khan
Vous ne pouvez pas envoyer une commande sans l'autorité locale.
Mais, quel type de données on vous envoi avec cette commande ?
En général, et comme vous l'avez dit :
"c'est l'état doivent être synchronisés sur le serveur"
Donc, à mon humble avis, vous n'avez aucune raison d'envoyer un
Command
à partir de votre lecteur.Les commandes doivent être pour le joueur d'entrée.
Ces entrées de déclencher des actions dans votre jeu.
Votre gestionnaire obtenir des informations à partir de ces actions (note de mise à jour à la fin du jeu...) et d'envoyer des données et/ou déclencher des actions sur les clients, à l'aide de
ClientRpc
C'est le serveur le modèle de l'autorité. Si vous laissez un objet local envoyer les commandes, un hacker pourrait facilement venir et dire à votre gestionnaire de
"Hey, c'est mon tour. Hey, c'est mon tour. Hey, mon score est de 9999999 et j'ai gagné le jeu en 1 seconde.".
Je pense que vous êtes un mauvais nom de la méthode, essayez OnStartLocalPlayer docs.unity3d.com/ScriptReference/...
OriginalL'auteur FLX