Play sound once on collision

The question was asked many times. The problem is: when running this code (attached to CharacterController)

var snd : AudioClip;
var played : boolean;

function OnControllerColliderHit(hit : ControllerColliderHit)
{

    if(!played)
    {
        audio.PlayOneShot(snd);
        played = true;
    }
}

→ you’re able to play collision sound just once. What if I collide again? No sound will be played (need to reset played flag). I tried OnCollisionExit() to reset the flag (played = false) but it doesn’t work for CharacterController. Another possible solution - reset played flag depending on time:

function Update()
{
    timeUntilNextPlayback += Time.deltaTme;
    if(timeUntilNextPlayback > SOME_AMMOUNT_OF_TIME)
      played = false;
}

→ but it’s not the best possible solution.
Does anyone no way to acomplish this task OR check when collision exits with my CharacterController? (I must not Destroy() any object)

If you want to play it just once on collision, you could use trigger collision.

AudioClip snd;
bool played;

vois Start(){
   played = false;
}
void OnTriggerEnter(Collider col) {
   if(played == false){
      audio.PlayOneShot(snd);
      played = true;
   }
}

void OnTriggerExit(Collider col){
   played = false;
}

Maybe we can compare current hit point and previous one. If they equal => play nothing. But still not the best sollution.

#pragma strict
var snd : AudioClip;
var played : boolean;
var hitPoint : Vector3;


function OnControllerColliderHit(hit : ControllerColliderHit)
{
    if(CompareVector3(hitPoint, hit.point))
	    played = false;
	if(!played) 	
	{
	    audio.PlayOneShot(snd);
	    played = true;
	}
    hitPoint=hit.point;
}

function CompareVector3(vecOne : Vector3, vecTwo : Vector3) : boolean
{
	return Mathf.Approximately(vecOne.x, vecTwo.x) && Mathf.Approximately(vecOne.y, vecTwo.y) && Mathf.Approximately(vecOne.z, vecTwo.z);
}