Jump to content
Unity Insider Forum

Terrain Tree chopping - Collider baked?


3ncrypt0

Recommended Posts

Guten Morgen,

ich verwende Terrain Trees und möchte nun auch die Möglichkeit haben, Bäume zu fällen. Dazu gehe ich wie folgt vor:

Via Raycast ermittel ich erst den Baum, welcher gefällt werden soll. Dann "entferne" ich den Baum vom Terrain und setze an der selben stelle einen Baum via Prefab hin um mit diesem zu interagieren.

foreach (TreeInstance tree in terrain.terrainData.treeInstances)
        {
            Vector3 newTreePos = Vector3.Scale(tree.position, terrain.terrainData.size) + terrain.transform.position;
            float newTreeDist = Vector3.Distance(newTreePos, hit.point);

            if (newTreeDist < treeDist)
            {
                treeId = tree.prototypeIndex;
                treeDist = newTreeDist;
                treePos = newTreePos;

                var fallingTree =
                (GameObject)
                Instantiate(Terrain.activeTerrain.terrainData.treePrototypes[tree.prototypeIndex].prefab, Vector3.Scale(tree.position, terrain.terrainData.size) + Terrain.activeTerrain.transform.position,
                            Quaternion.identity);
                fallingTree.transform.localScale = new Vector3(tree.widthScale * fallingTree.transform.localScale.x,
                                                               tree.heightScale * fallingTree.transform.localScale.y,
                                                               tree.widthScale * fallingTree.transform.localScale.z);

                //GameObject dead = Instantiate(Terrain.activeTerrain.terrainData.treePrototypes[tree.prototypeIndex].prefab, Vector3.Scale(tree.position, terrain.terrainData.size) + Terrain.activeTerrain.transform.position, Quaternion.Euler(0, tree.rotation, 0)) as GameObject;
                //fallingTree.transform.localScale = new Vector3(tree.widthScale, tree.heightScale, tree.widthScale);
            }
            else
            {
                instances.Add(tree);
            }
        }

        terrain.terrainData.treeInstances = (TreeInstance[])instances.ToArray(typeof(TreeInstance));

 

Auf dem Baum den ich setze liegt ein Script, welches choppen handeln soll, also wieviel Health der Baum noch hat und wann er dann schließlich fällt.

Das Ganze funktioniert auch ganz gut, bis auf die Tatsache, dass vom Terrain Tree der Collider bestehen bleibt. Bedeutet also, dass wenn ich via Raycast auf den Baum einprügel ich natürlich auch abfrage, auf was ich einprügel. Nun ist dort ja noch der Collider vom Terrain Tree. Dann erhalte ich sehr häufig als GameObject das Terrain zurück -_-

 public void ChopTheTree()
    {
        Debug.Log("Chop it!");
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit, 2f))
        {
            Vector3 lookRot = new Vector3(hit.point.x, transform.position.y, hit.point.z);
            transform.LookAt(lookRot);

            Debug.Log(hit.transform.gameObject.name);
            if(hit.transform.gameObject.GetComponent<TreeChop>() != null)
                hit.transform.gameObject.GetComponent<TreeChop>().TreeChopping();
        }
    }

Werden die Collider der Terrain Trees irgendwo gebaked? Wenn ich mal den Baum wirklich erwische und ich ihn zu Fall bringe und dieser dann auch destroyed wird, dann laufe ich trotzdem noch gegen den Collider vom Terrain Tree.

 

VG,

Jochen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey,

ich habe hier eine Lösung gefunden. Die Terrain Tree Collider werden tatsächlich gebaked, weshalb diese auch nach dem entfernen einen Terrain Trees bestehen bleiben. Ist natürlich etwas uncool wenn man durch die Map rennt und auf einmal gegen einen eigentlich nicht mehr sichtbaren Baum knallt.

Einen Lösungsvorschlag habe ich hier gefunden:

https://answers.unity.com/questions/685405/mass-place-trees-tagging.html

Die Terrain Tree werden ohne Terrain Tree Collider gesetzt. Ein Capsule Objekt mit einem Collider wird immer an die nächste Position des nächsten Terrain Trees gesetzt. Nach ein paar Anpassungen funktioniert es sehr gut.

 

VG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moinsen
Genau wegen dem ganzen Terrain Collider driss hab ich mein eigenes Worldgen geschrieben.
Für den Anfang ist es ja ganz cool mit dem Terraintool Bäume/Pflanzen zusetzen aber später sollte man wirklich was eigenes basteln oder halt auf die alte art per Hand jeden einzeln setzen, dadurch kann man viel mehr ins Detail gehen.

Aber jedem das seine ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Servus,

@Tarantel Aber haben TerrainTrees nicht auch noch einen Performance Vorteil? Wenn ich es aussuchen könnte, würde ich auch lieber die Prefabs setzen. Vor allem hat man dort deutlich mehr Möglichkeiten.

Seit vorhin stört es mich, dass wenn ich ein Terrain Tree durch ein Prefab ersetzen will wenn ich diesen fällen möchte, dass die Scene für 1-2 Sekunden einfriert, da er durch alle Terrain Trees in einer Schleife läuft um den passenden rauszusuchen. Interessanterweise hat er das vorher nicht gemacht -_-

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb 3ncrypt0:

Servus,

@Tarantel Aber haben TerrainTrees nicht auch noch einen Performance Vorteil? Wenn ich es aussuchen könnte, würde ich auch lieber die Prefabs setzen. Vor allem hat man dort deutlich mehr Möglichkeiten.

Seit vorhin stört es mich, dass wenn ich ein Terrain Tree durch ein Prefab ersetzen will wenn ich diesen fällen möchte, dass die Scene für 1-2 Sekunden einfriert, da er durch alle Terrain Trees in einer Schleife läuft um den passenden rauszusuchen. Interessanterweise hat er das vorher nicht gemacht -_-

 

 

Renderst du beim Player die ganze Szene oder nur das Sichtfeld der Kamera ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 5.11.2018 um 18:13 schrieb 3ncrypt0:

Servus,

@Tarantel Aber haben TerrainTrees nicht auch noch einen Performance Vorteil? Wenn ich es aussuchen könnte, würde ich auch lieber die Prefabs setzen. Vor allem hat man dort deutlich mehr Möglichkeiten.

Seit vorhin stört es mich, dass wenn ich ein Terrain Tree durch ein Prefab ersetzen will wenn ich diesen fällen möchte, dass die Scene für 1-2 Sekunden einfriert, da er durch alle Terrain Trees in einer Schleife läuft um den passenden rauszusuchen. Interessanterweise hat er das vorher nicht gemacht -_-

 

 

Einfach die Prefabs vorladen und nicht immer instantiate benutzen oder so. Falls das trotzdem sehr high Poly ist, kann das natürlich beim Aktivieren trotzdem einfrieren.
Ich meine aber, dass das einfrieren von der Prefab-Speichergröße oder Model-Speichergröße auch kommt.

Tarantel muss ich da zu geben. Ich hab mal auch an sowas rangemacht und selbst Platzierte waren mir lieber, weil damit echt vieles erleichtert wird. Nur das Platzieren ist natürlich nervig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...