AudioSourceとAudioClipを使って球体射出時の効果音の実装
Unityを使って球体射出時の効果音と地面に衝突したときの効果音を実装します。
バージョン
Unity 2018.4.6f1 Personal
完成品
ブログ用
— せりる (@seriru13) August 30, 2019
効果音とタグを使った衝突判定の実装 pic.twitter.com/NP3WKshNiJ
マウスの左クリックで球体を発射し、地面に衝突すると薬莢が落ちる効果音が再生されます。
球体を射出する処理
射出する球体のプレファブを作ります。といっても sphere
オブジェクトに RIgidbody
と AudioSource
、衝突時に効果音を再生するスクリプトをアタッチしただけのひねりのないものです。
次に球体を射出するスクリプトを書いていきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class createBall : MonoBehaviour { public GameObject m_BallPrefab; AudioSource m_AudioSource; public AudioClip m_Clip; void Start() { m_AudioSource = GetComponent<AudioSource>(); } void Update() { if (Input.GetKeyDown(KeyCode.Mouse0)) { GameObject gb = Instantiate(m_BallPrefab, transform.position, transform.rotation); Rigidbody rb = gb.GetComponent<Rigidbody>(); rb.AddForce(gb.transform.right * 10.0f, ForceMode.Impulse); m_AudioSource.PlayOneShot(m_Clip); } } }
マウスの左クリックは Input.GetKeyDown(KeyCode.Mouse0)
で取得します。
入力の取得には
- Input.GetAxis
- Input.GetKey
など様々なメソッドが用意されていますが、今回はただ左クリックされたことを取得できさえすればよいので GetKeyDown
を使用します。
左クリックが押された後に、プレファブをインスタンス化して x軸正向
に力を与えています。
この際、ForceMode.ImpulseをAddForceの引数に与えているのでより強い力が瞬間的に与えられるようになっています。
さらに効果音の再生のために、音声クリップを1ループだけ再生する PlayOneShot
メソッドを使用して指定した効果音を再生します。
地面との衝突判定と効果音の再生
地面との衝突時にも効果音を再生します。今回は Collider
コンポーネントを使用して衝突を検知しました。以下にプレファブにアタッチしたスクリプトを示します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColisionDetector : MonoBehaviour { // 球のプレファブにアタッチ private AudioSource m_AS; // 自分のオーディオソース [SerializeField] private AudioClip m_Clip; // 再生する音源 private void Start() { m_AS = GetComponent<AudioSource>(); } public void OnCollisionEnter(Collision other) { if (other.gameObject.tag == "Floor") { PlayShellSE(); Destroy(this.gameObject, m_Clip.length); } } private void PlayShellSE() { m_AS.PlayOneShot(m_Clip); } }
OnCollisionEnter
は引数に Collision
コンポーネントを取り、Collider同士が衝突したときにコールバックされます。この際、相手のゲームオブジェクトが持つタグが Floor
である時に効果音を再生するように設定しました。
また、音声クリップの1ループの長さは length
から取得できるので、再生終了後オブジェクトを消えるようにしてみました。
ということでお疲れ様でした。