WASDのいずれかが押されている間、途切れてはならない
これ↓
実はこれだけの実装にかなり時間を費やしました。そもそもAudioSourceとかClipとかよくわかんないという状態で・・・・。
WASDを押したタイミングと離したタイミングで音の再生を制御すればいいことはわかったけど、
・途中でWASDの押すキーの数を増やすと足音が最初から流れる
・途中でWASDの押すキーの数を減らすと(2個→1個)足音が途切れる
みたいな不完全さが目立ちました。
というわけで、さっそくそれらを解決したコードの方を紹介します。
playermove.cs
using UnityEngine;
public class playermove : MonoBehaviour
{
public float moveSpeed;//スピード
AudioSource audioSource;//オーディオソース
public AudioClip footstep;//流したい音の設定
private bool isRunning;
void Start()
{
audioSource = GetComponent<AudioSource>();
isRunning = false;
}
void Update()
{
//ここで足音をいつとめるかを制御する
if (!Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.D))
{
if (!isRunning)
{
audioSource.Stop();
isRunning = true;
}
}
//以下はWASD操作
if (Input.GetKey(KeyCode.W))
{
transform.position += transform.forward * moveSpeed;
if (isRunning)
{
audioSource.Play();
}
isRunning = false;
}
if (Input.GetKey(KeyCode.A))
{
transform.position += transform.right * -1 * moveSpeed;
if (isRunning)
{
audioSource.Play();
}
isRunning = false;
}
if (Input.GetKey(KeyCode.S))
{
transform.position += transform.forward * -1 * moveSpeed;
if (isRunning)
{
audioSource.Play();
}
isRunning = false;
}
if (Input.GetKey(KeyCode.D))
{
transform.position += transform.right * moveSpeed;
if (isRunning)
{
audioSource.Play();
}
isRunning = false;
}
}
}
ここで注目していただきたいのは
playermove.cs
if (!Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.D))
{
if (!isRunning)
{
audioSource.Stop();
isRunning = true;
}
}
の部分です。要は、すべてのキーが押されていない状態でないと音の再生を止められないという処理です。つまり、何らかのWASDキーが押されてさえいれば音を流し続けられるよという意味ですね。
まとめ
こんなに初歩的なことを記事にするつもりは無かったのですが、実は教え子にUnityを教えているときにこの内容を即答できなかったことをかなり悔やんでいるので、記事にすることで感情を浄化させようと思いました。閲覧していただきありがとうございます。