Jump to content
Unity Insider Forum

Haji17

Members
  • Posts

    26
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Haji17's Achievements

Member

Member (2/3)

0

Reputation

  1. Ja, stimmt. Das zweite Mal Anfragen kann ich mir ersparen mit der Schleife. Jetzt wird mir auch klar, warum bei meinem ersten Versuch die Anfrage nur ein Mal erfolgt ist. Wenn ich den Game-Mode starte, so soll die Anfrage direkt beim Start erfolgen und durchgehend immer wieder laufen. Das heißt, ich muss das OnEnabled so einbauen oder? void OnEnabled () { StartCoroutine(Anfragen()); } private IEnumerator Anfragen() { while (enabled) { StartCoroutine(GetRequest("http:")); yield return new WaitForSeconds(5f); StartCoroutine(GetRequest("http:")); } } Das habe ich dann soweit (hoffentlich) richtig verstanden. Warum ich zur Sicherheit diese Überprüfung machen soll, leuchtet mir ein. Ich habe mir OnDisable mal im Manual aufgerufen (https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnDisable.html), aber das Beispiel verwirrt mich etwas. Muss ich vor meinem Void OnEnabled() ein Void OnDisable mit dem Inhalt StopAllCoroutines setzen? Aber das macht doch an der Stelle keinen Sinn. Wo und wie baue ich denn ich OnDisable- Funktion ein?
  2. Eine Frage hätte ich noch. Dank deiner Hilfe konnte ich meinen Json-String deserialisieren wie gewünscht. Jetzt habe ich das Problem, dass meine http-Request Anfrage nur ein Mal zu Beginn erfolgt. Ich will die Anfrage immer wieder neu stellen nach z.B. 5 Sekunden. Die einfachste aber auch ziemlich unelegante Variante wäre eine For-Schleife mit Zähler laufen zu lassen, bei dem ich den letzten Punkt sehr sehr hoch ansetze Dann kam mir die Idee, eine Coroutine mir zu basteln, in der die Coroutine mit der Serveranfrage (inkl. dem Bewegungsprozess usw.) ausgeführt wird, danach mit waitforseconds (5f) "pausiert" und dann nochmals die Coroutine startet. Also so etwas: void Start () { StartCoroutine(Anfragen()); } private IEnumerator Anfragen() { StartCoroutine(GetRequest("http")); yield return new WaitForSeconds(5f); StartCoroutine(GetRequest("http")); } Wenn ich das so mache, dann habe ich ja nur zwei Anfragen mit einer Pause von 5 Sekunden. Wenn ich das ganze anstatt void Start() mit void update () machen würde, dann eskaliert das ganze etwas Kann ich das ganze regeln, in dem ich eine while (enabled)-Schleife in meiner Coroutine "Anfragen" einbaue? Ich kann das ganze erst am Montag erst ausprobieren, da es sich um einen lokalen Server handelt, aber ich möchte gerne bis dahin das Problem lösen. void Start () { StartCoroutine(Anfragen()); } private IEnumerator Anfragen() { while (enabled) { StartCoroutine(GetRequest("http:")); yield return new WaitForSeconds(5f); StartCoroutine(GetRequest("http:")); } } Mache ich hier einen Denkfehler oder passt das so mit einer sich immer wiederholenden Serveranfrage im Abstand von 5 Sekunden.
  3. Super danke, dann bin ich beruhigt. Im Grunde habe ich mir schon gedacht, dass das in der Form nicht möglich sein wird, aber manchmal denk ich mir, ich könnte etwas übersehen haben und der Fehler liegt bei mir
  4. Oh sorry. Ja hast natürlich Recht 😅 Genau, das "[0]" bringt mich jedes Mal aus der Spur. Das müsste ich ja eigl als "public int [0];" deklarieren, aber das geht mit JsonUtility nicht. In der dieser Form des Json-Strings kann ich also JsonUtility nicht nutzen, sondern muss eine Json Bibliothek auswählen. Hab ich das richtig verstanden? Die verlinkten Beispiele habe ich mir auch nochmals angeschaut, auch da wird ja nicht etwas in der Form "[0]" genutzt, sondern wie zum Beispiel {points: [0:{...}]}. Das Points- Beispiel finde ich am verständlichsten für mich, weil ich da auch genau verstehe wie ich was als Struct definiere
  5. Hallo, ich hätte noch ein Mal eine Frage bzgl. der Json Serialization. Ich möchte gerne einen solchen Json-String in Unity verwenden. {"[0]": {"x": 148.0, "y": 162.0, "dx": 3, "dy": -43}, "[1]": {"x": 477.0, "y": 118.0, "dx": 3, "dy": 43}} JsonUtility kann ich nur auf Objekte anwenden (also geschweifte Klammern, wenn ich das richtig aus den Beiträgen hier gelernt hab ). Dahingehend erfüllt mein Json-String ja diese Bedingung. Ich tue mich gerade bei der Definition eines Structs schwer, so dass ich dann irgendwann die Eintrage x (148.0) und y (162.0) von meinem Array [0] auswählen kann. Ausgehend von einem solchen Struct: public struct Thing { public float x; public float y; public float dx; public float dy; } [System.Serializable] public struct ManyThings { public Thing[] things; } Habe ich das richtig verstanden, dass ich hiermit nur diesen Teil "[0]": {"x": 148.0, "y": 162.0, "dx": 3, "dy": -43} meines Json Strings berücksichtigt habe? Das heißt, eigentlich müsste ich doch jetzt ein übergreifendes Struct konstruieren, welches die zwei Teile [0] und [1] beinhaltet oder? Aber angenommen, ich nehme jetzt ein übergreifendes Struct und nenne es "InitialThing", dann würde das ja aus den zwei Einträgen [0] und [1] bestehen. Aber jetzt bin ich gerade verwirrt, mit welchem Datentyp ich die beiden deklariere. Das sind doch eigentlich Strings? Kann man verstehen womit ich gerade verwirrt bin? Oder habe ich das schlecht erklärt? 😅
  6. Das ist mir auch gerade aufgefallen Das würde bedeuten, ich brauch diesen Richtungsvektor aus dx und dy nicht, sondern nehmen immer meinen neuen Positionsvektor, nach dem sich der alte ausrichtet. Sprich Hier nehme ich doch den aktueller_Vektor oder? Verstehst du jetzt aber auch, was mich an der Variable walkdistance stört? Der Wert ist ja eigentlich nicht konstant, sondern ich müsste die Strecke zwischen neuen Vektor und altem Vektor immer wieder neu berechnen. Aber wie kann ich die Werte vom alten Vektor beibehalten, nachdem der neue schon da ist? Ich bin mir aber gerade unsicher ob ich mich nicht gerade selber verwirrt habe
  7. Also, so wie ich mir das vorstelle soll das wie folgt ablaufen. Das Object steht am Punkt (x1,0,z1) und bekommt dann einen neuen Zielvektor (x2,0,z2). Jetzt dreht er sich in die Richtung des neuen Zielvektors und bewegt sich dann translatorisch vom x1 nach x2. Wenn er den Punkt erreicht hat, könnte er einen neuen Zielvektor (x3,0,z3) bekommen und wiederholt den vorherigen Schritt um dann da anzukommen. Konnte dir diese Erklärung helfen?
  8. Ja, dass das kommutativ gerechnet wird versteh ich. Aber mich stört dieser Faktor walkDistance, den benötige ich doch eigentlich nicht? Oder habe ich gerade einen Denkfehler 😅
  9. Hier habe ich die Daten mir rausgezogen und mir dann daraus einen vector3 (var aktueller_Vektor) gebastelt, um durch diesen die aktuelle Position darzustellen. Variable aktueller_Winkel und aktuelle_Rotation wollte ich zuerst nutzen für die Drehung, aber dann kam mir dein Tipp in den Sinn dass ich dafür "Quaternion.Lookrotation" in Kombination mit meinem aktueller_Vektor- Variable nutzen kann. Ich denke, das sollte so möglich sein ohne Trigonometrie oder? Jetzt frage ich mich gerade, ob das Sinn macht, was in der Coroutine RunAround mache. Mit "walkdistance" lege ich ja die Strecke fest, die mein Object sich bewegen soll, aber angenommen ich fahre vom Startpunkt (0,0,0) zu (5,0,0) , dann beträgt walkdistance ja 5 (angenommen Bewegung nur in x-Richtung). Wenn der jetzt aber von (5,0,0) nach (2,0,0) sich zurückbewegt, dann wäre walkdistance doch -4. Wenn ich mir das richtig überlegt habe, wird das in meinem Script doch nicht beachtet? In der Coroutine RunTowards schon mit der Variable targetPosition. Bin ich richtig mit meiner Überlegung? Und wenn ja, wie könnte ich das anpassen?
  10. using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class Get : MonoBehaviour { private const float ROTATE_SPEED = 90f; private const float WALK_SPEED = 2f; private const float walkDistance = 10f; [System.Serializable] public struct Thing { public float x; public float y; public float dx; public float dy; } [System.Serializable] public struct ManyThings { public Thing[] things; } // Start is called before the first frame update void Start() { StartCoroutine(GetRequest("http://ip.jsontest.com/")); } private IEnumerator GetRequest(string uri) { using (UnityWebRequest webRequest = UnityWebRequest.Get(uri)) { // Request and wait for the desired page. yield return webRequest.SendWebRequest(); string[] pages = uri.Split('/'); int page = pages.Length - 1; switch (webRequest.result) { case UnityWebRequest.Result.ConnectionError: case UnityWebRequest.Result.DataProcessingError: Debug.LogError(pages[page] + ": Error: " + webRequest.error); break; case UnityWebRequest.Result.ProtocolError: Debug.LogError(pages[page] + ": HTTP Error: " + webRequest.error); break; case UnityWebRequest.Result.Success: var json = webRequest.downloadHandler.text; var downloadedThings = JsonUtility.FromJson<ManyThings>(json); var x_aktuell = downloadedThings.things[0].x; var y_aktuell = downloadedThings.things[0].y; var d_x = downloadedThings.things[0].dx; var d_y = downloadedThings.things[0].dy; var aktueller_Winkel = Mathf.Atan(d_y / d_x); var aktueller_Vektor = new Vector3(x_aktuell, 0F, y_aktuell); var aktuelle_Richtung = new Vector3(aktueller_Winkel, 0F, 0F); Debug.Log("Aktueller Vektor ist = " + aktueller_Vektor + "Aktueller Winkel beträgt " + aktueller_Winkel ); StartCoroutine(RunAround(aktueller_Vektor)); break; } } } private IEnumerator RunAround(Vector3 Position) { while (enabled) { yield return TurnTowards(Position); yield return RunTowards(Position * walkDistance); } } private IEnumerator TurnTowards(Vector3 direction) { var targetRotation = Quaternion.LookRotation(direction); while (transform.rotation != targetRotation) { transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, ROTATE_SPEED * Time.deltaTime); yield return null; } } private IEnumerator RunTowards(Vector3 direction) { var targetPosition = transform.position + direction; while (transform.position != targetPosition) { transform.position = Vector3.MoveTowards(transform.position, targetPosition, WALK_SPEED * Time.deltaTime); yield return null; } } }
  11. Ah, jetzt hab ich es verstanden danke Das hab ich mir zu Herzen genommen und mit den Daten weitergearbeitet , ich habe mir überlegt wie ich das Ganze für die Bewegungsumsetzung nutzen kann (siehe nächster Beitrag)
  12. Ich habe nur als "Platzhalter" die Variable mythingarray genutzt, da mir Visual Studio angezeigt hat, dass ich eine Zuordnung benötige. Aber jetzt bin ich gerade komplett verwirrt, wie ich das mit JsonUtility und den "Array-Zuordnungen" mache. Ich hoffe, ich hab das jetzt mein Problem nicht zu kompliziert aufgezeigt mit den drei Beiträgen, aber das erschien mir übersichtlicher als alles in einem Post.
  13. using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class Get : MonoBehaviour { [System.Serializable] public struct Thing { public float x; public float y; public float dx; public float dy; } [System.Serializable] public struct ManyThings { public Thing[] things; } // Start is called before the first frame update void Start() { StartCoroutine(GetRequest("http://ip.jsontest.com/")); } private IEnumerator GetRequest(string uri) { using (UnityWebRequest webRequest = UnityWebRequest.Get(uri)) { // Request and wait for the desired page. yield return webRequest.SendWebRequest(); string[] pages = uri.Split('/'); int page = pages.Length - 1; switch (webRequest.result) { case UnityWebRequest.Result.ConnectionError: case UnityWebRequest.Result.DataProcessingError: Debug.LogError(pages[page] + ": Error: " + webRequest.error); break; case UnityWebRequest.Result.ProtocolError: Debug.LogError(pages[page] + ": HTTP Error: " + webRequest.error); break; case UnityWebRequest.Result.Success: var mythingarray = webRequest.downloadHandler.text; JsonUtility.FromJson<ManyThings>(mythingarray); break; } } } }
  14. Ich frage mich gerade, wo im Skript ich diesen Schritt mache , wenn ich mir die Json Datei durch downloadhandler.text runterlade und JsonUtility anwenden soll. Im nächsten Beitrag poste ich mal meinen Code für das Aufrufen mit Unitywebrequest mit der darauf folgenden Fallunterscheidung ob ich was beim Aufrufen zurückbekomme Im dritten Fall , will ich mein Json-string mit downloadhandler.text aufrufen und weiter bearbeite. Ich habe verstanden, dass ich anwenden muss, aber hier benötige ich ja vorher diesen Schritt.
  15. Super, vielen lieben Dank! Danke, damit habe ich das verstanden. Alles klar, dann mache ich mich an die Arbeit Nochmals danke für deine Hilfe
×
×
  • Create New...