Jump to content
Unity Insider Forum

Thariel

Members
  • Content Count

    439
  • Joined

  • Last visited

  • Days Won

    13

Thariel last won the day on January 2

Thariel had the most liked content!

Community Reputation

87 Excellent

About Thariel

  • Rank
    Advanced Member
  • Birthday 11/30/1988

Contact Methods

  • Website URL
    http://www.lost-in-nature.com

Profile Information

  • Gender
    Male
  • Location
    Bern
  • Interests
    Krafttraining, Spieleentwicklung, Studio Fotografie

Recent Profile Visitors

8,813 profile views
  1. Cool, vielen Dank! Ich überlege mir noch, wie ich es dann genau löse 😃
  2. Also ich gehe davon aus, dass in Update() den Code der Reihe nach in allen Objekten ausgeführt wird und in "Internal physics update" Kollision und so weiter berechnet wird. https://docs.unity3d.com/Manual/ExecutionOrder.html
  3. Genau so mache ich das auch! Das Problem ist aber: 1. Frame: Beide NPC's warten darauf, dass das Feld frei wird. 2. Frame: Das Feld wird frei. 3. Frame: -> Npc 1 macht Raycast. Feld ist frei. Bewegt sein Collider auf das neue Feld (Physik wird aber erst im nächsten 4. Frame vor Update() ausgeführt). -> Npc 2 macht Raycast. Feld ist frei (Collider von Npc 1 noch nicht eingetroffen). Bewegt sein Collider auf das angeblich freie Feld. 4. Frame: Noch vor Update() werden die Collider bewegt, mit dem Ergebnis, dass jetzt beide auf dem selben Feld sind. So verstehe ich das zumindest... oder funktioniert es anders? 🤔
  4. Hi Ich habe folgendes Problem: Auf jedem Feld des Schachbrettartigen Spielfeldes darf immer nur ein Npc stehen. Wenn 2 Npc darauf warten, das selbe Feld zu betreten und das Feld frei wird, dann testen beide Npc's gleichzeitig im selben Frame mit einem Raycast, ob es frei ist. Es ist auch frei und beide ziehen auf das selbe Feld, doch jetzt stehen 2 Npc's auf dem selben Feld, weil die zwei Raycasts und die Bewegung der Collider jeweils Parallel ablaufen (Execution Order). Die Bewegung findet mit transform.Translate statt. Wie könnte ich das Problem lösen? Danke schon mal 😅
  5. Hi In meiner Map hab ich ein Fog of War, damit man nur Bereiche sieht, die der Spieler schon besucht hat. Dazu habe ich über die Map einfach eine Maske gelegt und ändere die Pixel an der Position vom Player. Aber nur, wenn der Spieler sich bewegt hat und das ganze befindet sich auch noch in einer Coroutine. Hab mir gedacht, dass dies sicher Preformant genug ist, doch ich habe starke Ruckler. Anscheinend ist SetPixels extrem langsam bei grossen Bilder, selbst wenn man nur ein kleiner Bereich ändert (64x64). Habe die Idee, ein echter eigener Prozess zu machen oder die zu ändernden Pixels in eine Datenbank zu schreiben, die dann einzeln abgearbeitet werden. Ist aber beides irgendwie Quatsch. Hat jemand eine gute Idee?
  6. Der Wert ist schon aktuell, es ist die direkte Position vom Player und diese siehst du auch auf der Karte (gelber Pfeil). Habe das Problem aber jetzt gelöst: Hab einfach das ganze umgebaut und verwende jetzt kein ScrollView mehr, sondern einfach ein Image mit Maske. Sieht jetzt immer noch alles genau gleich aus, aber kein ScrollView, das rein pfuscht. Danke
  7. Macht leider keinen Unterschied! Komisch ist auch, dass manchmal X korrekt aktualisiert wird und machnmal Y, aber nie beide auf Anhieb korrekt... Hast du noch eine andere Idee?
  8. Hi Ich hab in der Update() Funktion einfach ein SetActive() Toggle eingebaut: if(Input.GetKeyDown(KeyCode.M)) { goWindow.SetActive(!goWindow.activeInHierarchy); CmdCenterPlayer(); }
  9. Hi Wenn der Spieler die Karte öffnet, soll er immer schön zentriert sein. Dazu hab ich eine Funktion gemacht. Diese wird beim öffnen der Karte aufgerufen und ist auch über einen Schaltfläche aufrufbar. Jedoch funktioniert es nie auf Anhieb, sondern immer erst beim zweiten Versuch. Ich muss also die Karte 2x hintereinander öffnen, damit die Position korrekt gesetzt wird. Wie ihr seht ist bei der Position im RectTransform immer etwas merkwürdig, entweder bei X oder Y. Hab schon Canvas.ForceUpdateCanvases() und LayoutRebuilder.ForceRebuildLayoutImmediate() ausprobiert. public void CmdCenterPlayer() { float x = Mathf.Floor(PlayerController.singleton.transform.position.x / 4.0F); float y = Mathf.Floor(PlayerController.singleton.transform.position.z / 4.0F); rectContent.anchoredPosition = new Vector2(-x * 50, -y * 50); //50=map tile size } Wer weis warum das so ist? Solche unlogischen Dinge machen mich echt nervös! 😡 PS: Das ganze befindet sich in einem ScrollView und das GameObjekt im Inspector ist das Content-Objekt vom ScrollView.
  10. Hey! Eine komische Frage, was? Es geht um Patreon, eine Webseite um Spenden für sein Projekt zu sammeln und die Spender dafür zu belohnen. Ich frage mich, ob man einer limitierten Anzahl von Let's Players früheren Zugang zum Spiel geben könnte und nur diese das Spiel Streamen dürften. Sie hätten den Vorteil, dass sie exklusiven Content erstellen dürften und ihr Kanal damit wächst und würden dafür zu den Entwicklungskosten beitragen. Win-Win für beide. Aber könnte ich so ein exklusives Recht auf YT durchsetzen und Videos löschen lassen, die jemand hoch lädt, ohne dafür berechtigt zu sein?
  11. Jetzt funktioniert es. Weiss zwar nicht warum genau, aber nach dieser Änderung funktioniert alles perfekt, auch ohne Coroutine. Das Funktioniert NICHT: GameObject go = Instantiate(goPillarPrefab, transform.position, Quaternion.identity); Quaternion lookRotation = Quaternion.LookRotation(direction, transform.up); lookRotation *= Quaternion.Euler(0, 45, 0); //damit die zelle um 90° winkel ist go.transform.rotation = lookRotation; Das FUNKTIONIERT: Quaternion lookRotation = Quaternion.LookRotation(direction, transform.up); lookRotation *= Quaternion.Euler(0, 45, 0); //damit die zelle um 90° winkel ist GameObject go = Instantiate(goPillarPrefab, transform.position, lookRotation); Einfach die Rotation vorher berechnen und bei Instantiate() direkt übergeben.
  12. Vielleicht machst du Waypoints und berechnest immer die Richtung vom Kanu zum nächsten Waypoint und Clampst Kamera/Spieler/Kanu im Winkel... falls ich das richtig verstanden habe 🤔
  13. Leute, jetzt mal ernsthaft! Was passiert da? 😱 Nachdem ich ein Bode-Tile gebaut habe, ruft dieses Script alle Boden-Tiles in der Umgebung auf, um Wände und Pfosten zu aktualisieren: LayerMask mask = LayerMask.GetMask("Level"); Collider[] cols = Physics.OverlapBox(goGhost.transform.position, new Vector3(4, 4, 4), Quaternion.identity, mask); foreach(Collider col in cols) { if (col.transform.gameObject.tag == "Floor") { col.transform.gameObject.GetComponent<DesignerObject>().UpdateWalls(); col.transform.gameObject.GetComponent<DesignerObject>().UpdatePillars(); } } Wie Wände werden generiert, aber es entsteht nur ein Pfosten: Dieses Script generiert die Pfosten: List<Vector3[]> points = new List<Vector3[]>(); //um on OnDrawGizmos() zu zeichnen, was genau passiert public void UpdatePillars() { List<Vector3> directions = new List<Vector3>() { transform.forward + transform.right, transform.forward + -transform.right, -transform.forward + transform.right, -transform.forward + -transform.right }; int round = 0; foreach (Vector3 direction in directions) { Debug.Log("Round " + round + " with direction " + direction + " is starting..."); Vector3 myCenterPoint = transform.position + new Vector3(0, 2, 0); Vector3 myCornerPoint = myCenterPoint + (direction * 2); points.Add(new Vector3[] {myCenterPoint, myCornerPoint }); int pillarCount = 0; int wallCount = 0; GameObject goPillar = null; LayerMask mask = LayerMask.GetMask("Level"); Collider[] cols = Physics.OverlapSphere(myCornerPoint, 0.5F, mask); foreach (Collider col in cols) { Debug.Log("Round " + round + ": Collider found: " + col.transform.gameObject.name); if (col.transform.gameObject.tag == "Wall") wallCount++; if (col.transform.gameObject.tag == "Pillar") { pillarCount++; goPillar = col.transform.gameObject; } } if (wallCount == 0 && pillarCount > 0) { Debug.Log("Round " + round + ": Destroy Pillar"); Destroy(goPillar); } if (wallCount > 0 && pillarCount == 0) { GameObject go = Instantiate(goPillarPrefab, transform.position, Quaternion.identity); Quaternion lookRotation = Quaternion.LookRotation(direction, transform.up); lookRotation *= Quaternion.Euler(0, 45, 0); //damit die zelle um 90° winkel ist go.transform.rotation = lookRotation; go.transform.SetParent(transform.parent); go.name = goPillarPrefab.name; Debug.Log("Round " + round + ": Pillar Created."); } Debug.Log("Round " + round + " finished."); round++; } } Ich zeichne auch genau auf, WO OverlapSphere() wirkt und auch die Richtung und die Colliders sind ersichtlich (alle haben korrekten Layer + Tag): private void OnDrawGizmosSelected() { foreach (Vector3[] point in points) { Gizmos.DrawLine(point[0], point[1]); Gizmos.DrawSphere(point[1], 0.5F); } } Aber die Konsole gibt völlig unterwartete Ausgaben: In der ersten "direction" findet es 4 Wände, in der zweiten WIEDER 4 Wände UND ein Pfosten und dann aber nichts mehr... Versteh ich nicht 🤔
  14. Es ist schon ein Grid System. Habe verschiedene Systeme ausprobiert auch deine Variante mir einem Array, das generieren von Wänden ist damit natürlich einfacher, aber mein System hat andere Vorteile. Aber ist ein anderes Thema. Ist es so, dass nach einem Instantiate() direkt in der nächsten Zeile schon Physik Abfragen durchgeführt werden können oder ist das GameObjekt erst im nächsten Frame da? Hab mal ein Video zum besseren Verständnis gemacht.
×
×
  • Create New...