Jump to content
Unity Insider Forum

Sascha

Administrators
  • Posts

    13,357
  • Joined

  • Last visited

  • Days Won

    751

Sascha last won the day on September 23

Sascha had the most liked content!

About Sascha

  • Birthday 08/13/1990

Contact Methods

  • Website URL
    http://13pixels.de

Profile Information

  • Gender
    Male
  • Location
    Hamburg
  • Interests
    Programmierung

Recent Profile Visitors

93,476 profile views

Sascha's Achievements

Advanced Member

Advanced Member (3/3)

2.7k

Reputation

  1. Das ist schon zu 100% ne Networking-spezifische Frage, und da kann ich leider kaum helfen ­čśů Aber bei einer Handvoll Objekten sollte das eigentlich nicht schon stocken. Vor allem sendest du ja jetzt nicht mehr Daten als vorher, oder?
  2. Das ist genau das Problem. Auch der Server sollte keine ewig wachsenden Positionswerte nutzen. Und der Server hat auch keinen Grund, irgendetwas herum zu schieben, weil Dinge auf dem Server aussehen k├Ânnen wie sie wollen. Sagen wir also einfach mal, die Welt sieht auf dem Server so aus: Wenn einer oben aus A rausfliegt, kommt er unten bei C wieder heraus. Ohne Wenn und Aber. Auf dem Server ist die Position eines Spielers damit immer zwischen (0, 0) und (2, 2). Nat├╝rlich wird deine Platte nicht 1x1 gro├č sein, sondern irgendwie gr├Â├čer, aber du verstehst schon. Wenn dein Client und dein Server miteinander kommunizieren, dann solltest du daf├╝r ein Protokoll haben. Klingt krasser als es ist - du definierst nur halt, auf welche Art kommuniziert wird. In diesem Fall hei├čt das, dass du einmal festlegst, in welchem Format die Positionen ├╝bertragen werden. Ich w├╝rde dazu tendieren, nur die Serverposition zu nutzen. Ein Client rechnet also aus, wo auf diesem Grid sein Raumschiff ist, und sendet es dem Server. Der Server sendet ebenfalls nur die Position auf diesem Grid an die Clients, und die rechnen dann aus, wo auf dem Fake-Boden das Raumschiff jetzt genau hingeh├Ârt. Wenn ein Raumschiff jetzt auf (0.1, 1.9) ist, also ganz weit oben links, dann w├╝rde der Client ja Feld A nach unten rechts packen wollen: Du w├╝rdest also in Wirklichkeit das Schiff auf (1.1, 0.9) platzieren. Die "reale" Position ist aber weiterhin (0.1, 1.9). Von einem zum anderen und wieder zur├╝ck rechnen kann sehr anstrengend sein. Ich w├╝rde daher immer nur in eine Richtung rechnen. Du nimmst also einfach ein "reale" Position in einem Vektor: private Vector2 realPlanetaryPosition; Daraus kannst du dann sowohl die Anordnung der Felder als auch die Position des GameObjects ziehen. Wenn dein Spieler in irgendeine Richtung fliegt, wendest du die Geschwindigkeit auf diesen Vektor an und rechnest dann diese beiden Sachen (Anordnung und Transform.position) neu aus. Anschlie├čend sendest du direkt diesen Wert an den Server. Oder auch nicht. Je nach dem, wie autorit├Ąr dein Server ist. Wenn dann der Server eine Position eines Raumschiffs an den Client schickt, muss dieser diese wieder verarbeiten. Wenn es sich nicht um den Spieler handelt, hat die Position des Raumschiffs ja keinen Einfluss auf die Anordnung der Felder. Aber die "reale" Position muss dann in Abh├Ąngigkeit der Feld-Anordnung in eine Transform.position umgerechnet werden. Ich hoffe, das hilft ein bisschen.
  3. Ist am Ende nat├╝rlich deine Entscheidung, aber ich empfehle, da nochmal die Z├Ąhne zusammenzubei├čen und das zum Laufen zu kriegen. Woran es gerade zu h├Ąngen scheint, sind Konzepte, die du sehr oft und ├╝berall brauchst. Wenn du etwas brauchst, sag Bescheid. Aber wie gesagt, deine Entscheidung
  4. Freut mich sehr Ich muss das Lob aber auch zur├╝ck geben. Deine Fragestellungen sind sehr gut und ausf├╝hrlich, und haben immer alle wichtigen Infos mit drin. Da muss man nicht raten, und das macht es sehr recht einfach, dir zu helfen
  5. Ich verlinke Mal auf meine Antwort in einem anderen Thread: Meine Variable "velocity" ist ein Feld, also eine Variable, die Teil des Objekts ist. Deine Variable "movedirection" ist eine lokale Variable, die aufh├Ârt zu existieren, sobald die Methode (also Update) durchgelaufen ist. Es wird daher kein Wert von diesem Update in das n├Ąchste ├╝bernommen.
  6. Moin! Ich erkl├Ąre einfach mal (TL;DR weiter unten). So sieht eine Variablendeklaration aus: Typ name Damit sagst du, dass ein St├╝ckchen Speicher klargemacht werden soll, um da etwas reinzuspeichern. Was da reinkommt (ne Zahl, ein Satz, eine Referenz auf ein Objekt...), wird von "Typ" definiert. Der "name" ist dazu da, um ihn woanders im Code zu benutzen, um damit zu sagen, dass man genau diesen Wert auslesen oder ├Ąndern will. Wenn du eine Variablendeklaration in ein Objekt packst (also in einen class-Block, aber au├čerhalb der darin enthaltenen Methoden), dann wird es diese Variable so lange geben wie das Objekt, in dessen Klasse sie deklariert ist. Wird das Objekt gel├Âscht, wird der Speicher frei gemacht und zum Wiederverkauf angeboten. Die Variable gibt es dann nicht mehr. Packst du die Deklaration in eine Methode, dann wird beim Ausf├╝hren der Methode die Variable im Speicher erstellt, und wenn die Methode fertig ist, wird die Variable wieder gel├Âscht. Variablendeklarationen kann man erweitern, z.B. indem man der frischen Variable direkt einen Wert zuweist. Typ name = wert; Das ist das, was du in Start machst. Es ist eine Kombination aus einer Deklaration und einer Zuweisung und nennt sich "Initialisierung". Das bedeutet aber, dass du hier eine neue Variable deklarierst. Die hei├čt zwar genau wie deine Variable etwas weiter oben in der Klasse (nennt sich dann "Feld"), ist aber eine andere, neue Variable (nennt sich "lokale Variable", da in einer Methode deklariert). Kann auch gut dein dass dir deine IDE da gelb unterstreicht und dich darauf hinweist, dass hier Verwechslungsgefahr mit der anderen Variable besteht, weil sie denselben Namen hat. (Ab hier das TL;DR:) Was du eigentlich machen willst, ist keine neue Variable zu deklarieren, sondern der bestehenden Variable einen Wert zuweisen. Du musst daf├╝r aus der Initialisierung eine normale Zuweisung machen, also die Deklaration entfernen. Kurz: statt Building Bakery = new Building(); machst du Bakery = new Building(); Damit meinst du dann die bereits in der Klasse deklarierte Variable. Deine Update-Methode nutzt dieses Feld bereits, aber es kriegt ja aktuell nirgendwo ein Objekt zugewiesen, da Start das Objekt in "seine eigene" Variable packt.
  7. Woran hapert's denn? Hier hast du ein Grundger├╝st, das du erweitern kannst: using UnityEngine; [RequireComponent(typeof(CharacterController))] public class PlayerMovement : MonoBehaviour { private CharacterController characterController; private Vector3 velocity; private void Awake() { characterController = Getcomponent<CharacterController>(); } private void FixedUpdate() { // Update velocity here however you want var previousPosition = transform.position; characterController.Move(velocity * Time.deltaTime); velocity = (transform.position - previousPosition) / Time.deltaTime; } }
  8. Spring mal schr├Ąg in eine Ecke zwischen Wand und Decke. So, dass du die Wand zuerst triffst
  9. Da gibt's nicht "die eine L├Âsung", aber ich mache das ganz gerne ├╝ber einen Abgleich der neuen mit der alten Position. Voraussetzung ist, dass du deinen Geschwindigkeitsvektor in einem Feld aufbewahrst, statt ihn in jedem Frame neu anzulegen. Also statt currentGravity direkt den gesamten Bewegungsvektor speichern. var previousPosition = transform.position; controller.Move(velocity * Time.deltaTime); velocity = (transform.position - previousPosition) / Time.deltaTime; Hiermit wird jedwede Ver├Ąnderung der Geschwindigkeit, die durch eine Kollision passiert, auf den velocity-Wert angewendet, der im n├Ąchsten Frame als Basis f├╝r die neue Geschwindigkeitsberechnung ist.
  10. R├╝ckgabewerte ergeben bei Networking auch nicht so viel Sinn, weil sie bedeuten w├╝rden, dass du eine Anfrage schickst und dann auf eine Antwort wartest. Bei einem nicht ungew├Âhnlichen Ping von 100 und 60 FPS w├╝rde das bedeuten, dass du daf├╝r direkt 6 Frames skipst. Dar├╝ber hinaus schickst du eine Anfrage hier an alle anderen Clients... von wem w├Ąre denn da der eine R├╝ckgabewert? Wenn du den Server unbedingt etwas fragen musst, musst du ein Command schicken und der Server sendet als Antwort einen RPC zur├╝ck.
  11. Wenn's Online ist, dann solltest du einfach die Serverpositionen und lokale Positionen voneinander entkoppeln. Auf dem Server hast du einfach eine imagin├Ąre Fl├Ąche, und wenn ein Raumschiff links raus fliegt, kommt es rechts wieder rein. Lokal wendest du die Positionen, die vom Server kommen, nicht einfach blind an, sondern ├╝bertr├Ągst sie auf die lokale Umgebung und passt dann die Bodenfl├Ąchen an. Es hilft sehr, sich innerlich von dem Gedanken zu l├Âsen, bei allen Spielern m├╝sse die Szene gleich aussehen. Besonders, wenn du so krass am faken bist, wie du es hier tust
  12. Hast du denn Split Screen-Multiplayer? ­čĄö
  13. Ich nehme an, s├Ąmtliche Objekte der Figur sind auf einem Layer, der vom Ground-Check ignoriert wird? So oder so empfiehlt es sich aber, einfach CharacterController.isGrounded zu nehmen. Ist meistens verl├Ąsslicher.
  14. Moin! Teile halt deine Flachwelt in vier Rechtecke auf. Das Raumschiff ist immer auf einem dieser vier Rechtecke, und immer irgendwo von dessen Mittelpunkt aus. Wenn du auf deinem Rechteck oben links bist, dann werden die anderen drei Rechtecke links und ├╝berhalb platziert. Wenn du dann auf die rechte H├Ąlfte wechselst, werden die beiden linken Felder nach rechts verschoben. Und so weiter. Damit der Spieler nicht immer weiter vom Szenen-Nullpunkt wegfliegen kann, kannst du ja gleichzeitig das ganze Konstrukt gegenl├Ąufig verschieben, sodass alles mehr oder weniger in der Mitte bleibt.
  15. Moin! Wenn du von W├╝rfel und Kapsel redest, redest du dann von GameObjects mit entsprechendem Renderer... und Collider? Wenn ja, dann solltest du dringend den die jeweiligen Collider l├Âschen, weil der CharacterController mit ihnen kollidiert. Dass die zum selben GameObject geh├Âren (oder einander untergeordnet sind) ist dem CharacterController n├Ąmlich egal.
×
×
  • Create New...