Jump to content
Unity Insider Forum

Netzwerk Problem


Phash

Recommended Posts

Servus

 

ich versuch gerade, mein Game Netzwerkfähig zu machen.

Ich komme aber gerade ein wenig durcheinander, und hab einen Knoten im Hirn...

 

Also:

ich habe ein Auto und eine Strecke. Ich möchte, dass mehrere Spieler auf der Strecke fahren können.

 

Netzwerkverbindung klappt. Aber: ich krieg das mit der Kamera gerade nicht hin.

 

Ich habe in meiner Hierarchie:

Das Auto, mit Script zur Steuerung und NetworkView (Observed diese Objekt)

Das Netzwerkobjekt (für Serverstart / Join)

Eine Kamera

die Strecke

 

 

die Kamera observed in ihrem Script das Vehicle

Netzwerkobjekt hat als PlayerPrefab das Vehicle

Vehicle Network View auf das Vehicle

 

In dieser Konstellation wird zwar ein neues Fahrzeug gespawned, wenn ein Spieler auf den Server connected (ich sehe einen Clone im Unity)

aber es wird nur das Fahrzeug des Hosts gesteuert und mit der Kamera verfolgt.

 

 

Wenn ich auf die prefabs zeige, dann bleibt die Kamera stehen. Zeige ich auf das konkrete Objekt, folgt alles nur dem Chef...

 

Steuern geht korrekt...

ich kann das Auto des gejoineten Spielers mit dessen Steuerung aus dessen Spielinstanz heraus lenken.

Ich seh es dann an meinem Host vorbeifahren...

aber die Kamera bleibt wo sie ist :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, hört sich schon so an als ob sich irgendwas nicht bewusst wäre, dass es nicht der aktive Spieler ist.

Der Codeblock den du gepostet hast liegt auf dem Auto? Dann wird er zweimal ausgeführt. Einmal auf dem Host und enabled das cameraPrefab und einmal auf dem "Client" der das cameraPrefab wieder disabled. Das kann so also nicht funktionieren.

Einfacher wäre, wenn du auf das Auto ein Empty setzt wo die Kamera sein soll. Dann setzt du vom AutoScript aus:

 

if (networkView.isMine)
{
  Camera.main.transform = AutoCameraPositionEmpty.transform;
}

 

oder ähnlich ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hoffe ich verstehe dich richtig.

 

Ich hab es immer so gemacht, dass der neue Spieler, der sich selbst Instanziert, sein eigenes Objekt umbenennt in "localPlayer". Und die einzige Kamera in der Szene, verfolgt einfach den "localPlayer". So hat jeder seine eigene Kamera.

 

GameObject go = Network.Instatiate(bla bla);
go.transform.name = "localPlayer";

 

Die Kamera ist also kein Chlid vom Player der erstellt wird, sie ist ein eigenständiges GameObject und ist bereits von Anfang an in der Szene und verfolgt (sobald verfügbar) den "localPlayer".

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm und wie verfolgt die cam "localPlayer"? ist das mit "findChild("localPlayer")" zu machen?

 

Mir ist gerade nicht klar, wann es hier ein Prefab sein muss, und wann ein konkretes Objekt in der Szene.

 

Gehen die Scripts auf die PreFabs oder auf die Objekte?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Prefab benutzt du, um ein Objekt in der Szene zu Instanzieren. Also, um eine Kopie zu erstellen.

In dem Fall musst du auf das Objekt in der Szene zugreifen. Eher mit GameObject.Find("localPlayer"); FindChild würde nur Kinder von der Kamera finden, was das Auto ja nicht ist, oder?!

Da GameObject.Find aber recht gut Performance frisst musst du darauf achten, dass nicht mehr aufgerufen wird sobald es einmal das richtige Auto gefunden hat.

Oder du benutzt SendMessage um das Auto bei der Camera "anzumelden", was imho eleganter wäre.

 

Es könnte also so aussehen:

 

if (LocalPlayer == null)
{
LocalPlayer = GameObject.Find("localPlayer");
}
else
{
//Code um dem LocalPlayer GameObject zu folgen
}

 

Wenn du das in der Update von der Kamera machst, sucht sie solang nach dem GameObject "localPlayer" in der Szene bis sie es findet. Dieses musst du eben, wie von Vampir beschrieben Instanziieren und wenn es networkView.isMine ist in localPlayer umbenennen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dieses musst du eben, wie von Vampir beschrieben Instanziieren und wenn es networkView.isMine ist in localPlayer umbenennen.

 

Du kannst es direkt nach Network.Instantiate umbenennen (wie ich oben im codeschnipsel gepostet habe), weil es ist ja bereits "dein" Objekt, weil du es ja gerade Instanziert hast. Kannst dir also den Umweh über networkView.isMine sparen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...