i-school - 強制横スクロールゲーム 手順28
 この手順でも引き続き、ゲームの演出を追加していきます。

 この手順ではキャラが他のオブジェクトと接触した際にSEを再生し、エフェクトを生成する処理を実装していきます。


<実装動画 敵と接触した際にSEが鳴ってエフェクトが生成される>
https://gyazo.com/7d4a29f97a8229f63def37fa508f0f82


<実装動画 エフェクトは自由に設定>
https://gyazo.com/da28335e868a3fbfa0a357a20f940118


<実装動画 コインと接触した際にSEが鳴ってエフェクトが生成される>
https://gyazo.com/b532fcdda76c1b305de80a747351bcf2


手順28 ーオブジェクトと接触時のSEとエフェクト処理の実装ー
47.無料のエフェクトアセットをインポートする
48.スクリプトを修正して、敵に接触した際にSEを再生し、敵の位置にエフェクトを生成する処理を追加する(PlayerController)



 新しく学習する内容は以下になります。

・AudioSource.PlayClipAtPointメソッド



47.無料のエフェクトアセットをインポートする

1.アセットストアへ移動する


 Unityのメニューから Window => Asset Store を選択します。AssetStoreビューがSceneビューの隣に作られます。
Search online ボタンを押してアセットストアのサイトへ移動してください。

AssetStoreビュー

 

2.アセットストアでインポートするアセットを検索する


 アセットストアのサイト上部にある検索窓に free effect と入力して検索を行います。

検索



 Cartoon FX Free という無料のエフェクト用アセットが見つかりますので、こちらをクリックします。

Cartoon FX Free



 クリックするとアセットの詳細が画面に表示されますので、 Open in Unity という、青いボタンを押します。



 
 自動的にUnityのエディター画面に遷移します。これでアセットストアのサイトは閉じてしまって大丈夫です。


3.アセットをUnityにインポートする


 エディターのPackageManagerビューが開いて、対象のアセットが表示されますので、右下にある Download ボタンを押します。


PackageManagerビュー



 Download が終了すると左隣にある Import というボタンが押せるようになりますので、そちらを押します。


PackageManagerビュー


 
 インポートするアセットの一覧がポップアップウインドウとして表示されますので、そのまま右下にある Import ボタンを押します。

Import確認のポップアップ



 待機するようにプログレス表示が出て、しばらくするとアセットのインポートが終了します。


 Project内を確認しましょう。JMO Assets という新しいフォルダが追加されていれば無事にインポートされています。
フォルダを順番に開いていくとたくさんのフォルダとファイルが追加されています。(画像の青い部分が今回インポートされたアセットです)


JMO Assets



 以上でアセットのインポート作業は終了です。


4.エフェクトを設置してどのように動作するかを検証する


 JMO Assets フォルダ内にはいくつかの Prefabs フォルダがあり、この中に完成しているエフェクトが多数用意されています。
どのプレファブ・ゲームオブジェクトでもよいので、Sceneビュー にドラッグアンドドロップして設置してみましょう。
自動的にエフェクトが再生されます。これらはUnityのパーティクルシステムによって作成・制御されています。
Sceneビューの右下に Particle Effect というウインドウが表示され、Play を押すと再度エフェクトを再生することが出来ます。


<検証動画 エフェクトを設置してどのように動作するか検証する>
https://gyazo.com/acdfd6299aa6ff5660995058b8c55fcd


 いくつか設置して、どのような種類のエフェクトがあるか試してみてください。その中から、敵と接触した際に利用するエフェクトを決定しておいてください。

 検証が終了したらヒエラルキーにある、これらの設置したエフェクトプレファブのゲームオブジェクトを削除してください。
プレファブですのでヒエラルキーから削除しても問題ありません。

 また、ドラッグアンドドロップして設置した際に、自動的に1回だけエフェクトが再生されたと思います。
これはエフェクトをゲーム中でスクリプトから生成した場合にも同じように動作します。
つまり、インスタンス処理を行うことによって生成時に1回だけエフェクトを再生してくれますので、
プレファブからエフェクトを生成すると、自動的にエフェクトの再生までを一連の動作で実行してくれます。
(なおループの設定になっているエフェクトは1回ではなく、破壊されるまでずっと再生を繰り返します。)

 是非色々と試してください。操作していくことが習得への一番の近道になります。


48.スクリプトを修正して、敵に接触した際にSEを再生し、敵の位置にエフェクトを生成する処理を追加する

1.設計


 SEを再生する方法や、エフェクトを生成する方法には色々な手法があります。
今回は1つのスクリプトを修正することで両方の処理を実装できるように、PlayerController スクリプトを修正することで処理を設計します。

 SEに関しては AudioClip 型の変数を宣言して、敵を接触した際に再生したい SE を事前にアサインして登録しておきます。
エフェクトに関しても同様で、GameObject 型の変数を宣言して、先ほどインポートしたエフェクト用のプレファブをアサインしておきます。

 これらの情報を利用して、敵と接触した際、つまりOnCollisionEnter2D メソッドの処理の中にこれらの処理を追加して実装します。

 SEの再生に関しては、AudioSource クラスの持つ PlayClipAtPoint メソッドを利用します。この処理は AudioSource コンポーネントをアタッチしていなくても
引数で指定した AudioClip 型のオーディオファイルの再生が可能です。

 エフェクトに関しては、GameObject 型でインスタンス処理を行って戻り値を用意しておいた変数に代入し、一定時間後に破棄するようにしています。


2.PlayerController スクリプトを修正して、敵と接触した際にSEの再生とエフェクトの生成する処理を追加する


 新しい変数を2つ宣言し、OnCollisionEnter2D メソッド内にこれらの変数を利用した処理を追加することによって
SEの再生とエフェクトの生成/破棄の処理を実装します。


PlayerController.cs

 <= クリックすると開きます。



3.<AudioSource.PlayClipAtPointメソッド>


 このメソッドは変数を利用しなくても利用できる、AudioSource クラスの持つ static メソッドの1つです。

 第1引数で指定した AudioClip を再生します。
その際、ヒエラルキーに AudioSource コンポーネントを持つゲームオブジェクトを作成し、再生が終了すると同時に自動で破棄します。
そのため、第2引数にはゲームオブジェクトを作成する位置を指定します。
指定された位置で AudioSource コンポーネントを持つゲームオブジェクトが生成されて AudioClip が再生されます。

  // 敵との接触用のSE(AudioClip)を再生する
  AudioSource.PlayClipAtPoint(knockbackSE, transform.position);

 このメソッドの便利な点は、もう1つありまして、破壊されたゲームオブジェクトがこの命令を実行している場合にも
しっかりとオーディオファイルを再生してくれるという点です。

 例えば、ゲームオブジェクト自体に AudioSource コンポーネントを持たせてオーディオファイルを再生する場合、
当然ながら、そのゲームオブジェクトが破壊された場合にはオーディオファイルも再生されません。

 このメソッドはAudioClip再生用の新しいゲームオブジェクトを作成してオーディオファイルを再生してくれるので、
生成元であるゲームオブジェクトが破壊されていても、別のゲームオブジェクトがオーディオファイルを再生しているため、ちゃんとオーディオファイルが再生されます。


参考サイト
Unity公式スクリプトリファレンス
AudioSource.PlayClipAtPoint
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unishar -ユニシャー様
破壊されたオブジェクトから・指定した場所から音再生!PlayClipAtPointの説明と使い方
https://miyagame.net/playclipatpoint/


4.Yuko_Player ゲームオブジェクトの設定を行う


 スクリプトを修正しましたので、PlayerController スクリプトがアタッチされている Yuko_Player ゲームオブジェクトを選択してインスペクターを確認します。
新しく追加した2つの変数のアサイン情報が表示されますので、こちらを順番にアサインします。


Yuko_Player ゲームオブジェクト インスペクター画像



 knockbackSE 変数は AudioClip 型ですので、オーディオファイルのみアサインすることが可能です。Audio フォルダ内にある、
敵と接触した際の SE 用のオーディオファイルをドラッグアンドドロップしてアサインしてください。

 knockbackEffect 変数は GameObject 型ですので、ゲームオブジェクトであればアサインが可能です。
今回インポートしたエフェクト用のプレファブ・ゲームオブジェクトを1つ選択して、ドラッグアンドドロップしてアサインしてください。
どのプレファブを利用していただいて構いません。


Yuko_Player ゲームオブジェクト アサイン後のインスペクター画像



5.ゲームを実行して動作を確認する


 ゲームを実行して、敵と接触してみてください。SEが再生されてエフェクトが生成されれば成功です。
またエフェクトは自動的に 0.5 秒後に削除されれば正常な処理になります。


<実行動画 敵と接触した際にSEが鳴ってエフェクトが生成される>
https://gyazo.com/b6f514ff341fbbf7ac267f584577f52f


 敵と接触した際にはゲームを一時停止して、ヒエラルキーを確認してください。
PlayClipAtPointメソッドによって生成された SE 再生用のゲームオブジェクト(One shot audio)が生成されて、自動的に破棄されます。


<実行動画 ヒエラルキーにSE再生用のゲームオブジェクトが作成される>
https://gyazo.com/3e2709d503cf03d35163cfde06a0a1c8


 もしも SE 用のゲームオブジェクトが生成されているにもかかわらず、SE が聞こえない場合は、BGMのボリュームが大きすぎるか、
SE 用のオーディオファイルの元々のボリュームが小さいかいずれかが原因として考えられます。
まずは BGM のボリュームを 0 にして聞こえるか確認してみてください。


6.<復習課題:コインを獲得した場合にもSEとエフェクトを生成する処理を追加する>


 敵に接触した場合と同じように、今度はコインと接触して獲得した際に、SEを鳴らして、エフェクトを生成する処理を自分で設計して実装してみましょう。
SE、生成するエフェクトは自由に設定してください。


<参考画像>

PlayerController ゲームオブジェクト インスペクター画像



PlayerController ゲームオブジェクト アサイン後のインスペクター画像



<実装動画 コインと接触した際にSEが鳴ってエフェクトが生成される>
https://gyazo.com/b532fcdda76c1b305de80a747351bcf2


<実装動画 両方>
https://gyazo.com/8fc747d592ad2713785608669bf1364b


 以上でこの手順は終了です。

 次は 手順29 ー落下防止用の床の制御ー です。