Jump to content
Unity Insider Forum
Sign in to follow this  
CreatixGameZ

UNET [Command] Befehle (Trying to send command for object without authority)

Recommended Posts

Hallo liebe Unity Gemeinde,

Ich hab schon in vielen Foren nach dem Problem gesucht, finde aber keine Lösung zu dem Problem. Bin noch in den Anfangsschuhen, gerade was Networking in Unity anbelangt und habe es schon geschafft, dass eine Variable im Netzwerk Synchronisiert wird, wenn der Host eine Funktion aufruft. Nun aber das Problem, es funktioniert nur beim Host, wenn der Client eine Funktion aufruft und versucht eine [SyncVar] Variable zu verändern, dann kommt folgende Fehlermeldung bei mir: Trying to send command for object without authority.

Ich hab erstmal ganz leicht angefangen zum Testen. Ich habe in einer Szene ein leeres Objekt mit den Namen NetworkManager erstellt, und denselbigen im Inspektor eingefügt, zusätlich einen Cube erstellt, welches das Player Prefab sein soll und beim Network Manager unter "Spawn Info" das Player Prefab reingezogen. Das Player Prefab besitzt einen Network Identity, bei dem Local Player Authority Aktiviert ist. Gestartet werden Server e.t.c mit der NetworkManagerHUD. Der OxyRefiller Skript ist auch auf den PlayerPrefab drauf, welcher auch beim Player(Clone) drinnen ist, der von Unity erstellt wird.

Anbei mal mein Versuchscode:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class OxyRefiller : NetworkBehaviour {

	public int OxygenPly  = 50;

	[SyncVar]
	public int OxygenTank = 10000;


	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKey (KeyCode.A)) 
		{
			CmdsnkOxyTnk ();
			LocalOxygenPly ();
		}
	}

	void LocalOxygenPly()
	{
		OxygenPly++;
	}

	[Command]
	void CmdsnkOxyTnk()
	{
		RpcsnkOxyTnk (1);
	}

	[ClientRpc]
	void RpcsnkOxyTnk(int Oxygen)
	{
		OxygenTank = OxygenTank - Oxygen;
	}


	void OnGUI()
	{
		if (isLocalPlayer) 
		{
			GUI.Label (new Rect (50, 400, 150, 25), "Oxygen in Tank : " + OxygenTank);
			GUI.Label (new Rect (50, 430, 150, 25), "Oxygen Player has : " + OxygenPly);
		}
	}
}


Ganz Schlicht gehalten nur um überhaupt zu begreifen, wie das Networking funktioniert. Folgendes soll passieren : Jeder Spieler besitzt Lokal Sauerstoff, Serverübergreifend gibt es einen Sauerstofftank, der sich bei allen Spielern leert, wenn ein Spieler Sauerstoff tankt! 

Wenn der Host "A" drückt, passiert was ich möchte, Bei Host und Client geht Sauerstofftank runter (wird also Synchronisiert) und nur beim Host geht Sauerstoff rauf, wenn der Client "A" drückt, dann kommt wieder Fehlermeldung, er hätte nicht die Autorität.

Wie gebe ich dem Spieler nun die Autorität? Oder ist es so garnicht vorgesehen, dass ein Client eine SyncVar Servervariable verändern darf und ich denke völlig in die falsche Richtung und muss ganz anders denken? Vielleicht kennt ja jemand eine "Anfängerfreundliche" Antwort auf mein Problem, mit dem ich schon seit mehreren Tagen feststecke ^^

Grüße

Share this post


Link to post
Share on other sites

Hi,

 

Grundsätzlich ist es schon möglich, dem Client die Synchronisation zu erlauben. Du solltest dir aber immer überlegen, ob das der richtige Weg. Im Normalfall lasse ich den Client "schreiben", was er tun möchte, aber der Server verarbeitet diesen Input und führt es dann aus. Es bietet einfach deutlich mehr Sicherheit (bzgl. Hackern, Cheatern, aber auch Integrität).

Ich mache das Mal an einem anderen Beispiel fest, Spieler A schießt auf Spieler B. Auf dem Client des Spieler A wird die Nachricht generiert und an den Server gesendet, dass er Schießt. Der Server "erschafft" dann die Kugel und Synchronisiert sie auf beiden Clients. Spieler A hat also keinen Einfluss darauf, wie die Kugel sich bewegt, sondern nur wann diese abgefeuert werden soll.

Für dich bedeutet das: drückt Spieler A den Button, sendet er eine Nachricht an den Server, dass er Sauerstoff "entnehmen möchte", statt die Variable selbst zu ändern. 

Such mal die Tutorials die sich mit NetworkClient auseinander setzen. Ich sitze gerade am Handy, da fallen mir Beispielcodes etwas schwer 😂

 

Share this post


Link to post
Share on other sites

Wie Crashdash schon meinte, sollte eher der Server die Kontrolle drüber haben. Sprich, OxygenPly sollte durch den Server manipuliert werden. Da du ein SyncVar nutzt, müsste das dann eh wieder mit dem Client synchronisieren, wenn ich das gerade richtig im Kopf habe.

Aber ein kleines Heads Up.. wenn du mal etwas komplizierteres machen willst, wirst du wohl irgendwann von SyncVars, Commands & RPC Calls wegegehn und dich mit dem manuellen schicken von NetworkMessages beschäftigen. Damit hat man dann mehr Kontrolle.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×