
オーディオ
Tutorial
Beginner
+0XP
30 mins
(103)
Unity Technologies

これで、魅力的なオーディオを使ってゲームの仕上げをする準備が整いました。
このチュートリアルでは、以下の作業を行います。
- ゲーム内で使用できる様々な種類のオーディオを探る
- サウンドトラックとオーディオエフェクトの範囲を追加する
- ゲーム内のオーディオの使用を制御するためのスクリプトを書く
このチュートリアルを終えれば、ゲームは完成し、ビルドを作成する準備が整います!
1. オーディオ
これでレベルが敵でいっぱいになり、JohnLemon の脱出が困難になりましたが、ゲームをテストしたところ少し静かでした。このチュートリアルでは、ゲームの雰囲気を高めるために、さまざまな不気味なオーディオを使用して仕上げを加えます。
2 種類のオーディオをこのチュートリアルの中で使用します。
- Non-diegetic サウンド(物語世界外の音):識別可能な音源を持たない(例えば、サウンドトラックなど)
- Diegetic サウンド(物語世界の音):識別可能な音源を持つ(例えば、銃の発砲音など)
まずはゲームに non-diegetic オーディオを追加することから始めましょう!
2. Unity のオーディオ機能の基本
ゲームにオーディオを追加する前に、Unity でオーディオがどのように機能するかを簡単に触れてみましょう。オーディオには、主に 3 つのパート(オーディオクリップ、オーディオソース、オーディオリスナー)があります。
- オーディオクリップは、特定のサウンドに固有のすべてのデータを含む MP3 などのアセットです。
- オーディオソースとは、ゲームの世界で音源となるコンポーネントのことです。ゲームで音を出すものは、ほとんどがオーディオソースコンポーネントを必要です。そのため、音に場所を設定できます。
- オーディオリスナーは、シーン内の単一のコンポーネントで、プレイヤーの耳のように機能します(カメラコンポーネントがプレイヤーの目のように機能するのと同じように)。デフォルトでは、オーディオリスナーコンポーネントはメインカメラにあります。
これらの異なる部分は、通常、次のように連携して動作します:オーディオソースはオーディオクリップを再生し、オーディオリスナーがオーディオソースに十分に近い場合は、音が聞こえます。
特定のオーディオソースの spatial blend は、ゲーム世界の特定のポイントから来るように聞こえるか、またはソースとオーディオリスナーの距離に関係なく同じように聞こえるかどうかを決定します。
non-diegetic(物語世界外)のオーディオから始めているのですね。この音には音源がないので、spatial blend は 2D に設定されています。spatial blend が単に 2D に設定されている場合、オーディオソースとオーディオリスナーの距離は音量に影響しません。Stereo Pan 設定を使っても左右にパンできるため、2D と呼ばれます。オーディオソースの spatial blend が単に 3D に設定されている場合、音量はオーディオリスナーとの距離によって変化します。2D と 3D の間の値は、この効果の強さを変化させます。
3. Non-Diegetic オーディオとは?
Non-diegetic オーディオ(ソースを特定できないオーディオ)は、ゲームとプレイヤーの体験に大きな影響を与えます。あなたがプレイしたことのあるゲームと、そのゲームがこれらの音をどのように使って独特の雰囲気を作り出しているかについて考えてください ー どんな気持ちになりますか?その中でも特に効果的なのは何でしょうか?
ゲームに以下の 3 つの non-diegetic サウンドを追加します。
- アンビエントトラック:ループさせてお化け屋敷にゴーストが出そうな不気味な雰囲気を出す
- サウンドエフェクト:JohnLemon が捕まったときに再生される効果音
- サウンドエフェクト:JohnLemon が脱出したときに再生される効果音
4. ゲームのオーディオソースを作成する
まず、ゲーム用のオーディオソースを作成します。
1. Hierarchy ウィンドウで、Create メニューをクリックして Create Empty を選択します。GameObject の名前を「Ambient」に変更します。
2. Inspector で、Ambient の位置を(0, 0, 0)に設定します。
どこにいてもオーディオの音量は同じになるので、ゲームオブジェクトの位置は技術的に見て重要ではありません。しかし、後になってからのことを考えて、ゲームオブジェクトを位置的に整理しておくと便利です。
3. 次に、Audio Source コンポーネントを追加する必要があります。通常は Add コンポーネントボタンで行いますが、オーディオクリップも割り当てたい場合はショートカットを使用できます。
Project ウィンドウで、Assets > Audio の順に進みます。Project ウィンドウから、SFXHouseAmbience オーディオクリップを Inspector ウィンドウにドラッグすると、Audio Source コンポーネントが作成され、自動的に AudioClip として割り当てられます。
4. Spatial Blend プロパティはすでに完全に 2D に設定されているので、変更する必要はありません。Play On Awake もデフォルトで有効になっています。つまり、レベルの再生を開始するとすぐにオーディオの再生が始まるということです。
5. ただし、デフォルトでは 1 回のランスルーで停止します。Loop チェックボックスを有効にすると、ゲームのアンビエントトラックをループさせることができます。
6. 今、お化け屋敷には不気味な背景音が聞こえます!再生モードに入り、オーディオが正常に再生されることをテストします。
7. オーディオは聞こえるはずですが、このチュートリアルで追加する他のサウンドと比較すると少しうるさいです。再生モードを終了して、これを調整することができます。
8. Inspector で、Audio Source コンポーネントの Volume プロパティを 0.5 に変更します。
5. オーディオソースの複製
この作業を 2 つのゲーム終了の効果音のために繰り返すよりも、効率的にゲームオブジェクトを複製してから、適宜設定を変更してみましょう。
1. Hierarchy ウィンドウで、Ambient ゲームオブジェクトを選択します。Ctrl + D(Windows)または CMD + D on(macOS)のショートカットで 2 回複製します。最初のコピーの名前を「Escape」に、2 番目のコピーの名前を「Caught」に変更します。
2. これら 2 つのサウンドエフェクトの違いは、使用する AudioClip だけで、設定は全く同じです。
Hierarchy ウィンドウで、Ctrl(Windows)または CMD(macOS)を押し、 Escape と Caught のゲームオブジェクトをクリックします。これにより、両方一緒に編集することができます。
3. これらのノイズは、すぐに再生したり、ループしたりしてはいけません。また、ゲーム内の他の音にかぶって聞こえる必要があるので、アンビエントオーディオよりも大きな音でなければなりません。
Escape と Caught ゲームオブジェクトの両方を選択した場合:
- Play On Awake チェックボックスを無効にする
- Loop チェックボックスを無効にする
Volume (音量)の値を 1 に設定する
共通設定を調整したので、それぞれに AudioClip を設定することができます。
4. Escape ゲームオブジェクトを選択し、その Audio Source コンポーネントの AudioClip を Project ウィンドウからドラッグするか、または円い選択ボタンを使用して SFXWin に設定します。
5. Caught ゲームオブジェクトを選択し、その Audio Source コンポーネントの AudioClip を Project ウィンドウからドラッグするか、または円い選択ボタンを使用して SFXGameOver に設定します。
これで、non-diegetic オーディオソースを設定しましたが、Escape と Caught のサウンドを実装する前に、単一の親の下でオーディオソースを整頓しましょう。
6. オーディオソースの整理
オーディオソースを整理するには、以下の手順に従ってください。
1. Hierarchy ウィンドウで、空のゲームオブジェクトを作成します。その名前を「Audio」に変更します。
2. Hierarchy ウィンドウで、Ctrl(Windows)またはCMD(macOS)を押しながら、Ambient、Escape、Caught のゲームオブジェクトを選択し、それぞれをクリックします。
3. 選択したゲームオブジェクトを Audio ゲームオブジェクトの上にドラッグして親にします。
7. GameEnding スクリプトに戻る
これで片付けが完了したので、GameEnding スクリプトにゲームエンディングサウンドを実装していきましょう。
Project ウィンドウで、 Assets > Scripts フォルダーの順に開き、GameEnding スクリプトをダブルクリックし編集用のスクリプトを開きます。
最後に GameEnding スクリプトを完成させたときは、以下のような感じでした。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public float displayImageDuration = 1f;
public GameObject player;
public CanvasGroup exitBackgroundImageCanvasGroup;
public CanvasGroup caughtBackgroundImageCanvasGroup;
bool m_IsPlayerAtExit;
bool m_IsPlayerCaught;
float m_Timer;
void OnTriggerEnter (Collider other)
{
if (other.gameObject == player)
{
m_IsPlayerAtExit = true;
}
}
public void CaughtPlayer ()
{
m_IsPlayerCaught = true;
}
void Update ()
{
if (m_IsPlayerAtExit)
{
EndLevel (exitBackgroundImageCanvasGroup, false);
}
else if (m_IsPlayerCaught)
{
EndLevel (caughtBackgroundImageCanvasGroup, true);
}
}
void EndLevel (CanvasGroup imageCanvasGroup, bool doRestart)
{
m_Timer += Time.deltaTime;
imageCanvasGroup.alpha = m_Timer / fadeDuration;
if (m_Timer > fadeDuration + displayImageDuration)
{
if (doRestart)
{
SceneManager.LoadScene (0);
}
else
{
Application.Quit ();
}
}
}
}
8. GameEnding スクリプトを更新し、オーディオを再生する
EndLevel メソッドが呼ばれたときにオーディオソースを再生する機能を追加する必要があります。再生可能なオーディオソースは 2 つありますので、それぞれへの参照が必要になります。重要:EndLevel メソッドは Update のフレームごとに呼び出されます。オーディオソースを再生し続けるのは嫌ですよね。では、最初に再生した後に止める方法が必要になります。
オーディオソースの参照を追加することから始めましょう。
1. exitBackgroundImageCanvasGroup 変数宣言の下に、以下のコードを追加します。
public AudioSource exitAudio;2. caughtBackgroundImageCanvasGroup 変数宣言の下に、以下を追加します。
public AudioSource caughtAudio;3. 次に、変数を作成して、オーディオが 1 回だけ再生されるようにする必要があります。bool 変数はデフォルトでは false になっており、オーディオを再生したい場合は false をチェックして再生し、再生後は true に設定することができます。
m_Timer 変数宣言の下に、以下を追加します。
bool m_HasAudioPlayed;
9. 新しい変数が機能するようにメソッドを調整する
では、これらの新しい変数を使ってみましょう。
1. JohnLemon が捕まったか逃亡したかによって、ゲームは異なるオーディオソースを再生するので、EndLevel メソッドに別のパラメータを追加する必要があります。EndLevel メソッドのシグネチャを以下のように変更します。
void EndLevel (CanvasGroup imageCanvasGroup, bool doRestart, AudioSource audioSource)2. EndLevel への呼び出しに正しいパラメーターが渡されなくなり、AudioSource も必要になりました。最初の EndLevel メソッドの呼び出しを以下のように変更します。
EndLevel (exitBackgroundImageCanvasGroup, false, exitAudio);3. 2 回目の EndLevel メソッドの呼び出しを以下のように変更します。
EndLevel (caughtBackgroundImageCanvasGroup, true, caughtAudio);メソッドの呼び出しは再び正しくなりましたが、現在のところ EndLevel メソッドは新しいパラメーターで何もしません。
10. オーディオが 1 度だけ再生されることを確認する
タイマーの長さに関係なく、オーディオは再生されなければならないので、EndLevel メソッドの先頭にオーディオコードを置くことは理にかなっています。また、オーディオはまだ再生されていない場合にのみ再生されるようにしたいので、それを確認するために if 文の中に入れる必要があります。
1. EndLevel メソッドの先頭に以下を追加します。
if(!m_HasAudioPlayed)
{
}感嘆符は、その右側にあるものはすべて否定することを意味します。つまり、if 文の中のコードは、オーディオが再生されていない場合にのみ実行されるということです。
2. この if 文の中で最初に行う必要があることは、オーディオを再生することです。オーディオソースに割り当てられたオーディオクリップを再生するには、以下のようにオーディオソースの Play メソッドを呼び出します。
audioSource.Play();3. オーディオを 1 回だけ再生したいので、ここで m_HasAudioPlayed の値を true に設定する必要があります。これは、if 文のコードが再び呼び出されないことを意味します。Play メソッドの呼び出しの下にある if 文の中に、以下のように追加します。
m_HasAudioPlayed = true;4. これで GameEnding のスクリプトの編集が終わりました。こんな感じになるはずです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public float displayImageDuration = 1f;
public GameObject player;
public CanvasGroup exitBackgroundImageCanvasGroup;
public AudioSource exitAudio;
public CanvasGroup caughtBackgroundImageCanvasGroup;
public AudioSource caughtAudio;
bool m_IsPlayerAtExit;
bool m_IsPlayerCaught;
float m_Timer;
bool m_HasAudioPlayed;
void OnTriggerEnter (Collider other)
{
if (other.gameObject == player)
{
m_IsPlayerAtExit = true;
}
}
public void CaughtPlayer ()
{
m_IsPlayerCaught = true;
}
void Update ()
{
if (m_IsPlayerAtExit)
{
EndLevel (exitBackgroundImageCanvasGroup, false, exitAudio);
}
else if (m_IsPlayerCaught)
{
EndLevel (caughtBackgroundImageCanvasGroup, true, caughtAudio);
}
}
void EndLevel (CanvasGroup imageCanvasGroup, bool doRestart, AudioSource audioSource)
{
if (!m_HasAudioPlayed)
{
audioSource.Play();
m_HasAudioPlayed = true;
}
m_Timer += Time.deltaTime;
imageCanvasGroup.alpha = m_Timer / fadeDuration;
if (m_Timer > fadeDuration + displayImageDuration)
{
if (doRestart)
{
SceneManager.LoadScene (0);
}
else
{
Application.Quit ();
}
}
}
}
5. スクリプトを保存して Unity に戻ります。
6. 最後のステップは、GameEnding スクリプトに追加した参照を設定することです。Hierarchy ウィンドウで、 GameEnding ゲームオブジェクトを選択します。
7. Inspector で、丸い選択ボタンを使用して、 Exit Audio フィールドを Escape に、Caught Audio フィールドを Caught に設定します。
それだけです。non-diegetic オーディオが完成しました!
11. 足音をオーディオに追加する
次に、ソースを特定することができるオーディオを実装する必要があります。まずは足音から始めましょう。
1. Hierarchy ウィンドウで、JohnLemon のゲームオブジェクトを選択します。
2. Inspector で、AudioSource コンポーネントを追加します。
3. 丸い選択ボタンを使用して、AudioClip プロパティを SFXFootstepsLooping に設定します。
4. これは diegetic サウンド(物語世界内の音)であるにもかかわらず、JohnLemon の動きに合わせて音量が変化しないように、完全に 2D の Spatial Blend を使用する必要があります。デフォルトの設定でも問題ありません。
5. JohnLemon が静止してシーンが始まるとすぐにオーディオが再生されないようしてください。Play On Awake チェックボックスを Disable(無効)にします。
6. 停止を指示するまでサウンドを再生し続けたいので、ループさせる必要があります。Loop チェックボックスを Enable(有効)にします。
前と同じように、今はスクリプトを編集する必要があるので、いつでもオーディオを再生できるようになっています。
12. PlayerMovement スクリプトに戻る
足音の音声を有効にするには、PlayerMovement スクリプトを編集します。PlayerMovement コンポーネントの Script プロパティをダブルクリックして、編集用の PlayerMovement スクリプトを開きます。
最後に PlayerMovement スクリプトを完成させたときは、以下のようになっていました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float turnSpeed = 20f;
Animator m_Animator;
Rigidbody m_Rigidbody;
Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;
void Start ()
{
m_Animator = GetComponent<Animator> ();
m_Rigidbody = GetComponent<Rigidbody> ();
}
void FixedUpdate ()
{
float horizontal = Input.GetAxis ("Horizontal");
float vertical = Input.GetAxis ("Vertical");
m_Movement.Set(horizontal, 0f, vertical);
m_Movement.Normalize ();
bool hasHorizontalInput = !Mathf.Approximately (horizontal, 0f);
bool hasVerticalInput = !Mathf.Approximately (vertical, 0f);
bool isWalking = hasHorizontalInput || hasVerticalInput;
m_Animator.SetBool ("IsWalking", isWalking);
Vector3 desiredForward = Vector3.RotateTowards (transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation (desiredForward);
}
void OnAnimatorMove ()
{
m_Rigidbody.MovePosition (m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation (m_Rotation);
}
}
13. PlayerMovement スクリプトを更新してオーディオを再生する
JohnLemon が歩いているときに足音が再生され、彼が静止しているときに停止するように、スクリプトを編集する必要があります。
最初に必要なのは、先ほど JohnLemon に追加した Audio Source コンポーネントへの参照です
1. m_Rigidbody 変数宣言の下に、以下のコードを追加します。
AudioSource m_AudioSource;これは public 変数ではないので、Inspector ウィンドウで代入することはできません。その代わりに、Animator や Rigidbody コンポーネントで行ったようにコードで割り当てる必要があります。
2. Start メソッドで、m_Animator 変数と m_Rigidbody 変数 に参照を割り当てた後、次のコードを追加します。
m_AudioSource = GetComponent<AudioSource>();これでおしまいです!次に、この参照を Audio Source コンポーネントに使用する必要があります。
14. 新しい変数が機能するようにメソッドを調整する
幸いにも、isWalking という FixedUpdate メソッドで変数が既に作成されています。これは、足音の音を再生して停止するために完全に動作します。
1. Animator コンポーネントの SetBool メソッド呼び出しの下に、以下の if-else ステートメントを追加します。
if(isWalking)
{
}
else
{
}isWalking が true の場合はオーディオソースの Play を、false の場合はオーディオソースの Stop を呼び出すことができるようになりました。
2. オーディオソースがまだ再生されていない場合に限り、フレームごとに Play を呼び出し続ける必要はありません。すべてのフレームを呼び出さないようにするには、先ほど追加した if 文の中に以下の if 文を追加します。
if(!m_AudioSource.isPlaying)
{
}3. ここで、Play メソッドの呼び出しを if 文に追加します。
m_AudioSource.Play ();4. オーディオソースの再生を停止するには、以下のコードを else 文に追加します。
m_AudioSource.Stop ();5. 完成した PlayerMovement スクリプトが以下のようになっていることを確認してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float turnSpeed = 20f;
Animator m_Animator;
Rigidbody m_Rigidbody;
AudioSource m_AudioSource;
Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;
void Start ()
{
m_Animator = GetComponent<Animator> ();
m_Rigidbody = GetComponent<Rigidbody> ();
m_AudioSource = GetComponent<AudioSource> ();
}
void FixedUpdate ()
{
float horizontal = Input.GetAxis ("Horizontal");
float vertical = Input.GetAxis ("Vertical");
m_Movement.Set(horizontal, 0f, vertical);
m_Movement.Normalize ();
bool hasHorizontalInput = !Mathf.Approximately (horizontal, 0f);
bool hasVerticalInput = !Mathf.Approximately (vertical, 0f);
bool isWalking = hasHorizontalInput || hasVerticalInput;
m_Animator.SetBool ("IsWalking", isWalking);
if (isWalking)
{
if (!m_AudioSource.isPlaying)
{
m_AudioSource.Play();
}
}
else
{
m_AudioSource.Stop ();
}
Vector3 desiredForward = Vector3.RotateTowards (transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation (desiredForward);
}
void OnAnimatorMove ()
{
m_Rigidbody.MovePosition (m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation (m_Rotation);
}
}
6. スクリプトを保存して Unity に戻ります。
15. オーディオリスナーを JohnLemon に移動する
ゲームのオーディオの最後の部分は、ゴーストが通過するときに作る不気味な音です。これは雰囲気づくりをするだけでなく、プレイヤーがどれだけ危険が近いかを見極めるのにも役立ちます。
1 つの課題は、ゴーストが JohnLemon に近づくにつれて音量が大きくなるのではなく、カメラに近づくにつれて音量が大きくなるということです。これは、オーディオリスナーがデフォルトで Main Camera にあるためです。まずは、これを変えることから始めましょう。
Audio Listener コンポーネントを JohnLemon ゲームオブジェクトに移動するには、以下の手順に従ってください。
1. Hierarchy で、Main Camera ゲームオブジェクトを選択します。
2. Inspector で、Audio Listener コンポーネントのコンテキストメニューをクリックし、 Remove コンポーネントを選択します。
3. Hierarchy で、JohnLemon ゲームオブジェクトを選択します。
4. Inspector で、JohnLemon に Audio Listener コンポーネントを追加します。
16. JohnLemon プレハブの更新
このチュートリアルで JohnLemon に加えた変更はすべて、JohnLemon プレハブのインスタンスに加えられました。
追加した新しいコンポーネントには、そのアイコンの上に + が付いており、プレハブインスタンスに追加されたことを示します。別の JohnLemon をインスタンス化した場合、これらのオーディオコンポーネントは存在しません。
これらの変更を JohnLemon のプレハブに適用することで、これを修正することができます。
1. Hierarchy で、JohnLemon ゲームオブジェクトを選択します。
2. Inspector で、ウィンドウの上部にある Overridesドロップダウンメニューを見つけます。
Overrides ドロップダウンは、JohnLemon のインスタンスが JohnLemon プレハブと異なるすべての方法を表示します。
3.ドロップダウンメニューをクリックして変更点を確認します。
2 つのコンポーネントが追加されました。オーディオソースとオーディオリスナーです。これらの変更を JohnLemon のプレハブの一部にしましょう。
4. Overrides ドロップダウンの下部にある Apply All ボタンをクリックします。
17. ゴーストにオーディオソースを追加する
JohnLemon プレハブにオーディオリスナーが追加されたので、すべてのゴーストのオーディオは JohnLemon の位置を基準とした音量になります。この設定により、プレイヤーがどれだけ近くにいるのかを把握しやすくなります。それでは、ゴーストに音声を加えてみましょう。
1. Hierarchy ウィンドウで、 Enemies ゲームオブジェクトを展開します。
2. Ghost ゲームオブジェクトの中から 1 つを選択します。名前の横にある矢印のショートカットを使用して、編集用のプレハブを開きます。
3. Project ウィンドウで、 Assets > Audio の順にフォルダを展開し、 SFXGhostMove オーディオクリップを見つけます。
4. Project ウィンドウから SFXGhostMove オーディオクリップを Hierarchy ウィンドウの Ghost ゲームオブジェクトにドラッグします。
5. Inspector ウィンドウで、Audio Source コンポーネントを見つけます。
6. 圧倒されるような音量レベルを止めて、JohnLemon との距離に応じて音量レベルが変化するようにするには:
- Loop プロパティチェックボックスを Enable (有効)にする
- Volume プロパティの値を 0.4 に設定する
- Spatial Blend を 1 に設定し、完全に 3D になるようにする
これが基本ですね!
18. 3D Sound Settings 機能を調整する
いくつかの高度な機能を調整して、ゴーストのサウンドを本当にすごいものにしてみましょう。
1. Audio Source コンポーネントで、3D Sound Settings セクションを展開します。
3D Sound Settings は、オーディオリスナーからの距離によってオーディオがどのように変化するかを制御することができます。
2. Max Distance プロパティを 10 に変更するMax Distance(音が完全に聞こえなくなる距離)を 10 に設定すると、ゴーストが 10 メートル離れたところにいるときに、プレイヤーはゴーストの声を聞くことができますが、非常に静かです。
3. 距離による音量の変化の仕方は、Volume Rolloff によって制御されます。現在のところ、これは Logarithmic Rolloff に設定されており、より長い距離を問題なく動作するのに適しています。Max Distance が 10 になったので、Volume Rolloff を Custom Rolloff に変更します。
4. このゲームはデフォルトのカスタムカーブがちょうどいいので、これを調整する必要はありません。
ただし、完了する前に最後に 1 つだけ修正すべきことがあります。
19. ゴーストのサウンドエフェクトの方向を修正する
JohnLemon に Audio Listener コンポーネントを取り付けましたが、JohnLemon が回転すると Audio Listener も彼の回転に応じて回転してしまうという小さな問題があります。つまり、JohnLemon が画面の方を向いているときは、プレイヤーの仮想の目(カメラ)と仮想の耳(オーディオリスナー)が異なる方向を向いていることになります。そのため、ゴーストは反対側にいるかのように聞こえます。
2 つのプロパティを組み合わせて、ゴーストの音が方向性のないように見えても、ゴーストが近づくにつれて大きくなるようにしてみましょう。
1. SFXGhostMove オーディオクリップは、ステレオ再生ではなくモノラル再生に設定されています。つまり、左右のチャンネルを通して音が同じになるということです。(Import Settings を表示したい場合は、Assets > Audio の順に選択し Import Settings を見つけ、クリップを選択して設定を表示します。)
2. Ghost プレハブの Audio Source で、3D Sound Settings を見つけます。Spread プロパティは、音の広がりや範囲を角度で制御します。
3. Spread プロパティの値を 180 に設定します。これは、音の半分が各チャンネルから拡散されて聞こえることを意味します。これらのチャンネルは同じであるため、オーディオ(音声)は両方均等に聞こえ方向性がないように感じます。
4. ゴーストのプレハブを保存し、シーンに戻ります。
5. シーンの保存
これでゲームが完成しました!おめでとうございます!プレイヤーにとってどのようなゲームになるのか、必ずテストをしてみてください。
20. まとめ
このチュートリアルでは、アンビエントサウンドトラックとサウンドエフェクトをゲームに追加することで、Unity のオーディオの基本に触れました。これでゲームが完成しました!もうひとつだけやるべき事があります。最後のチュートリアルでは、ゲームのビルドを作成して配布できるようにします。