草や土、砂地など、地面の素材のことを「マテリアル」とか「アトリビュート」と呼んだりしますが、これらに応じて足音を変えたい場合、サウンド用のミドルウェア(Wwise、CRIなど)があればお手の物ですが、ミドルウェアを導入できない場合は自前のスクリプトで制御する必要があります。
やり方は色々ありますが、Terrainのテクスチャを参照して切り替える方法を紹介します。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
[RequireComponent(typeof(AudioSource))]
public class FootStep : MonoBehaviour
{
[System.Serializable]
public class AudioClips
{
public string groundTypeTag;
public AudioClip[] audioClips;
}
// 足音の種類毎にタグ名とオーディオクリップを登録する
[SerializeField] List<AudioClips> listAudioClips = new List<AudioClips>();
// Terrain Layersと足音判定用タグの対応関係を記入する
[SerializeField] string[] terrainLayerToTag;
[SerializeField] float pitchRange = 0.1f;
// Terrain Layersのテクスチャを参照する
[SerializeField] TerrainTextureDetector terrainDetector;
private Dictionary<string, int> tagToIndex = new Dictionary<string, int>();
private int groundIndex = 0;
protected AudioSource source;
private void Awake()
{
// アタッチしたオーディオソースのうち1番目を使用する
source = GetComponents<AudioSource>()[0];
for (int i = 0; i < listAudioClips.Count(); ++i)
tagToIndex.Add(listAudioClips[i].groundTypeTag, i);
}
void Update()
{
var index = terrainDetector.GetTextureIndexAt(transform.position);
groundIndex = index;
}
public void SE_Steps()
{
// groundIndexで呼び出すオーディオクリップを変える
AudioClip[] clips = listAudioClips[groundIndex].audioClips;
source.pitch = 1.0f + Random.Range(-pitchRange, pitchRange);
source.PlayOneShot(clips[Random.Range(0, clips.Length)]);
}
}