Jump to content
Unity Insider Forum

MaZy

Members
  • Posts

    699
  • Joined

  • Last visited

  • Days Won

    34

MaZy last won the day on September 5

MaZy had the most liked content!

About MaZy

  • Birthday 02/20/1988

Profile Information

  • Gender
    Male
  • Location
    Hannover

Recent Profile Visitors

33,457 profile views

MaZy's Achievements

Advanced Member

Advanced Member (3/3)

195

Reputation

  1. 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
  2. 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?
  3. 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.
  4. Schon etwas her mit Photon, dass ich mal benutzt habe, aber in PUN2 soweit ich weiß, gibt es keine serverseitigen Sachen, weil ja Cloudbasiert ist, allerdings gibt es ein MasterClient (der diesen Lobby/Raum erstellt hat). Kannst mich gerne besseres belehren, weil ist schon auch lange her. Wenn es nicht automatisch synchronisiert wird, bist du dafür zuständig. Man kann RPC Methoden verwenden oder die Serializationsysteme mal anschauen, ob auch andere Wege gibt. Dein Grundgedanke muss so sein, dass, wenn ein Spieler etwas SELBER tut, dass auch bei anderen, die wichtigen Sachen genauso passieren muss. Beispiel, wenn du z.B. ein Item zu einem Slot bewegst, dann könntest du sowas wie SetItemSlot(slotId, item) als RPC machen. Die Bewegung des Items ist ja egal, aber das Setzen des Slots ist ist wichtig. Ab da sollte meist für jeden Spieler gleich sein. Spieler weiß über den SlotId bescheid, weiß um welches Item es geht. Kann also bei sich im Spiel im SetSlot den Slot mit Item versehen. Und schon sollte bei jedem synchron ablaufen. Sollte es so sein, dass auch Spieler nachträglich dazu kommen, müssen nur einfach die aktuelle Liste mit den Informationen gesendet werden. Ich weiß jetzt nicht, ob bei Photon sowas automatisch gibt. Aber dies auf jeden Fall über den Masterclient tun.
  5. Also, wenn man das Bild analysiert sieht es tatsächlich so aus, als hätten sie selber den schwarzen Overlay erstellt. Das sieht man daran, dass manche Würfel unter den Overlay anfangen und manche nicht. Daher denke ich mal, für den Tutorial am Anfang haben die vllt ganz schnell simpel gehalten und selbst gemacht. Wenn man auch ne Maske benutzt denke ich mal ist es sogar nicht möglich wo anders zu drücken, aber auf die hellen Felder kann man drücken. Manchmal also einfach simpel halten und selber im Photoshop schneiden
  6. Ich bin kein fan von Tags bei solchen Dingen, deswegen hier mal Grob wie ich das machen würde. Wenn du die neue Kanone erstellst also mit newKanone, dann füge das doch in eine Liste hinzu. Beispiel List<Kanone> kanonenListe. Die Instanz kann auch eine ID beinhalten, wenn du wirklich unterscheiden musst und relevant ist. Beispiel ID 1. Jetzt kannst du Beispiel ne UI erstellen und siehst die Kanonen mit IDs und kannst sie auswählen. Oder per script auf die Liste zugreifen und durch loopen bis die ID == 1 ist. Bei sowas benutze ich gerne static Listen. Beispiel (in der Kanone Klasse): public static List<Kanone> kanonenListe = new List<Kanone>(). void Start() { this.Id = kanonenListe.Count; } void OnEnable() { kanonenListe.Add(this); } void OnDisable() { kanonenListe.Remove(this); } kanonenListe wird auch immer leer sein, wenn man eine Scene wechselt, da ja OnDisable aufgerufen wird, wenn der Component zerstört oder deaktiviert wird. Vllt dazu noch Find funktionen schreiben. public static bool TryFindById(int id, out Kanone kanone) { kanone = null; foreach(Kanone k in kanonenListe) { if(k.Id == id) { kanone = k; return true; } } return false; } jetzt kannst du einfach das machen if( Kanone.TryFindById(1, out var kanone) ) { Debug.Log("Kanone wurde gefunden: " + kanone.Id); } else { Debug.Log("Nicht gefunden"); }
  7. Also beim Addressables hast du das, aber hab noch nie verwendet. Eigentlich interessant. Ich habe tatsächlich nun die Lust bekommen, sowas zu simulieren. Man kann doch theoretisch die GameObjects nacheinander aktivieren damit es etwas "sanfter" rein lädt oder nicht? Btw reinschauen wie Addressables das macht. Wüsste nur nicht wie ich das testen könnte, ob es was bringt. Vllt 5000 cubes einbauen mit scripts oder so und gucken ob es jedes mal laggt.
  8. Benutzt du IAPListener mit dem OnPurchase Event? Ist das nicht nur wenn man etwas gekauft hat? Ansonsten laut doku sieht man das hier. /// <summary> /// Your IStoreListener implementation of OnInitialized. /// </summary> public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { extensions.GetExtension<IAppleExtensions> ().RestoreTransactions (result => { if (result) { // This does not mean anything was restored, // merely that the restoration process succeeded. } else { // Restoration failed. } }); } Bei result = true muss man wohl die Products durch loopen und schauen was man wohl besitzt. Ist leider sehr lange her, wo ich das mal gemacht habe und mittlerweile benutze ich auch aus dem AssetStore etwas, was beim HumbleBundle dazu bekommen habe.
  9. Ein Smartphone selbst kann keine Videos aufzeichnen, sondern die Apps tun das in dem sie auf das Bild und Ton zugreifen. Das heißt du musst selber schreiben, wie du ein Video aufnehmen willst. Dafür gibt es bestimmt Libraries. Z.B. AVPro Movie Capture, aber kostet 200 Euro und ist für mehr komplexere Sachen gedacht.Das einzige was Unity tatsächlich eingebaut hat sind Screenshots. Wenn du selber wagen willst kannst du Mit Texture die Pixel form screen lesen. Das tust du ganz Zeit und packst dann in eine Liste. Ab da musst du mal schauen, was so man so benutzen kann um daraus ein Video zu machen. Mir fällt da spontan nichts ein.
  10. Ich hab kein Test gemacht, aber ich weiß das MethodInfo zu Invoken ca. 100000x langsamer ist als ein Delegate. Mit System.Linq.Expressions kann man aber Delegates erstellen / "compilen", die sonst nicht möglich waren wegen den generic types. Somit werden die Serializer und Deserializer erstellt und für die RPCs die Delegates auch. Ist noch nicht perfekt und kam auch nicht mehr dazu weiter zu machen, aber hatte da noch ein paar Ideen es zu verbessern.
  11. Ist das bei dem beiden InputSystemen so? Sieht man auch im Code wenn man es decompiled? Ist mir nämlich nicht so wirklich aufgefallen. Ja verstehe. Ja versuche auch so gut wie möglich Vererbungen sein zu lassen. Mit Mirror konnte man das tatsächlich machen, aber man arbeitet dann gegen das Prinzip. Wir haben z.B. für den MMO Projekt ein Component nur für den Austausch der Daten was UI Messages angeht. Dein Proof of Concept sieht gut aus. Hast ja so ähnlich drin wie bei mir was Serialization angeht. Ich wollte bei mir aber viel mehr automatische Sachen haben. Ich benutze auch Expression in Runtime zu compilen, damit ich MethodInfo nicht Invoken muss. Leider weiß ich aber nicht, wie das bei anderen Plattformen aussieht. Allerdings ist das nur C# pure. Gar nicht mit Unity getestet, weil mir eher um das Lernen und Rumprobieren geht. Ich finde auch dein Beispiel gut. Das ist auch genau mein Geschmack. So mochte ich das auch bei der alten Unity Network mit Raknet. Dass ich den networkView nehmen konnte und damit ein Call ausführen konnte. Zugegeben ich mag etwas den Weaver, da viel Arbeit abgenommen wird. Ich hab mir jetzt Fishnet genau angeschaut. Tatsächlich finde ich da echt vieles besser gemacht. Leider ist da auch ein Object = ein Owner was ich bescheuert finde. Wieso dürfen nicht mehrere Clients Rpc senden ohne den Validation auszuschalten (authority bypass), denn am Ende muss ich meinen eigenen Validationsystem schreiben. Bei Mirror hatte ich dies modifiziert, damit das möglich ist und dann war im Core also möglich mehrere zu haben und wurde auch intern validiert, ob es möglich ist die RPCs aufzurufen.
  12. Interessant. Muss ich mir mal anschauen. Was ist denn an Weaver schlecht? Hab auch von Entwickler selbst gehört, dass sie vieles ändern wollen um dies zu reduzieren. Weil mehr Code erzeugt wird? Ich vergaß zu sagen, dass auch noch Mirage gibt. Ist mir gerade durch dich eingefallen. Ist auch ein Mirror-Fork. Allerdings war es mir zu kompliziert, da die Guides veraltet waren. Dort gibt es auch paar Optimierungen wie z.B. Rückgabewerte, wenn man Commands durchführt (gibt es bei Mirror bis jetzt nicht) und die Namensvergebung ist auch besser. Das mit Rückgabewert war eigentlich einer der Gründe wieso ich Mirage probieren wollte: https://github.com/MirageNet/Mirage Edit: Vom Kommentaren und Performance Tests sieht Fishnet tatsächlich besser aus. Muss ich mal selbst testen, ob es mir persönlich auch gefällt. Mirror wird zwar aktiv und schnell entwickelt und bin sicher, dass es besser wird, aber vieles an Mirror stören mich auch.
  13. Ja die Auswahl eines Network Solutions und Services ist schwierig. Ich habe nicht ganz verstanden, was dein Vorhaben ist. Es ist gemischt erzählt. Anscheinend geht es dir eher um ein Service und nicht um eine Netzwerklösung, um Spielerdaten zu sammeln und Accounts zu managen. Sprich gibt es ein Server und dieser Spieler geht drauf, weiß das Spieler ahh das ist dieser Spiele.. ich kenne ihn und er hat hier und da gebaut. Weil alles andere, wie Daten senden, speichern oder so ist kein Problem für viele Netzwerk Systeme (außer vllt Photon, da es Cloud basiert ist und du wenig Einfluss hast). Selbst, wenn du nur Steamdienste benutzen würdest, reicht schon eine Speicherdatei um den aktuellen Zustand deines Spiel abzuspeichern und wieder zu laden, denn die Accounts kannst du ja leicht wieder erkennen. z.B. so macht das Factorio. Die speichern einfach ne Datei ab. Aber, wenn du echt Datenbank brauchst dann PlayFab oder Gamelift macht schon sowas. Dazu gleich mehr. Alles andere ist der Frage des Netzwerklösungs. Also ich bin ein "Experte" was Mirror angeht, da ich in verschiedenen Projekten angeheuert werde und dort Mirror benutzt wird und habe sehr viele unterschiedliche Situationen gehabt und ich selbst teste Mirror bis zu geht nicht mehr aus . Da sind sogar die alten guten Programmierer dabei wie fholm der Bolt (Photon Bolt) entwickelte und an Photon Engine verkaufte. Beispiel das aktuelle Projekt woran wir arbeiten ist eine MMORPG in 2D und meine Aufgabe ist instanzierte Welten zu laden sprich.. die Spieler sind in der selben Stelle, aber sehen nicht die selben Dinge und sich nicht (je nach in welcher Instanz sie sich bewegen). Dank mehrere Scenen laden und entladen geht das durch Unity nochmal einfacher. Nun arbeite ich an Dungeon Generator. Alles mit Mirror. Noch letztens habe ich ein Video gesehen, wo erklärt wurde Mirror sei zu "kompliziert" deswegen man Photon Pun empfohlen wird - Blödsinn. Auch, dass du sagst, Photon würde fast identische Features anbieten ist schon eine Beleidigung für die Community , denn viele wechseln von Photon zu Mirror und sind glücklich über die Entscheidung, weil sie dort ganz andere Dinge erwarten als bei Photon. Die meisten sind nämlich da abgeneigt. Photon ist Cloud basiert (das ist auch deren Basiseinkommen) während Mirror eher "mach was du willst - alles kostenlos" mäßig drauf sind. Klar ein paar Dinge können gleich sein, bei Bolt ist es Entity, bei Mirror NetworkIdentity, bei Photon photonview (wenn nicht anders geworden ist). Photon wie du schon sagst, rate ich auch ab XD. Mirror ist z.B. fähig sowas wie Anno 1800 zu machen. Mir fällt da was ein Aufbau angeht nur Nimoyd ein. Ist noch in Entwicklung (die mich auch per Email sogar kontaktiert hatten. Hab das per Zufall rausgefunden, dass sie das sind, da sie auch in Mirror Discord unterwegs sind ). Leider wird über Mirror aber auch mal negativ gesprochen, weil es Nachfolger von UNet ist, aber inhaltlich hat sich das komplett geändert. Playfab hat auch für Mirror ein Tutorial: https://github.com/PlayFab/MpsSamples/tree/main/UnityMirror PlayFab PlayFab ist eher ein Dienst, dir dein Multiplayerspiel viel Arbeit abzunehmen. Sprich hast du bissel Multiplayer programmiert, geben sie dir mehr Optionen wie auf deren Server die Spiele zu hosten, Spielerdatenbank etc. Ist aber keine eigenständige Netzwerklösung (so weit ich weiß), sondern ein Dienst. Man stelle sich das wie Battle.net vor. Als würde Battle.net neues Spiel rausbringen und im Hintergrund sind die ganzen Service bereits da. Chatten, Account System, Datenbanken usw. Du kannst also Netzwerklösung plus Netzwerkdienst kombinieren. Deswegen haben die auch Tutorials wie z.B. das hier: https://docs.microsoft.com/de-de/gaming/playfab/sdks/photon/quickstart - Photon + Playfab. Gamelift ist auch ein Service wie Playfab, aber von Amazon PlayFab oder Gamelift ist echt bei riesen Spielen nice. Ein Beispiel als Vergleich: Rocket League. Andere HLAPIs ich getestet habe waren Bolt, würde auch gehen, aber ist veraltet mittlerweile und die erlauben keine direkten IP Connection außer man zahlt mehr. Den aktuellen Netcode (Unitys Netzwerk) kannst du auch anschauen. Forge Networking kenne ich auch, aber bin mir da nicht so sicher. DarkRift 2 hab ich auch probiert ist aber ziemlich low level api. Sprich du müsstest mehr coden kannst bei Mirror, Bolt usw. Dafür kannst du aber auch machen wie du willst. Das gute bei sowas ist, man kann Konsolenversionen erstellen. Mehr fallen mir nicht mehr ein. Da ich viel mit Mirror mache sehe ich auch da vieles. Weil es auch starke unterstützende Community hat, entwickelt sich Mirror sehr schnell. Alleine dieses Jahr ist die Versionsupdate von 55 auf 66 gestiegen mit Erneuerungen.
  14. "Ich bin ein Text ".Trim() sollte auch gehen.
  15. Nee keine Verwirrung. Sondern Koordinationsproblem. Woran ich was erkenne? Du meinst wahrscheinlich den Variabletypen? @chrische5hat das schon als Beispiel gezeigt. So mach ich es auch. Auch wie er schon bereits sagt, kann man für sich persönlich machen wie man will, nur war es für mich hart zu lesen. Ich erkenne etwas, weil es sehr gut übersetzt und leserlich geschrieben wurde. IsGravityOn, IsGravityActive, IsGravityEnabled (Oder GravityIsActive bzw IsOn hört sich auch mal besser an) führt alles zu true oder false. Kann man auch kürzen mit GravityActivated, GravityEnabled. PlayerCount = Anzahl der Spieler (Int) Players (oder GetPlayers()) = Ne liste mit Players (List<Int> oder []int usw) Hierbei ist mir nicht wichtig, um zu wissen was für ein Typ das ist, wenn ich es lesen will und verstehen will. Sollte ich damit anfangen zu arbeiten, muss ich so oder so nur einmal wissen, was mich da erwartet. Also je nach Editor z.B. Rider wird es gleich angezeigt, oder in Visual Studio kann man mit Maus drüber bzw. auch kann man bei der Deklaration an anschauen. Das reicht bereits um damit für die nächste Zeit zu arbeiten. Beispiel habe ich hier die Anzahl der Spieler = PlayerCount . Es würde nicht NumberPlayerCount oder IntPlayerCount stehen oder iPlayerCount. Einfach nur PlayerCount, da es üblich ist, dass da ein Int dahinter steckt bzw auch logisch ist. Es wird bestimmt nicht 1,5 Spieler existieren :D. Bei deinem Beispiel ohne int davor also global_freigabe_waffe_1 würde man das nicht so leicht erkennen, aber das liegt auch daran, das es nicht leserlich bzw, nicht herauslesbar. GlobalReleasedWeaponIndex_1 z.B: sagt durch Index. Aber das ist immer noch falsch. Bei mir wäre es, wenn es hart darauf kommt. Globals.ReleaseWeapon(int index) und ändert Werte dann von array oder so ähnlich. Das hab ich nirgends behauptet. Ich hab nur am Rande erwähnt, dass bei mir so ein Problem war und so gelöst habe und ich da in dem Moment für eine Spielefirma gearbeitet habe und sie als Lösung akzeptiert haben. Ich sagte ja nirgends, dass es besser sei oder ich besser bin. Hab halt nur noch erklärt, warum das Problem auftritt. Vorher hatte ich herum probiert. Und wenn ich danach google gibt es endliche Threads, wo viele das gleiche wie bei mir behaupten. Aber natürlich kann es bei dir in dem Fall ganz anderes Problem sein.
×
×
  • Create New...