How can i call this void once

Hey so im trying to do so when a enemy come within a defend radius it will call my DoDefend() but because its under update it will call it all the time instead of once how can i do that? my script is simple

if (currentTargetDistance < _defendRadius)
        {
            DoDefend();
        }

There are two ways you can do this that I can think of from top of my head.

Method 1

You can use bool or enums to keep track of the state. Enums are cleaner way to do this but for simplicity sake I’ll use bool instead.

private bool _isDefending = false;

void Update(){
	
	if(currentTargetDistance < _defendRadius){
		
		if(!_isDefending){
			
			DoDefend();
			_isDefending = true;
		}
	}else{		
		_isDefending = false;
	}	
}

Method 2

This methods involves using of colliders. Add a sphere collider on the same object as the script with the DoDefend() function and set it to trigger. Within that script, add the function OnTriggerEnter(Collider collider). It’s a built-in method which fire up when something enters the collider and it’s only fired once and won’t be triggered by the same game object until it leaves the collider.

OnTriggerEnter Link

Then add the function OnTriggerExit(Collider collider) which is only a built-in method which works the same way as OnTriggerEnter(Collider collider) but this one triggers when something leaves the collider instead.

OnTriggerExit Link

For this to work, the game objects must have rigidbody attached to them.

private bool _isDefending = false;

public void Update()
{
    if(!_isDefending && currentTargetDistance < _defendRadius) 
    {
        _isDefending = true;
        DoDefend();
    }
}

The most straightforward way would be to use a bool to keep a track of its state like this.