seriruの技術屋ブログ

競技プログラミングやゲーム開発など技術に関することを発信します

AudioSourceとAudioClipを使って球体射出時の効果音の実装

Unityを使って球体射出時の効果音と地面に衝突したときの効果音を実装します。

バージョン

Unity 2018.4.6f1 Personal

完成品

マウスの左クリックで球体を発射し、地面に衝突すると薬莢が落ちる効果音が再生されます。

球体を射出する処理

射出する球体のプレファブを作ります。といっても sphere オブジェクトに RIgidbodyAudioSource、衝突時に効果音を再生するスクリプトをアタッチしただけのひねりのないものです。

f:id:ryo_seriru:20190830114051p:plain

f:id:ryo_seriru:20190830114054p:plain

次に球体を射出するスクリプトを書いていきます。

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 から取得できるので、再生終了後オブジェクトを消えるようにしてみました。


ということでお疲れ様でした。