Jump to content
Unity Insider Forum

Singular

Members
  • Posts

    201
  • Joined

  • Last visited

  • Days Won

    1

Singular last won the day on August 2 2021

Singular had the most liked content!

About Singular

  • Birthday 12/08/1987

Profile Information

  • Gender
    Male
  • Location
    Königswinter

Recent Profile Visitors

1,015 profile views

Singular's Achievements

Advanced Member

Advanced Member (3/3)

2

Reputation

  1. Hallo zusammen, Das Thema gabs schon mal im "Scriptin" Bereich Da sich dann aber viele Folgefragen um Multiplayer drehten, wechsel ich hier mal den Channel. Kurz zusammengefasst: Ich habe eine Spielwelt im Dreidimensionalen Raum aber in TopDown ansicht. Die Spieler steuern dabei Raumschiffe auf einem Planeten, der aus 4 Plates besteht. Damit die Spieler aber nun um die "Kugel" herum fliegen können, werden die Bodenplatten einfach verschoben und der Spieler fliegt weiter. Heißt, fliegt der Spieler links aus der Welt, werden die beiden Bodenplatten rechts nach links verschoben. Bzw. natürlich schon früher, damit der diese verschiebung nicht bemerkt. So gut so einfach. Nun folgendes Problem: Wenn Spieler 1 ganz oft nach Westen geflogen ist, und Spieler 2 ganz oft nach Osten, sind beide Spieler an der selben stelle auf dem Planeten, sehen sich aber nicht, weil Spieler 1 bei x = -100 und Spieler 2 bei x = 200 ist. Aus diesem Grund wird die Position nicht über den PhotonView aktualisiert, sondern das mache ich selbst über die Update Methode an ein PunRPC. Jeder Spieler übermittelt seine Position dabei relativ zum Nullpunkt. also wenn die Welt sagen wir mal 100 groß ist, wird und Spieler 1 ist gerade bei x = 100, z = 0 werden hier die 100 wieder abgezogen also übermittelt er x = 0, z = 0. Spieler 2 empfängt diesen Vector und berechnet seinen eigenen Offset mit dazu so das die Spielerposition von Spieler 1 bei x = 0, z = 300 gesetzt wird. Wie gesagt, das ist nicht das Problem. Problem ist, da ich das in der Update Methode mache, sind die Spieler stark am stocken. Wenn beide Spieler stehen bleiben ist das kein Problem. Bei langsamen Bewegungen wird es wieder problematisch, bei schnellen ist es akzeptabel... Wir kann ich das Stocken minimieren? Ist die Update Methode vielleicht nicht die beste Wahl? Achso, das Stocken tritt auch in den anderen Update Optionen auf (LateUpdate und FixedUpdate)
  2. 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. 😃
  3. Naja, kommt halt darauf an, wie der PhotonView arbeitet. Wenn der stumpf auch nur in der UpdateMethode die Position von sich selbst bei den anderen Spielern aktualisiert, dann ist es das gleiche, mit dem Unterschied, dass zu der Position einen Vector3 hinzuzählt. Ich denke diese Operation kostet nicht viel. Danke dir auf jeden Fall! 😄 Ich eröffne mal einen neuen Thread im Multiplayer Bereich.
  4. Peferkt! Das war der Denkanstoß, den ich gebraucht habe. Ich habe es (hoffe ich) so gemacht wie du gesagt hast. Zum einen wird die Position des Spielers nicht mehr über den PhotonView aktualisiert, sondern das macht der Spieler "selbst". Über die Update Methode habe ich das jetzt laufen, dass der Spieler seine Position an sein Pondon übermittelt. Dieser kennt die Verschiebung und berechnet die entsprechnede Position. Leider scheint es dadurch etwas zu stocken. wahrscheinlich nicht der sauberste weg es über die Update Methode laufen zu lassen oder? Mal schauen wie das mit anderen Objekten läuft. Die werden ja ähnlich arbeiten^^ wird wahrscheinlich etwas aufwändig. Danke dir. 😃
  5. Das macht dann keinen Sinn. zumindest, wenn die Latenz zwischen den beiden höher ist. Vor allem sieht es dann etwas seltsam aus, wie das Schiff des anderen herum springt.. Wie gehe ich am besten weiter vor. Das Problem dass ich jetzt habe ist, dass beispielsweise Spieler 1 bereits 5 mal um den Planeten nach Osten geflogen ist und auf der x Koordinate bereits bei x = 250 (Spieler 1 - x = 250, z = 0) ist. Spieler zwei hat das nicht getan sondern ist nach Süden geflogen und steht jetzt auf (Spieler 2 - x = 0, z = -50) Aber eigentlich stehen jetzt beide am startpunkt und sogar auf dem Selben feld. (Dass die beiden kollidieren sollten lassen wir mal außen vor. Ich brauche jetzt also eine möglichkeit, die die Spieler korrekt anzeigt heißt also für Spieler 1 steht Spieler 2 auf (x = 250, z = 0) usw. Ich habe ein Script geschrieben, welches die Position verschieben soll und es funktioniert genau so wie ich erwartet habe... nämlich dass der jeweils andere Spieler immer hin und her fliegt weil seine Position immer zwischen seiner echten und der neu berechneten hin und her springt. (Auch wenn ich erwarte die Antwort zu kennen) Kann ich dem Transform einen Wert geben, der kontinuierlich einfach zu seiner x bzw z position hinzuaddiert wird? Hier ist das oben genannte Script: public float offsetX; public float offsetZ; private PhotonView photonView; private void Start() { photonView = GetComponent<PhotonView>(); if (photonView.IsMine) Destroy(this); } void Update() //hier ist egal ob LateUpdate, FixedUpdate oder Update das ergebnis ist das selbe (Wie zu erwarten war) { Vector3 newPos = transform.position; newPos.x += offsetX; newPos.z += offsetZ; transform.position = newPos; } [PunRPC] public void SetOffset(float x, float z) { offsetX = x; offsetZ = z; }
  6. Ja das war auch schon mein gedanke. Wenn wir beide zusammen spielen würden und mein Raumschiff bei dir aus der Welt fliegt, kann es mir ja egal sein, weil ich das nicht sehe. So weit war ich auch schon . Deswegen wollte ich jetzt wie folgt vorgehen stoße aber schon an ein Problem von PunRPC aber der Reihe nach... Um Also die Position von Spieler 2 an Spieler 1 zu übermitteln habe ich mir gedacht, dass die Position von Spieler 2 abgefragt wird. Also das Raumschiff, das bei Spieler 1 angezeigt ist und von Spieler 2 ist, wird gefragt wo er gerade ist. Rückgabewert ist also ein Vector3. Abhängig von der Spielerposition von Spieler 1, wird dieser also wieder um x und z verschoben und dort angezeigt (Ich weiß nicht ob das verständlich ist... aber fast egal denn:) Jetzt habe ich aber das Problem, dass PunRPC kein Rückgabewert hat. Grund dafür ist, (habe ich bei denen im Forum gefunden) dass nicht klar ist ob es überhaupt ein Objekt gibt, das eine Rückgabe tätigen kann oder vielleicht sogar mehrere. Deswegen stehe ich wieder fast am Anfang. Hier der Code, mit dem ich das ungefähr vor hatte: public class MultiplayerPosition : MonoBehaviour { public float offsetX; public float offsetZ; private PhotonView photonView; private void Start() { photonView = GetComponent<PhotonView>(); } void Update() { Vector3 currentPosition = photonView.RPC("CurrentPosition", RpcTarget.All); // Hier der Fehler, da kein Rückgabewert vorhanden currentPosition.x += offsetX; currentPosition.z += offsetZ; transform.position = currentPosition; } [PunRPC] public Vector3 CurrentPosition() { Vector3 returnVector = transform.position; returnVector.x -= offsetX; returnVector.z -= offsetZ; return transform.position; } }
  7. Nein, online Multiplayer Aber ich glaube einmal drüber schlafen hat mir die Idee gebracht... ich darf nicht stumpf die Position 1 zu 1 übernehmen sondern muss diese soweit verschieben wie sich der Spieler bewegt hat. Ich fürchte allerdings, dass es dann zum stocken des chars kommt. Ich schaue mal und melde mich später nochmal falls dem so ist 🤔
  8. Nice, die Idee habe ich auch gehabt allerdings nicht mit 4 Platten sondern mit 9, also eine in der Mitte und die anderen 8 drum herum aber mit 4n ist das ein bischen überschaubarer. Habe das mal gerade realisiert. Das Funktioniert aus soweit wunderbar! Jetzt habe ich allerdings das Problem, was mache ich wenn auf dem Planeten sich mehrere Spieler tummeln sollen (bis zu vier)? Die Scene vier mal aufzubauen wäre eine Option aber die halte ich für etwas zu aufwändig und etwas überdimensioniert... Im Schlimmsten Fall fliegen 2 Spiele genau entgegen gesetzt. Einer fligt links heraus, der andere rechts... Die beiden sollen sich also begegnen.
  9. Hallo zusammen, Ich habe folgendes Problem bzw Fragestellung... ich möchte in meinem Spiel, dass der Spieler ein Raumschiff in Topdown Ansicht steuert. Da er sich auf einem Planeten befindet, kann er logischerweise um die Kugel fliegen können. Allerdings ist die Welt natürlich in alle 4 Himmelsrichtungen endlich. Deshalb soll er und alles andere natürlich auch wenn er das Ende erreicht hat auf die andere Seite gesetzt werden. Das ist noch die einfachere Übung. Allerdings möchte ich nicht, dass der Spieler etwas davon bemerkt. Heißt er erreicht das linke Ende und kann weiter links gegner und Gebäude sieht, die sich eigentlich ganz rechts am Rand befinden. Ich will das ganze nicht wirklich auf einer Kugel stattfinden lassen sondern nur flach wie ein Brett. Wie wäre hier eine gute Herangehensweise. Ich habe dazu bisher noch keinen Code den ich euch zeigen könnte ich bräuchte lediglich ein paar gedankenanstöße. Danke euch.
  10. 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");"
  11. 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.
  12. 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.
  13. Klar, dass man den alten "Quark", wie du es genannt hast, nicht einfach rauswerfen kann, das ist klar. Das das neue TextMeshPro deswegen nicht in die directive Unity.UI reingeht ist auch irgendwie klar. Aber hätte man da nicht logischere Namen nehmen können? Wobei ich froh bin, dass ich beim TextMeshPro mit .text immernoch an den Text heran komme und nicht .textInputfieldForAllTheCoolTextsYouWantToWrite schreiben muss... WIE ICH BIN NICHT ZIELGRUPPE??? 😱 Dabei habe ich nur letztens mit ein paar Studienkollegen ein neues Projekt über Plastics angefangen und darum die neueste Version runter geladen... von selbst wäre ich auch nicht drauf gekommen und würde immernoch mein UI mit Text, Button und Slidern in einer Directive nutzen dürfen... 😭
  14. Wollte mal so in die Runde Fragen. Seid meinem letzten Update von Unity kann ich nur noch TextMeshPro auswählen. Das gute alte Text gibt es schlichtweg nicht mehr. (zumindest nicht standardmäßig....) Soweit sieht das ja auch ganz net aus, und auch die Einstellungsmöglichkeiten sind wirklich klasse aber was soll denn der Unsinn jetzt dafür eine weitere using Directive einzubauen. Ich habe eine weile gebraucht bis ich dahinter gekommen bin, dass ich unsinn... ähh... using TMPro schreiben muss. Wären da jetzt alle Sachen drin zu finden, dann wäre das jetzt halt neuer Standard. Aber Buttons und Slider beispielsweise sind immernoch in UnityEngine.UI zu finden. Früher brauchte ich um ein Textfeld im Script zuzuweisen das typische "private Text meinText" jetzt muss ich "private TextMeshPro meinText". Das sind immerhin 7 Zeichen mehr. Klar werde ich mich auch daran gewöhnen und in einem halben Jahr weiß ich gar nicht mehr wie es früher war, aber ein wenig seltsam finde ich das Ganze schon. Gibt es jemanden der das so sieht wie ich oder meint ihr, dass ich übertreibe und stehe damit auf verlorenem Posten?
  15. Okay, hab den Fehler gefunden. Habe das URP Asset nicht in die "Graphics" gezogen... jetzt läufts... Zumindest auf den ersten Blick. Mein Shader ist im Editor sichtbar aber nicht im GameView: Game View: Editor:
×
×
  • Create New...