Changing mesh filter component of prefab when other object stops overlapping

I am trying to create a VR game, where one part of the game consists of the player digging the soil to create a hole

I have created a dirt mound prefab, and in order to simulate the dirt getting reduced after the player digs it, I am currenlty thinking of doing this:

  • When the collider of the spade
    overlaps with the dirt mound, do
    nothing, i.e. the spade should be
    able to pass through the dir mound
  • When the collider of the spade stops
    overlapping with the dirt mound,
    change the mesh of the dirt mound to
    a model of the dirt mound that is
    reduced.

Currently, the mesh collider of the dirt mound is set as Convex = true, isTrigger = true

This is the code I have so far for the dirt mound

    public class Soil : MonoBehaviour {
        public Mesh hole_50;
        public Mesh hole_100;
        private float digging_state = 0;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    void OnTriggerEnter(Collider other)
    {
         // Do nothing
    }

    void OnTriggerExit(Collider other)
    {
        if (digging_state == 0f)
        {
            this.gameObject.GetComponent<MeshFilter>().mesh = hole_50;
            digging_state += 0.5f;
            Debug.Log("Digging state from 0 to " + digging_state);
        }

        
        if (digging_state == 0.5f)
        {
            this.gameObject.GetComponent<MeshFilter>().mesh = hole_100;
            digging_state += 0.5f;
            Debug.Log("Digging state from 0.5 to " + digging_state);
        }
    }
}

Basically, I have 2 Mesh variables that keep track of the different meshes to load when the state of the dirt mound changes.

  • For state = 0, it means that the dirt mound is not dug yet

  • For state = 0.5, it means that the dirt mound is slightly dug

  • For state = 1.0, it means that the dirt mound is completely dug and there is a hole in it

Here is an image with the dirt mounds of different states
177925-dirt.png

For some reason, when I test the code out, the moment the spade even touches the dirt mound, the dirt mound jumps to the last state with the hole in it, and I can’t figure out why.

Is there any better way to simulate digging soil?

digging_state will go from 0 to 1.0 the first time in OnTriggerExit().

When 0 you add 0.5, then if 0.5 it will become 1.0 because of:

if (digging_state == 0.5f)