テレインレイヤーによって足音を変えてみました。前の記事の方法でアルファマップを取得して、一番割合の多いテレインレイヤーを調べます。
float[] slatmap = new float[0];
// ---
// FixedUpdate()
RaycastHit hitInfo;
if( /* Physics.SphereCast... */)
{
string hitColliderTag = hitInfo.collider.tag;
if (hitColliderTag == "Road")
{
footstepSounds = m_FootstepSounds_road;
m_AudioSource.volume = 0.8f;
}
else if (hitColliderTag == "Terrain")
{
// テレインデータ
TerrainData terrainData = hitInfo.collider.gameObject.GetComponent<Terrain>().terrainData;
// アルファマップ
float[,,] alphaMaps = terrainData.GetAlphamaps(Mathf.FloorToInt(hitInfo.textureCoord.x * terrainData.alphamapWidth), Mathf.FloorToInt(hitInfo.textureCoord.y * terrainData.alphamapHeight), 1, 1);
int layerCount = terrainData.alphamapLayers; // テレインレイヤーの数
// 三番目の配列を取り出す
if(slatmap.Length == 0) slatmap = new float[layerCount];
for (int i = 0; i < layerCount; i++)
{
slatmap[i] = alphaMaps[0, 0, i];
}
// 最大値のインデックス
int maxIndex = Array.IndexOf(slatmap, Mathf.Max(slatmap));
// 足音を変える
switch (maxIndex)
{
case 0:
footstepSounds = m_FootstepSounds_softGround;
m_AudioSource.volume = audioVolume; // デフォルトのボリューム
break;
case 1:
case 3:
footstepSounds = m_FootstepSounds_gravel;
m_AudioSource.volume = 0.9f;
break;
case 2:
footstepSounds = m_FootstepSounds_soil;
m_AudioSource.volume = 0.55f;
break;
default:
footstepSounds = m_FootstepSounds_road;
m_AudioSource.volume = 0.8f;
break;
}
}else
{
footstepSounds = m_FootstepSounds;
m_AudioSource.volume = audioVolume; // デフォルトのボリューム
}
}
FirstPersonControllerのFixedUpdateメソッドで地面にレイを飛ばした後に、タグによって足音を変えています。その時にテレインのときは、アルファマップを取得して、三番目の配列の一番値の大きい要素のインデックスから、どの足音を鳴らすか決めます。
足音は前にフリーの足音素材からいくつかの一発ずつの音声に切り取ったものを、道路や砂利などの種類ごとに別の配列に入れておきます。
そしてPlayFootStepAudioメソッドで使う元々ある配列を、新しく作ったものに置き換えておいて、足音を変えるときは、その配列の中身を入れ替えるようにしています。
// 足音を変える
footstepSounds = m_FootstepSounds_road;
// ---
// PlayFootStepAudio()
m_AudioSource.clip = footstepSounds[n]; // m_FootstepSounds[n]
PlayFootStepAudioメソッドでは、AudioClipの配列の中から連続しないようにランダムに音声クリップが選ばれるようになっています。
これでテレインレイヤーによって足音を変えることができました。