Jump to content
Unity Insider Forum

Position Holzylinder


Kojote

Recommended Posts

l83c9kth.jpg

jxn9ks22.jpg

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

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

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

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

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.

m7t8kla3.jpg

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

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

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:

l5bu526p.jpg

Kaum ist der erste angekommen, will der nächste genau an diesen Punkt gelangen:

yipdf92j.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...