Jump to content
Unity Insider Forum

Singular

Members
  • Posts

    220
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Singular

  1. Ahhh..... sche auf mein Haupt ­čść ich versgesse die st├Ąndig. Ja, damit sollte es klappen.^^ Danke euch beiden.
  2. Okay, nice das hat geklappt mit. Und es ist tats├Ąchlich so, Hohe Zahl = Ganz oben, niedrige Zahl = ganz unten. Ich habe es jetzt so gemacht, dass alle Objecte, sich in ihrer Awake Methode bei einem Static Object anmelden und dort in eine Liste eingetragen werden. Beim Anklicken des Objects, bekommt dieses die Zahl "List.Count" zugewisen und alle anderen werden dann absteigend durch die Liste zugewisen. Also bekommen sozusagen die Zahl an der Sie stehen in der Liste (invertiert). Ob das jetzt so sauber ist, wei├č ich nicht... Ich wei├č halt nicht, wann so etwas in die Knie geht, da mit jedem Klick jedes Object in der Spielwelt einmal angesprochen wird, bzw deren SpriteRenderer. Mein "Spiel" ist sogesehen kein richtiges Spiel... (kennt Ihr TabelTopSimulator auf Steam?) du darfst es dir als Schreibtisch vorstellen auf dem alles M├Âgliche liegen kann. Spielkarten, W├╝rfel, ... Dementsprechend kann alles immer ├╝berall liegen und auch ├╝ber und untereinander. Es soll zwar einzelne Objekte geben, die immer oben liegen (W├╝rfel) bzw immer unten liegen (Spielbrett) aber das mal am Rande und darum k├╝mmere ich mich sp├Ąter^^. Was ich ja sogesehen damit getan habe... Die Liste k├Ânnte bis ins unendliche gehen. Deswegen wei├č ich nicht ob das so sauber ist. Ich habe gerade mal versucht, dass das oberste Object einfach auf 5 gesetzt wird und alle anderen auf 3, dann geht es nicht mehr. Im zuge dess stellt sich mir nochmal die Frage: Warum geht das hier mit einer Linked List nicht: layerList[0].sortingOder = 5; bzw, wie komme ich am besten an das erste oder xte Objekt dran??? Derzeit mache ich das ├╝ber das Unity Event (ist das ein Event? ­čĄö) OnMouseDown bzw. OnMouseDrag usw. wie pr├╝fe ich das denn am besten? Es werden immer noch Objekte, die eigentlich hinter einem anderen sind, zuerst bewegt. Nicht immer, aber leider sehr oft. Alle Objekte haben in diesem Fall einen BoxCollider2D. Wenn der Spieler Klickt, wird das Objekt nach oben im sortingOrder gesetzt, "Draged" der Spieler, wird das Objekt an den Mauszeiger geheftet und bewegt sich mit. Theoretisch m├╝sste beim Klick gepr├╝ft werden ob sich zwischen dem angeklickten Objekt und dem Mauszeiger Objekte sind, die in der Liste weiter oben liegen. Ich glaube, w├╝rden ALLE Objekte dem Mauszeiger folgen w├Ąre der Fall klar, da mehrere Objekte gefunden wirden die unter dem Mauszeiger sind aber da nur eins folgt (Was ja auch sein soll) bin ich mir nicht sicher, wie ich da vor gehen soll.
  3. ­čś▒ Ich wu├čte, dass dieses Thema mich f├╝her oder sp├Ąter einholen wird... Ich muss euch beiden gestehen, ich habe keine Ahnung von Layern und was sie tun. Ich gehe mal vorsichtig davon aus, dass sie "Schichten" sind wie die Objekte angezeigt werden. Im Inspector gibt es ja auch das sch├Âne Dropdownfeld "Layer - Default", hat das etwas damit zu tun? Alle Objekte in eine Liste stecken, Check! Das bekomme ich hin und ist ├╝berschaubar und machbar. Bei klick das Objekt finden und auf Platz 1 setzen, Check! Das ist auch kein Problem. --> LinkedList.Remove(Renderer), LinkedList.AddFirst(Renderer) H├Ąh? Wie ├Ąndere ich den Layer? Wahrscheinlich dar├╝ber, richtig? L├Ąuft das dann dar├╝ber, dass ich GetComponent<SpriteRenderer>().sortingLayerID = 0. Muss ich dann nicht nochmal durch die ganze Liste durch und jedem Object die n├Ąchst h├Âhere Zahl zuweisen also sozusagen an welcher Position sie sich in der Liste sie sich gerade befinden? Danke schpn mal f├╝r eure Hilfe
  4. Hallo zusammen, Ich br├Ąuchte mal wieder eure Hilfe. Ich habe eine 2D Umgebung in der ich Objekte per Drag&Drop verschieben kann. Das Funktioniert auch soweit alles ganz wunderb├Ąrchen. Problem ist jetzt, dass, wenn die Objekte ├╝bereinander liegen, teilweise unterschiedlich gegriffen werden k├Ânnen. Habe ich zum Beispiel 3 Objekte ├╝bereinander gestapelt, kann es passieren, dass ich das unterste beim klickken bewegen kann, es kann aber auch das oberste oder das mittlere sein. Es sieht ein wenig zuf├Ąllig aus welches Objekt ich erwische. Die Reihenfolge in der Herachie scheint keine Auswirkungen darauf zu haben und auch nicht in welcher Reihenfolge sie gerendert werden. Ich w├╝rde gerne dass das Objekt, dass ich gerade Bewege als letztes gerendert wird. Also ganz oben angezeigt wird. Wie kann ich diese Reihenfolge ├Ąndern? Au├čerdem m├Âchte ich, dass immer das Objekt, das oben liegt zuerst bewegt werden kann.
  5. Kleiner Tip am Rande: "Hilf uns, damit wir dir helfen k├Ânnen." Wir haben keine Ahnung was du hast und was du brauchst. Wenn du sagst, dass du dich nicht C# auskennst, kann man dir nicht wirklich helfen, da wir nicht wissen auf welchem Stand du bist. Beispielscripts sind immer ein guter erster schritt. Was hast du? Was tut es (nicht)? Was sollte es tun? (etc.)
  6. Hallo und Herzlich willkommen, Ein Singleton wird normalerweise so, oder so ├Ąhnlich eingeleitet: public class Singleton : MonoBehaviour { public static Singleton instance; private void Awake() { if(instance != null && instance != this) { Destroy(this); } else { instance = this; } } } Damit hast du das Grundger├╝st. Das kannst du auf ein GameObject in deiner Scene ziehen auf das andere Objecte zugreifen k├Ânnen. Hat dein Singleton also beispielsweise eine Methode wie: public void DoSomething() { //Ich tue Dinge } k├Ânnen deine Objecte so darauf zugreifen: Singleton.instance.DoSomething(); Damit kannst du eine Schnittstelle erstellen ohne dass du gro├čartig dieses eine Object suchen musst oder erst ├╝ber den Inspector zugreifen musst. Hat dein Singleton beispielsweise einen int points, k├Ânnten in einem Tower Defence Game die Gegner die get├Âtet werden einfach das Singleton aufrufen und eine Methode auf dem Singleton ausf├╝hren um die Punkt (,Gold etc.) zu erh├Âhen. Alternativ k├Ânntest du eine Static Class erstellen die letzlich das gleiche ist, aber das kann nicht von MonoBehaviour erben wordurch einzelne Methoden nicht ausgef├╝hrt werden k├Ânnen. Was du damit auch machen kannst, Also mit einem Singleton, du kannst diesem Objekt andere Objekte zuweisen. Zum Beispiel den Spielern, um immer zugriff auf ihn zu haben. Also, um im Beispiel eines Tower Defence zu bleiben, ein Gegner l├Ąuft ins Ziel und der Spieler soll einen Lebenspunkt verlieren (der Sich auch auf der Karte herum bewegen kann) Dann muss du nur die Zuweisung machen, dass das Singleton den Spieler kennt aber der Gegner muss nicht erst den Spieler suchen um ihm dann einen Schaden zuzuf├╝gen. (Ja das letzte beispiel w├Ąre warscheinlich sowieso besser ├╝ber das EventSystem aber, you got the point)
  7. VERGISS ES!!! Habe den Fehler gefunden. Er sa├č, wie so oft zwischen Tastatur und B├╝rostuhl... Habe ihn beseitigt... ­čĄö Ich habe mich in den Objekten verschrieben, und tats├Ąchlich Blend, Fixed geschrieben und schon war der Fehler perfekt. Achso und da ich beseitigt wurde wollte ich mich noch schnell bedanken f├╝r deine Hi ­čö┤[NullReferenceExeption: Object reference not set to an instance of an object Programmer.instance() (at Assets/Office/Programmer.cs 76)]
  8. Okay, Color32 war des r├Ątsels l├Âsung. ­čśâ Allerdings, bleibt das Problem mit dem Fixed. Ich habe auch herausgefunden, dass das Problem nur dann auftritt, wenn es ein Objekt gibt, das diesen Gradienten anfragt. Gibt es kein Objekt, das einer Farbe zugeordnet wird, kann ich zwischen Fixed und Blend ohne Probleme im Game Mode hin und her wechseln. Die Objekte selbst ├Ąndern aber nichts an dieser Farbe. Die holen sich ihre Farbe ├╝ber eine Get Funktion und speichern diesen selber ab. Dabei wird aber auch nicht der mode auf Fixed umgestellt. also nie... es gibt auch keinen Grund dazu...
  9. Ah, okay das versuche ich mal. Color war bisher das einzige, was ich verwendet habe. Richtig. W├Ąrend das Spiel l├Ąuft. Da die Farbe vorher ja noch nicht da war, weil sie ja durch den Code generiert wird. Die Farben nutze ich f├╝r Objekte als "ColorOverLifetime" und da sieht man es dann auch deutlich, dass die Farbe springt und nicht wie bei blend von der einen in die andere ├╝ber geht. Nein in die Update Methode verwende ich nicht um es auf Fixed um zu stellen^^. Die ist sowieso leer
  10. Sorry ich sehe gerade ich habe mich verklickt... das sollte eigentlich in Scripting rein. k├Ânnt ihr den Beitrag verschieben? edit: Dankesch├Ân!
  11. Hallo zusammen, ich schon wieder. ich habe hier eine Reihe von Gradienten, die ich mir Code zuf├Ąllig generieren lasse. sieht in etwa so aus: void Start() { for(int i = 0; i < gradients.Length; i++) { GradientColorKey[] gck = new GradientColorKey[4]; gck[0] = NewKey(0); gck[1] = NewKey(0.4f); gck[2] = NewKey(0.9f); gck[3] = NewKey(1f); gradients[i].colorKeys = gck; gradients[i].mode = GradientMode.Blend; } } private GradientColorKey NewKey(float time) { int r = 0; int g = 0; if (Random.Range(0, 2) == 0) { r = Random.Range(0, 256); g = Random.Range(120, 256); } else { r = Random.Range(80, 256); g = Random.Range(0, 256); } int b = Random.Range(0, 141); Color c = new Color(r, g, b); return new GradientColorKey(c, time); } Jetzt habe ich folgende Probleme: Zum einen wird die Farbe immer auf "HDR" eingestellt, was dazu f├╝hrt, dass die Objekte immer wei├č angezeigt werden. Zum anderen wird die Farbe immer auf Fixed umgestellt. Selbst dann, wenn ich hin gehe und das Blend selbst eintrage, (im Game Mode) wird es, so als w├╝rde es in irgendeiner Update Methode wieder auf Fixed umgestellt. Vielen Dank.
  12. Hallo Sascha, Danke dir. Da war irgendwo mein Fehler. Jetzt funktionierts wie es soll! Wie gesagt mit Local und global war ich mir nicht sicher deswegen habe ich beides hin und her ausprobiert in allen m├Âglichen kombinationen. Und das ich den Quaternion in einen V3 umwandle um ihn dann wieder zu einem Quaternion zu machen war diesem hin und her geschuldet, um zu schauen ob es vielleicht daran liegen k├Ânnte, dass er den Quaternion irgendwie anders ├╝bertr├Ągt. Aber wie gesagt, jetzt klappts. Danke dir.
  13. Hallo zusammen, Hallo Sascha ich habe folgendes Problem: Ich m├Âchte f├╝r die Raumstation, die der Spieler in meinem Spiel bauen kann einzelne Module erstellen, die angebaut werden k├Ânnen. Das ganze soll aber offen gehalten werden, dass der Spieler frei ist welches Modul wo hin kommt. Soweit so gut. Ich habe dazu einzelne Module erstellt und habe ihnen ein EmptyGameObject zugewiesen, um dem Modul mitzuzeilen, wo die Verbindungspunkte sind, also wo weitere Module angeschlossen werden k├Ânnen. Wird ein neues Modul erstellt, wird es als Child Object des Moduls an das es angeschlossen wird, Instanziiert. Darum habe ich in der StartMethode des Moduls folgenden simplen Code geschrieben: private void Start() { transform.localPosition = Offset; try { turnSpeed = GetComponentInParent<MainModule>().turnSpeed * -1; Vector3 rotation = GetComponentInParent<Transform>().localRotation.eulerAngles; Debug.Log(rotation); transform.rotation = Quaternion.Euler(rotation); } catch { } } Das Problem ist die Zeile vor und nach dem Debug. Bzw m├╝sste das Problem dort sein... Das Parent Object hat als Rotation (0, 180, 0) und das wird mir im Debug auch so ausgegeben. Die Rotation, die das neue Modul aber dann annimmt ist die Rotation, die es vorher auch hatte. Das einzige, was passt ist die Position. Dabei habe ich mittlerweile alle Kombinationen durch bez├╝glich transform.localRotation und transform.rotation. Auch die m├Âglichkeit Vector3 zu einem Quaternion zu machen straft mich mit dem selben Ergebniss. Die Rotation wird in allen f├Ąllen 0 ├╝bernommen. Wenn das Object vorher eine rotation von (50,50,50) hatte, hat es nachher die selbe Rotation. Was mache ich falsch?? Oder habe ich etwas komplett d├Ąmliches ├╝bersehen?
  14. Somit liegt das Problem ganz woanders... wo allerding kann ich euch nicht sagen, denn: Ich habe, wie schon angedroht das Script neu geschrieben und getestet... l├Ąuft... ohne Probleme gleich beim ersten versuch. Vielleicht habe ich schon vorher irgendo was mit dem Script gemacht, was ihm nicht geschmeckt hat und dann wollte er einfach nicht mehr. Keine Ahnung. Das habe ich jetzt noch mit hinzugef├╝gt aber das ├Ąndert nichts an der funktionalit├Ąt^^ Danke euch.
  15. Genau. Der Sinn ist, dass du nicht mehr Schild aufladen sollst, wenn du schon auf oder ├╝ber Maximum bist. Dann ruft sie sich aber auch selbst nicht auf. die kommt dann gar nicht ins "if" rein und beendet sich sofort. Das soll sie auch. Genau. Das w├╝rde ich auch erwarten. Also starten tut er, stoppen nicht. Das Stop sehe ich auch, wie erwartet, auch nur ab dem zweiten Mal. Ja, hab ich mal versucht... ├Ąndert leider nichts am Verhalten. Also sie startet wie erwartet und stopp nicht. Wenn euch nichts mehr einf├Ąllt, werde ich das Script mal einfach neu schreiben und schauen ob es dann funktioniert.
  16. Hallo zusammen, Das ist jetzt die ganze Schild Klasse. wie gesagt, die Coroutine wird gestartet und das Stop wird immer ├╝bersprungen: Damage ist ein Struct der neben ein paar Methoden die drei int werte normalDamage, projectileDamage und energyDamage hat Und falls ihr fragt Shield : ShipComponent und ShipComponent : MonoBehaviour -> IEnumerator wird also unterst├╝tzt (Das m├Âchte ich aber noch ├Ąndern. Gef├Ąllt mir n├Ąmlich nicht^^) aber Details... Das Debug.Log("Stop") wird mir ├╝brigens auch angezeigt, aber die Coroutine nicht beendet. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Shield : ShipComponent { private Equipment health; public int shieldCurrent;//gibt an, wieviele Schildpunkte der Schild derzeit hat. public int shieldMax; //gibt an, wieviele Schildpunkte der Schild maximal haben kann. public float energyUsage; //gibt an, wieviel Energie gebraucht wird um einen Schildpunkt zu regenerieren public int regenerationValue; //gibt an, wieviele Schildpunkte regeneriert werden pro Coroutine public float regenerationRate; //gibt an, wie lange es dauert einen Schildpunkt zu regenerieren private Coroutine regenerationRoutine; void Start() { health = GetComponent<Equipment>(); health.Equip(this); shieldCurrent = shieldMax; } public Damage TakeDamage(Damage damage) { // Wird aufgerufen, wenn das Objekt Schaden erleidet. Damage damageTest = damage; if (damage.EnergyDamage() > 0) { //EnergieSchaden Abfangen: if (shieldCurrent > 0) { if (damage.energyDamage >= shieldCurrent) { damage.energyDamage -= shieldCurrent; shieldCurrent = 0; } else { shieldCurrent -= damage.energyDamage; damage.energyDamage = 0; } //NormalenSchaden abfangen. if (damage.normalDamage >= shieldCurrent) { damage.normalDamage -= shieldCurrent; shieldCurrent = 0; } else { shieldCurrent -= damage.energyDamage; damage.normalDamage = 0; } } if(regenerationRoutine != null) { Debug.Log("Stop"); StopCoroutine(regenerationRoutine); } regenerationRoutine = StartCoroutine(RegenerationShield()); } return damage; } IEnumerator RegenerationShield() { if (shieldCurrent < shieldMax) { yield return new WaitForSeconds(regenerationRate); if (health.PayEnergy(energyUsage)) { shieldCurrent += regenerationValue; if(shieldCurrent >= shieldMax) { int diff = shieldCurrent - shieldMax; shieldCurrent = shieldMax; health.ReturnEnergy(diff * (energyUsage / regenerationValue)); } } if(shieldCurrent < shieldMax) { regenerationRoutine = StartCoroutine(RegenerationShield()); } } } }
  17. ...hab ich versucht. Funktioniert nicht. Das einzige was tats├Ąchlich klappt ist das StopAllCoroutines() bei allem anderen passiert nichts. In diesem Fall kann ich nicht mal ein Debug einbauen um zu schauen was passiert, weil es da nichts zwischen gibt. Es ist eigentich genauso Stumpf, wie ich es oben geschrieben habe, dass die beiden zeilen direkt hintereinadner kommen. Erst Stop, dann Start und das Stop hat eine if abfrage ob es null ist, damit ich hier keinen Fehler bekomme. Alles andere ist wie oben geschrieben... Edit: UND (nicht, dass ich f├╝r bekloppt gehalten werde^^) die Coroutine wird nat├╝rlich nicht innerhalb der Methode abgespeichert, sonder selbstverst├Ąndlich innerhalb der Klasse!
  18. Achso der mein Code oben ist nicht ganz richtig da in der Dokumentation das hier steht: Aber das ├Ąndert dennoch nichts an der Tatsache.
  19. Hallo zusammen, ganz kurze Frage: Warum ist es nicht m├Âglich folgendes zu tun: (Vorausgesetzt ich habe Coroutine jetzt auch immer richtig geschrieben ) StartCoroutine(NameCoroutine()); StopCoroutine(NameCoroutine()); //├ťbergabe als IEnumerator Genauso wie das hier: Coroutine coroutine = StartCoroutine(NameCoroutine()); StopCoroutine(coroutine); //├╝bergabe als Coroutine Objekt Oder so: StartCoroutine(NameCoroutine()); StopCoroutine("NameCoroutine"); // ├╝bergabe als String Alles drei laut Dokumentation von Unity m├Âglichkeiten eine einzelne Coroutine zu stoppen. (https://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html) Wie soll ich vorgehen, wenn ich m├Âchte, dass eine Coroutine, sollte sie ein weiteres mal aufgerufen werden, die laufende beendet wird und die Zeit wieder von vorne beginnt? Also in etwa das: public void ShieldRegeneration() { StopCoroutine(ShieldRegeneration()); StartCoroutine(ShieldRegeneration()); } Problem ist derzeit, dass das StopCoroutine nicht ausgef├╝hrt wird aber ich nicht auf die StopAllCoroutines zur├╝ck greifen m├Âchte, weil ich noch nicht wei├č ob noch andere dazu kommen werden.
  20. 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)
  21. 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. ­čśâ
  22. 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.
  23. 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. ­čśâ
  24. 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; }
  25. 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; } }
×
×
  • Create New...