Checking for the name of a tree being chopped from a terrain

Hey there guys! I have a quandry. I have a project which allows the player to chop a tree from the terrain, and in turn when the tree is “dead” it instantiates a chopped tree model in it’s place, which falls to the gorund.

My question is this. We have multiple tree models in the game of course, and only one chopped tree model currently. So the same chopped model gets spawned for all trees, which does not fit all of the tree models.

What I’m looking to do is check for the actual name of the tree object being chopped, and then we’ll do an if statement that would say if hitTree == palmTree, instance the palm tree prefab instead of a general prefab.

What I’m not sure of how to do is check for the name of the tree being hit. Here is the script we have going (bolt networked)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[BoltGlobalBehaviour]
public class treeCallbacks : Bolt.GlobalEventListener
{
    private List<TreeInstance> TreeInstances;
    Terrain kappa;
    GameObject keepo;
    public int[] deadTrees = new int[100];
    int timer = 0;
    public override void OnEvent(treeRespawn evnt)
    {
        //ADD check location for Bolt tree
        List<TreeInstance> trees = new List<TreeInstance>(kappa.terrainData.treeInstances);
        TreeInstance PogChamp;
        //trees[evnt.ID] = new TreeInstance();
        PogChamp = trees[evnt.ID];
        //PogChamp.position = Vector3.Scale(PogChamp.position, kappa.terrainData.size) + kappa.transform.position;
        PogChamp.position.y += 0.1f;
        trees[evnt.ID] = PogChamp;
        //trees.RemoveAt(this);
        kappa.terrainData.treeInstances = trees.ToArray();
        /*
        List<TreeInstance> trees = new List<TreeInstance>(kappa.terrainData.treeInstances);
        TreeInstance PogChamp;
        //trees[evnt.ID] = new TreeInstance();
        Debug.Log(trees[evnt.ID].position.y);
        PogChamp = trees[evnt.ID];
        Debug.Log(PogChamp.position.y);
        PogChamp.position.y += 100;
        Debug.Log(PogChamp.position.y);
        trees[evnt.ID] = PogChamp;
        //trees.RemoveAt(this);
        kappa.terrainData.treeInstances = trees.ToArray();
        */
        //TreeInstance treeInstance = terrain.terrainData.treeInstances[i];
        GameObject capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        CapsuleCollider capsuleCollider = capsule.GetComponent<Collider>() as CapsuleCollider;
        capsuleCollider.center = new Vector3(0, 5, 0);
        capsuleCollider.height = 10;
        DestroyableTree tree = capsule.AddComponent<DestroyableTree>();
        tree.terrainIndex = evnt.ID;
        capsule.transform.position = Vector3.Scale(trees[evnt.ID].position, kappa.terrainData.size) + kappa.transform.position;
        capsule.tag = "Tree";
        capsule.transform.parent = kappa.transform;
        capsule.GetComponent<Renderer>().enabled = false;
        if (BoltNetwork.isServer)
            deadTrees[evnt.ID] = -1;
    }
    public override void OnEvent(treeRemove evnt)
    {
        bool okToSend = true;
        if (okToSend)
        {
            List<TreeInstance> trees = new List<TreeInstance>(kappa.terrainData.treeInstances);
            TreeInstance PogChamp;
            //trees[evnt.ID] = new TreeInstance();
            PogChamp = trees[evnt.ID];
            PogChamp.position.y -= 0.1f;
            trees[evnt.ID] = PogChamp;
            //trees.RemoveAt(this);
            kappa.terrainData.treeInstances = trees.ToArray();
            if (BoltNetwork.isServer)
                for (var i = 0; i < deadTrees.Length; i += 1)
                {
                    if (deadTrees[i] == -1)
                    {
                        deadTrees[i] = evnt.ID;
                        break;
                    }
                }
            //BoltNetwork.Instantiate(evnt.pid, evnt.pos, evnt.rot);
            //int k = evnt.ID;
            //kappa.terrainData.treeInstances[evnt.ID].
            //TreeInstances = new List<TreeInstance>(Terrain.activeTerrain.terrainData.treeInstances);
            //TreeInstances.RemoveAt(evnt.ID);
            //kappa.terrainData.treeInstances = TreeInstances.ToArray();
            //kappa.terrainData.treeInstances[evnt.ID] =  new TreeInstance();
            // Now refresh the terrain, getting rid of the darn collider
            //float[,] heights = kappa.terrainData.GetHeights(0, 0, 0, 0);
            //kappa.terrainData.SetHeights(0, 0, heights);
        }
    }
    public override void OnEvent(resourceRemove evnt)
    {
        bool okToSend = true;
        if (okToSend)
        {
            keepo.transform.GetChild(evnt.number).gameObject.active = false;
            //spawn ore on server
            if (BoltNetwork.isServer)
                BoltNetwork.Instantiate(BoltPrefabs.RockBolt, keepo.transform.GetChild(evnt.number).position, keepo.transform.GetChild(evnt.number).rotation);
        }
    }
    public void Update()
    {
        //server respawn tree every x seconds
        if (BoltNetwork.isServer)
            if (timer == 5000)
            {
                int k = -1;
                for (var i = 0; i < deadTrees.Length; i += 1)
                {
                    if (deadTrees[i] != -1)
                    {
                        k = deadTrees[i];
                        deadTrees[i] = -1;
                        break;
                    }
                }
                if (k != -1)
                    using (var evnt = treeRespawn.Raise(Bolt.GlobalTargets.Everyone))
                    {
                        evnt.ID = k;
                    }
                timer = 0;
            }
            else timer++;
        if (kappa == null)
            kappa = GameObject.Find("Terrain").GetComponent<Terrain>();
        if (keepo == null)
            keepo = GameObject.Find("ORES");
    }
    public void Start()
    {
        //if (BoltNetwork.isServer)
        for (var i = 0; i < deadTrees.Length; i += 1)
            deadTrees[i] = -1;
    }
}

Trees have names? oO

scnr :smile:

the prefab of the tree has a name, yes.

Couldn’t you just have a reference to the prefab of the dead tree model in your TreeInstance class? That way, when a tree gets chopped, the script just spawns an instance thereof.

could you not check the tag that is applied to the object? then spawn an instance of your dead tree prefab for that tag

Terrain objects contain TreePrototypes.
These are the tree prefabs references in that terrain tiles inspector
Each TreeInstance has a prototypeIndex. This is a reference to one of the TreePrototypes.
Each TreePrototype points to a prefab