Jump to content
Unity Insider Forum

Client-Objekt finden


Alexfedel

Recommended Posts

Ich erzeuge ein Objekt mit der Funktion "NetworkServer.SpawnWithClientAuthority".
Wie bekomme ich jetzt Zugriff auf dieses GameObject vom Client aus, der die Autorität besitzt? Bei meinem Client wird die Funktion "OnStartAuthority" ausgeführt, aber leider hat diese Unity Funktion keine Parameter, die das GameObject, welches gerade gespawnt wurde, enthält.
Ich möchte nicht über GameObject.Find einfach nach dem Namen suchen, weil es zum einen nicht schön ist, zum anderen kann es sein, dass der Name mehrmals vorkommt.

Weiß jemand, ob es da eine einfache Möglichkeit gibt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst im Objekt selbst in der Start Methode abfragen ob "hasAuthority" true ist. Dann fängst du auf dem Objekt selbst praktisch das Object ab. Alternative wäre, eine ClientRpc-Methode zu schreiben, die das NetworkIdentity deines auf dem Server gespawnten Objektes übergibt. Somit sendest du parallel das Objekt hinterher.

Beide Ansätze machen das gleiche, gehen nur anders an die Situation ran

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, ich habe es jetzt mit der "hasAuthority" Abfrage hinbekommen.
Ich finde es trotzdem nicht optimal von Unity, dass ein Client nicht direkt eine Liste besitzt von Objekten in der Szene, dessen Besitzer er ist.
Umgekehrt hat ein NetworkIdentity-Objekt auch keine Variable, die direkt auf das Client-Player-GameObject in der Szene verweist. NetworkIdentity.clientAuthorityOwner liefert beispielsweise kein GameObject, sondern nur eine NetworkConnection, von der aus ich nicht auf das Client-Player-GameObject schließen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das NetworkIdentity Objekt ist ja ein Component welches auf diesem Object liegt. Du kannst also von dem NetworkIdentity.GetComponent<Transform>() direkt gebrauch machen und würdest dann z.B. die Transform Komponente bekommen. (Habe es grade nicht ausprobiert ob das so direkt geht, wüsste jetzt aber nicht im Moment warum es nicht gehen sollte).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 13.11.2017 um 15:29 schrieb Alexfedel:

Danke, ich habe es jetzt mit der "hasAuthority" Abfrage hinbekommen.
Ich finde es trotzdem nicht optimal von Unity, dass ein Client nicht direkt eine Liste besitzt von Objekten in der Szene, dessen Besitzer er ist.
Umgekehrt hat ein NetworkIdentity-Objekt auch keine Variable, die direkt auf das Client-Player-GameObject in der Szene verweist. NetworkIdentity.clientAuthorityOwner liefert beispielsweise kein GameObject, sondern nur eine NetworkConnection, von der aus ich nicht auf das Client-Player-GameObject schließen kann.

t6vTu5w.png

Da es MonoBehaviour ist kannst du daher networkIdentify.gameObject oder .transform machen. Somit hast du den GameObject.
Und ein Client kennt eigentlich seine GameObjects. Du hast aber meist nur über NetworkIdentify versucht und hast bei NetworkConnection nicht weiter gemacht.  :P

NetworkConnection networkIdentify.connectionToClient - gibt den Connection zu dem Client zurück. Weiß hier aber nicht, ob der Owner irrelevant ist.

Wenn ja dann networkIdentify.clientAuthorityOwner benutzen

Nun hast du den "realen" Client man könnte es ClientNetworkConnection nennen..

networkConnection.clientOwnedObjects - gibt alle gameObjects aus (als Liste natürlich), die man "besitzt".

-------------------------

UNet + HLAPI mit (oder ohne) NetworkManager ist nicht so aufgebaut, wie man das üblich bei anderen Networking Sachen (meistens außerhalb des Gaming bereich) kennt.

UNet ist so bestimmt, dass du immer das eine GameObject bist und du bestimmst was mit den passiert, sofern du der owner bist. Daher braucht man eigentlich so gut wie nie fragen "Wer bin ich eigentlich?". Eher die Frage "Was bin ich?" ist hier wichtiger (Server / -Owner , Client / -Owner, etc )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...