Jump to content
Unity Insider Forum

Player Kick Message (PUN2)


Singular

Recommended Posts

Hallo zusammen,

ich arbeite mich gerade in das Thema Multyplayer ein und arbeite mit Photon (PUN2).

Thema ist gerade, dass ich zwei Spieler auf einem Server habe von denen einer der Host ist und der andere Soll gekicked werden können vom Host. Das Funktioniert auch so weit. Allerding möchte ich, dass der gekickte Spieler eine Info bekommt, dass er gegicked wurde. Ich habe da eine [PunRPC] Methode gedacht, die der Host bei dem Spieler auslöst, damit bei ihm der Text angezeigt wird.

Jetzt weiß ich allerdings nicht wie ich genau an diese Methode heran komme. PunRPC ist mir noch zu neu. Oder gibt es vielleicht einen Callback der aufgerufen wird, wenn der Spieler gekicked wurd. "OnPlayerKicked" oder so?

Danke im Voraus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soweit ich weiß gibt es dafür kein Event mit Messages. Vielleicht gibt es ein Event, dass er aber keine Verbindung mehr hat oder aus dem Raum raus ist. Was du dann machen kannst ist, dass du bevor ein Spieler kickst bei ihm eine Nachricht zuweist. Das würde mit PunRPC gehen. 

Simple würde ich einfach eine Klasse mit static Variablen nehmen und dann diese Variable nachdem kick anzeigen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

okay dann mache ich das über PunRPC. Danke dir.

Wie komme ich denn an ein Object von dem Spieler heran? Das Objekt in dem die Nachricht angezeigt wird ist meine class Infobox. Die habe ich selber geschrieben. Der habe ich jetzt ein [PunRPC] verpasst. Heißt ich müsste jetzt von dem Spieler der gekickt werden soll an seine Infobox herankommen... aber wie am besten? Player.Infobox oder Player.GetComponent<Infobox>() geht leider nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du mit Player Object den von Photon meinst geht das nicht so oder ist die Player Klasse von dir selber geschrieben und ist ein Component? Wenn je dann einfach ein Verweis bzw Variable erstellen

Z.B.

public class Player
{
	public InfoBox infoBox;
}

Aber das sind doch basics von C# oder meinst du was anderes?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Player Klasse habe ich nicht selber geschrieben, die ist von Photon.

Das was du geschriben hast sind Basics ja, aber ich möchte das Spieler 1 (Host), Spieler 2 (Client) kicken kann. Dazu bekommt  Spieler 1 einen Button angezeigt, worüber er Spieler 2 Kicken kann. Funktioniert auch alles wunderbar. Spieler 2 Landet dann wieder im Hauptmenü. Wenn das allerdings so passiert, würde man denken können, dass es da einen Programmfehler war. Heißt Spieler 2 soll angezeigt bekommen, dass er vom Host gekicked wurde. Das soll über die InfoBox passieren (die Klasse habe ich geschrieben)

Wie kann jetzt also Spieler 1 beim Kick eine Mitteilung an die Infobox von Spieler 2 senden? Der Host hat ja nicht die Infobox vom Client sondern nur seine eigene. Theoretisch brauche ich also eine art "kickedPlayer.GetComponent<InfoBox>().SendMessage("You have been kicked");"

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also wenn du z.B. sowas ähnliches hast so könntest du machen:

// Das beim Spieler script ausführen
void KickPlayer(PhotonView playerView)
{
	// Überprüfen ob es der MasterClient ist (also den Room erstellt hat - auch "host" oft genannt (was aber falsch ist) ).
	// Wenn nicht, dann abbrechen

	if(!PhotonNetwork.IsMasterClient)
		return;

	// Setze die Nachricht
	InfoBox infoBox = playerView.GetComponent<InfoBox>();
	infoBox.SetMessage("You have been kicked out from the room/server");
  
  	// ODER
  	InfoBox.SetMessage("You have been kicked out from the room/server");

    // Das kann nur der Masterclient.. braucht man nicht überprüfen.
	PhotonNetwork.CloseConnection(playerView.Owner)
}

Dein InfoBox müsste dann natürlich die Funktion SetMessage haben. 

player.GetComponent<InfoBox>() das hier kann eigentlich nicht funktioniert, weil wenn man aus dem rausgeschmissen wird, dann werden auch Spieler objekte gelöscht und somit kannst du nicht es nicht anzeigen. Daran hab ich erst nicht gedacht. Deswegen würde ich InfoBox als static Klasse machen und einfach direkt den Text setzen und im Hauptmenü dann diesen Text anzeigen. 

Gibt aber noch komplizierteren Weg und den finde ich auch richtiger. Müsstest dafür PhotonNetwork.RaiseEvent und in irgendein Script OnEvent verwenden. Dazu unbedingt das hier lesen: https://doc.photonengine.com/en-us/pun/current/gameplay/rpcsandraiseevent#raiseevent. Da wird mit einem Beispiel gezeigt. 

Mich hat das selber interessiert und hab mal den Code analysiert und nachgelesen und es gibt keine KICK Funktion allgemein in Photon. Was im Hintergrund passiert ist eigentlich du sendest ein Spieler sowas wie "Kannst du aus dem Raum gehen" also Forderung natürlich und der Client sagt dann "ok" und führt PhotonNetwork.LeaveRoom(false). Also theoretisch verlässt man selbst den Raum.

Deswegen mit Event kann man also seine eigene Kickevent schreiben und auch die Nachricht anzeigen. Gibt halt verschiedene Möglichkeiten. Das oben das Beispiel mit InforBox und statische Funktion usw ist glaub am leichtesten

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, okay. Das muss ich mir mal anschauen. Ich habe jetzt einen recht unschönen Weg gewählt, dass Spieler, die den Raum betreten ihre Infobox an den Master weiter geben. Und wenn der ihn kickt, kann er darauf zugreifen.

Das läuft aber auf dem selben Weg, dass der Spieler "freiwillig" den Raum verlässt. 😃

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...