Different footstep sounds problem!

Hi, i am trying to have multiple sounds for walking and running footsteps, my script worked fine with single sounds for each but when i add elements (multiple sounds) with [0] but the sounds do not play! None of them.

And i dont get any compiler errors…

#pragma strict
@script RequireComponent( AudioSource )
 
var walk : AudioClip[]; // fill this array with the sounds at the Inspector
var run : AudioClip[]; // fill this array with the sounds at the Inspector
 
var walkAudioSpeed : float = 0.4;
var runAudioSpeed : float = 0.2;
 
private var walkAudioTimer : float = 0.0;
private var runAudioTimer : float = 0.0;
 
var isWalking : boolean = false;
var isRunning : boolean = false;
 
var walkSpeed: float = 7; // regular speed
var runSpeed: float = 20; // run speed
 
private var chCtrl: CharacterController;
private var chMotor: CharacterMotor;
 
function Start()
{
    chCtrl = GetComponent(CharacterController);
    chMotor = GetComponent(CharacterMotor);
}
 
function Update()
{
    SetSpeed();
 
    if ( chCtrl.isGrounded )
    {
        PlayFootsteps();
    }
    else
    {
        walkAudioTimer = 0.0;
        runAudioTimer = 0.0;
       audio.pitch = 0.9 + 0.2*Random.value; // randomize pitch in the range 1 +/- 0.1 
    }
}
 
function SetSpeed()
{
    var speed = walkSpeed;
 
    if ( chCtrl.isGrounded && Input.GetKey("left shift") || Input.GetKey("right shift") )
    {
        speed = runSpeed;
    }
 
    chMotor.movement.maxForwardSpeed = speed;
}
 
function PlayFootsteps() 
{
    if ( Input.GetAxis( "Horizontal" ) || Input.GetAxis( "Vertical" ) )
    {
       if ( Input.GetKey( "left shift" ) || Input.GetKey( "right shift" ) )
       {
         // Running
         isWalking = false;
         isRunning = true;
       }
       else
       {
         // Walking
         isWalking = true;
         isRunning = false;
       }
    }
    else
    {
       // Stopped
       isWalking = false;
       isRunning = false;
    }
 
    // Play Audio
    if ( isWalking )
    {
       if ( audio.clip != walk )
       {
         audio.Stop();
         audio.clip = walk[0];
       }
 
       //if ( !audio.isPlaying )
       if ( walkAudioTimer > walkAudioSpeed )
       {
         audio.Stop();
         audio.Play();
         walkAudioTimer = 0.0;
       }
    }
    else if ( isRunning )
    {
       if ( audio.clip != run )
       {
         audio.Stop();
         audio.clip = run[0];
       }
 
       //if ( !audio.isPlaying )
       if ( runAudioTimer > runAudioSpeed )
       {
         audio.Stop();
         audio.Play();
         runAudioTimer = 0.0;
       }
    }
    else
    {
       audio.Stop();
    }
 
    // increment timers
    walkAudioTimer += Time.deltaTime;
    runAudioTimer += Time.deltaTime;    
}

In your code, you have

if ( audio.clip != walk )
{
   audio.Stop();
   audio.clip = walk[0];
}

...

if ( audio.clip != run )
{
   audio.Stop();
   audio.clip = run[0];
}

So, you will always play the audio[0], not the others. You need:

if ( audio.clip != walk )
{
   audio.Stop();
   audio.clip = walk[ Random.Range(0, walk.Length) ];
}

...

if ( audio.clip != run )
{
   audio.Stop();
   audio.clip = run[ Random.Range(0, run.Length) ];
}

But I am not exactly sure why it wouldn’t play at all when you have more than 1 audio clip assigned in to walk : AudioClip[].

You’re playing just the first indexed audio clip each time. You need to have some sort of method of potentially playing a different clip. Try changing these lines of code…

//...change this...
audio.clip = walk[0];


//...to this...
audio.clip = walk[Random.Range(0, walk.Length)];


//...and change this...
audio.clip = run[0];


//...to this...
audio.clip = run[Random.Range(0, run.Length)];