Kojote Geschrieben 21. Februar 2022 Melden Share Geschrieben 21. Februar 2022 Hi! Gleich mal als Bild zur Anschauung: Der schwarze Punkt ist der Spieler. Der grüne Holzylinder ist ein Bereich wo ich um den Spieler per Zufall etwas spawnen möchte. Hat jemand eine Idee wie ich eine solche Zufallsposition ermitteln kann? Grüße von Kojote Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. Februar 2022 Melden Share Geschrieben 22. Februar 2022 Random.insideUnitCircle.normalized * Random.Range(innerRadius, outerRadius) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 vor einer Stunde schrieb Sascha: Random.insideUnitCircle.normalized * Random.Range(innerRadius, outerRadius) Danke! 😁 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Mhhh also so richtig funktioniert das nicht. Vector3 position = Random.insideUnitCircle.normalized * Random.Range(spawnArea.x / 2, spawnArea.y / 2); Sie werden immer auf der selben Linie und Position außerhalb des äußeren Rings gespawnt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Hier mal die gesamte Methode: private SpawnPoint CalculateSpawnVector() { Vector3 position = Random.insideUnitCircle.normalized * Random.Range(spawnArea.x / 2, spawnArea.y / 2); RaycastHit hit; if(Physics.Raycast(position + new Vector3(0, 100.0f, 0), Vector3.down, out hit, 150.0f, terrainLayer)) { spawnPoint.position = new Vector3(position.x, hit.point.y,position.z); spawnPoint.rotation = Quaternion.FromToRotation(position, hit.normal); return spawnPoint; } spawnPoint.position = new Vector3(0,0,0); spawnPoint.rotation = Quaternion.identity; return spawnPoint; } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. Februar 2022 Melden Share Geschrieben 22. Februar 2022 Du guckst ja auch von oben. insideUnitCircle gibt dir einen Vector2 zurück, also Werte auf der XY-Ebene. Du willst aber auf der XZ-Ebene sein. Also new Vector3(randomVector.x, 0, randomVector.y) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Achso, ja klar wenn ich von der Seite schaue sind sie auf unterschiedlichen höhen. Dann sollte das nun so stimmen: private SpawnPoint CalculateSpawnVector() { Vector2 randomPosition = Random.insideUnitCircle.normalized * Random.Range(spawnArea.x / 2, spawnArea.y / 2); Vector3 position = new Vector3(randomPosition.x, 0, randomPosition.y); RaycastHit hit; if(Physics.Raycast(position + new Vector3(0, 100.0f, 0), Vector3.down, out hit, 150.0f, terrainLayer)) { spawnPoint.position = new Vector3(position.x, hit.point.y, position.z); spawnPoint.rotation = Quaternion.FromToRotation(position, hit.normal); return spawnPoint; } spawnPoint.position = new Vector3(0,0,0); spawnPoint.rotation = Quaternion.identity; return spawnPoint; } EInziges Problem ist noch das Quaternion. spawnPoint.position gibt die richtige Position wieder, auch die Y-Achse stimmt. Aber bei der Rotation die sich an den Boden ausrichten soll, kommt Murx raus. Da ich eine Ebene fläche habe, sollten alle Rotationen 0 sein. Jedoch sind alle Spawns komplett verdreht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. Februar 2022 Melden Share Geschrieben 22. Februar 2022 Warum zum Geier steckst du einen Positionsvektor in Quaterion.FromToRotation?? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Hast du nicht gesehen und ich nicht gecodet. 😁 😅 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. Februar 2022 Melden Share Geschrieben 22. Februar 2022 Geht klar. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Noch ma ne Frage: transform.position += transform.forward * speed * Time.deltaTime; Vector3 targetDirection = (targetPoint - transform.position); Debug.DrawRay(transform.position, targetDirection, Color.green); targetRotation = Quaternion.LookRotation(targetDirection); transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime); Damit bewege ich mein Objekt. Frage ist, was mache ich bei Steigungen. Er schlittert freudig durch das Terrain aber nicht darüber. 🤨 EDIT: Gefunden, nennt sich SampleHeight! // Realignment on the terrain Vector3 pos = transform.position; pos.y = Terrain.activeTerrain.SampleHeight(transform.position); transform.position = pos; Jetzt muss ich nur noch heraus bekommen, warum er sich nicht am Terrain anpasst mit dem Code hier: private void AlignToTerrain() { RaycastHit hit; if(Physics.Raycast(new Vector3(transform.position.x, transform.position.y + 1f, transform.position.z), Vector3.down, out hit, 60f, groundLayer, QueryTriggerInteraction.Ignore)) { Quaternion targetRotation = Quaternion.FromToRotation(transform.up, hit.normal); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation * transform.rotation, Time.deltaTime * 2); Debug.LogError("Align"); } else { Debug.LogError("Ich find dich net!"); } Debug.DrawRay(new Vector3(transform.position.x, transform.position.y + 1f, transform.position.z), Vector3.down, Color.red, 60f); } Er findet ihn nicht. EDIT: Fehler gefunden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Sag mal @Sascha, die Codezeile ist gerade blöd: targetPoint = new Vector3(Random.Range(movementRandomPointRange.x, movementRandomPointRange.y), 0f, Random.Range(movementRandomPointRange.z, movementRandomPointRange.w)); Diese würde doch bedeuten das er sich immer einen Vector3 im WorldSpace sucht oder? Sprich immer von den Coordinaten 0|0|0 aus berechnen würde. Wie müsste ich das denn umschreiben, dass von der aktuellen Position aus berechnet wird? Oder muss ich da Local benutzen? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. Februar 2022 Melden Share Geschrieben 22. Februar 2022 Jetzt willste plötzlich ein Quadrat haben? 🤔 Wenn du das relativ zu einem Vektor v haben willst, musst du einfach nur v draufaddieren. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Das ist wieder ne andere Berechnung. 🙂 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Aber noch mal ne Nachfrage zu dem insideUnitCircle. Der Code sieht nun so aus: private SpawnPoint CalculateSpawnVector() { Vector2 randomPosition = Random.insideUnitCircle * Random.Range(spawnArea.x / 2, spawnArea.y / 2); Vector3 position = new Vector3(randomPosition.x, 0, randomPosition.y); RaycastHit hit; if(Physics.Raycast(position + new Vector3(0, 100.0f, 0), Vector3.down, out hit, 150.0f, terrainLayer)) { spawnPoint.position = new Vector3(position.x, hit.point.y, position.z); Quaternion slopeRotation = Quaternion.FromToRotation(transform.up, hit.normal); spawnPoint.rotation = Quaternion.Slerp(transform.rotation, slopeRotation, 1); return spawnPoint; } spawnPoint.position = new Vector3(0,0,0); spawnPoint.rotation = Quaternion.identity; return spawnPoint; } Problem ist: A: Halten sich die gespanten Objekte nicht gerade gut an den Bereich wo sie spawnen sollen. B: Spawnen sie immer da oben wie im Bild zu sehen ist. Hast du ne Ahnung warum? Mir ist bekannt das Unity ab und an etwas Probleme mit Random hat, aber das ist extrem. 😁 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. Februar 2022 Melden Share Geschrieben 22. Februar 2022 Nur so nebenbei: spawnPoint.rotation = Quaternion.Slerp(transform.rotation, slopeRotation, 1); kannst du ersetzten durch spawnPoint.rotation = slopeRotation; Slerp ist immer noch Lerp und bei lerp(a, b, 1) kommt immer b heraus. Zum eigentlichen Problem... insgesamt sieht der Code gut aus. Mir fällt nur auf, dass du ein Objekt hast, dessen Position aber nirgendwo drauf addierst. Wenn deine Objekte nicht im Umkreis um dieses Objekt herum spawnen, wundert mich das also schonmal nicht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 22. Februar 2022 Autor Melden Share Geschrieben 22. Februar 2022 Wie meinst du das mit draufaddieren? Ich dachte ich bestimme nur eine Position im Umkreis von transform.position. EDIT: Mhhh stimmt. Er hat nur den Random Vector. 🤨 Vector3 position = new Vector3(randomPosition.x, 0, randomPosition.y) + transform.position; EDIT: OK, scheint korrekt zu sein. Sie werden jetzt tatsächlich im Umkreis gespawnt wie gewollt und im passenden Radius. Damit wäre das Problem auch beseitigt. Letztes Problem ist nur die Reichweite bei dem anderen Script noch einmal. Die maximale Reichweite bei diesem Script ist 3 (movementRandomPointRange), jedoch hab ich immer mal wieder Objekte die das zichfache davon laufen, merkwürdigerweise haben sie auch alle den selben Zielpunkt: private void ChooseNewDestination() { Vector2 randomPosition = Random.insideUnitCircle.normalized * movementRandomPointRange; targetPosition = new Vector3(randomPosition.x, 0, randomPosition.y) + transform.position; RaycastHit hit; if(Physics.Raycast(targetPosition + Vector3.up * 1000f, Vector3.down, out hit, Mathf.Infinity, groundLayer, QueryTriggerInteraction.Ignore)){ targetPosition = hit.point; } //animator.SetBool("Walk", true); onDestination = false; } Eigeneartigerweise wollen sie einige immer wieder genau an diesen einen Punkt: Kaum ist der erste angekommen, will der nächste genau an diesen Punkt gelangen: Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.