Unity PlayGround Referenceガイド③

<a href="https://docs.google.com/document/d/1xiWggQ5sdn8NRQxH-oiv3bR9rRJxgTmMioG5wEl74ls/edit?usp=sharing">Unity Playgroundリファレンスガイド日本語訳版</a>の内容をもとに、スクリプトの内容を一つずつ確認していきます。プロジェクトファイルはこれまでのものを続けて使います。

#ConditionスクリプトとActionスクリプト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b81bd779-68d8-5c21-25c5-2069e9121d2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/5191b662-b11f-133f-d855-8944f1b960d1.png)
ConditionスクリプトはActionスクリプトとセットで使用します。これにより、さまざまな条件分岐が作れるようになります。事前に用意されているActionスクリプトだけでなく、自作のスクリプトを実行させることもできます。

すべてのConditionスクリプトにはActionスクリプトを設定するプロパティが存在します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/ce7c1639-d98e-66f8-1392-df92136a4863.png)
プラスアイコンを押すと、追加可能なアクションのリストが表示されます。ドロップダウンの最後に、空のスロット（Empty slot）を追加することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/902dffbb-501a-2f76-f1c5-8bf48406354b.png)
Custom Actionsをオンにすると、PlayGroundに登録されている以外のさまざまなスクリプトを実行させられます。特定の条件化（敵を破壊したときなど）で音を鳴らすなどは、その一つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/828380eb-8cdc-2704-2710-b01bef1f288f.png)

##Condition AreaとCreate Object Action

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/61db94c8-bd65-1741-07c8-9cfe5bfbb413.png)
Condition Areaは何か特別なオブジェクトが重なった状態を検出したい時に使用するスクリプトです。オブジェクトがゴールに到達した時の状態を検出する際などに使われます。この時オブジェクトは何らかのCollider 2Dがアタッチされており、かつIs Trigerがオンになっている必要があります。この点がCondition Conditionとの違いです。また、Condition Areaを使うと、オブジェクトが「重なった瞬間」「重なり続けている間ずっと」「一度重なって、離れた瞬間」をそれぞれ検出することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/8ed07326-8487-dfce-1840-f94c0e6234f4.png)
Happen Only Once：オンにすると一度重なりを検出したら、以後は検出しなくなります。
Filter by Tag：オンにすると特定のタグがついたオブジェクトのみ重なりを検出させられます。
Event Type：検出するタイミングを「重なった瞬間」「重なり続けている間ずっと」「一度重なって、離れた瞬間」のいずれかから選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/0dc12b90-10a9-e711-bf06-9da24aa03e8a.png)
Create Object Actionは指定したプレハブから新しいインスタンスを作り出すスクリプトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/f6673e8e-1e55-ff4e-6ba6-f2738b315d25.png)
Prefab To Create：生成するプレハブを指定します。
New Position：プレハブが生成されるワールド座標を指定します。
Relative To This Object：オンにするとプレハブの生成位置をワールド座標ではなく、本スクリプトがアタッチされたオブジェクトのローカル座標にできます。

ここでは、この2つのスクリプトを組み合わせて、Zombieがゴールに到達したらメッセージが表示される仕組みを作ってみましょう。

###Zombieがゴールに到達したらメッセージを表示する

![スクリーンショット (1540).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/012aff3a-fbe2-6c86-f602-bf36a15fdbe4.png)
１：プロジェクトエリアのツリーからAssets＞UnityPlayGroundReference＞Conditionを開き、Condition.unityをダブルクリックして、Hierarchyのルートに登録する。その後、プロジェクトエリアでFlagRedプレハブを選択し、InspectorでOpen Prefabをクリックする。

![スクリーンショット (1541).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/7f9f355f-e2b3-57f7-c274-f37ba75f05b5.png)
２：FlagRedプレハブのInspectorでAdd Componentから「Condition Area」を絞り込み検索し、アタッチする。Condition collisionと間違えないように注意。

![スクリーンショット (1543).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b73bee4a-d9ba-5d01-98df-f9fe8cc4ea2f.png)
３：Condition Areaコンポーネントで「Happen Only Once」と「Filter by Tag」をオンにする。続いて「Tag to check for」で「Player」、「Event Type」で「Enter]を選択する。最後に「Gameplay Actions」エリアの「＋」ボタンをクリックする。

![スクリーンショット (1544).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/d63c8a0a-9638-cb6e-fdd5-ef79624ac14c.png)
４：Actionsメニューから「Create Object Action」を選択する。

![スクリーンショット (1545).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/229d83dc-d345-3419-b3e1-4ebac50c43b2.png)
５：プロジェクトエリアからgoalプレファブをCreate Objectコンポーネントの「Prefab To Create」スロットにドラッグ＆ドロップする。

![スクリーンショット (1546).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/918c0ddf-2d6c-729f-c193-78c99daff76c.png)
６：FlagRedプレハブをHierarchyにドラッグ＆ドロップし、インスタンスの位置を調整する。

![スクリーンショット (1547).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/e00dcd76-8ab5-0af5-4485-718c1251d9de.png)
７：再生ボタンをクリックして、Zombieeをシーン上でFlagRedインスタンスの位置に移動させ、「CONGRATULATIONS」が画面中央に表示されれば成功だ。

####展開課題　ゴールに到達したら音を鳴らす
![スクリーンショット (1564).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/5be8a3f8-5cf6-39ec-0d06-ac4b4d05c5d7.png)
１：プロジェクトエリアのFlagRedプレハブを選択し、先ほどと同じように「Open Prefab」をクリックする。

![スクリーンショット (1550).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/9a207bac-4ed6-a017-c00e-8f4bde420753.png)
２：FlagRedプレハブのAdd Componentから「Audio Source」を絞り込み検索し、アタッチする。

![スクリーンショット (1552).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/f294f038-9fd7-0aa6-93f0-c99308d1e7e1.png)
３：Condition Areaコンポーネントの「Use Custom Actions」チェックボックスをオンにする。

![スクリーンショット (1565).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/25de88f5-65bd-5ddc-2982-87d407eded5d.png)
４：Condition AreaコンポーネントのCustom Actions()プロパティの〇ボタンをクリックし、Select Objectウィンドウの「セルフ」タブから「FlagRed」をクリックする。

![スクリーンショット (1566).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/a3450d2c-4e4f-a731-9635-78657bd096f7.png)
５：No Functionメニューを開き、「Audio Source」→「PlayOneShot(AudioClip)」を選択する。

![スクリーンショット (1567).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/e78593e3-ba66-88f0-72d5-109f411bc642.png)
６：プロジェクトエリアのツリーからAssets＞UnityPlayGround_Reference＞Audioと進み、goal.mp3をFlagRedプレファブのCustom Actions()にある図のスロットにドラッグ＆ドロップする。

![スクリーンショット (1569).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/121aaa9d-ed68-20b7-17a8-779b3179692d.png)
7：再び再生ボタンをクリックして、ZombieeがFlagRedインスタンスに触れたら効果音が鳴るか確認しよう。

##Condition CollisionとDestroy Action

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/dc73ce06-f601-4b92-e003-58c4a949e39b.png)
Condition Areaスクリプトと似たような機能をもつものにCondition Collisionスクリプトがあります。Condition Areaスクリプトがオブジェクト同士の重複を判定するのに対して、Condition collisionスクリプトはオブジェクト同士の接触を判定する点が異なります。そのためCollider 2DのIs Trigerをオフのまま使用できる点が魅力です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/59775269-14ed-6e8d-f0ae-02051deb4a6e.png)
Happen Only Once：オンにすると一度接触を検出したら、以後は検出しなくなります。
Filter by Tag：オンにすると特定のタグがついたオブジェクトのみ接触を検出させられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/ab8fc4ed-62aa-35e6-dcbb-b7b91567bb26.png)
Destroy Actionスクリプトは指定したオブジェクトを削除するスクリプトです。OnOffActionスクリプトと異なり、オブジェクト自体を削除してしまいます。またDestroy Actionスクリプトには、削除しつつ別のオブジェクトを表示することもできます。そのため、ミサイルに当たった敵が消滅する際、同時に爆発エフェクトを表示するなどの演出を加えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/5be43873-308c-5486-f3c8-49fedc2173b9.png)
Target：衝突した側と衝突された側のどちらを消滅させるか選択できます。
Death Effect：オブジェクトを消滅させる際に表示するエフェクトなどを設定できます。

ここでは、この2つのスクリプトを組み合わせて、BeeがZombieに触れたら爆発する仕組みを作ってみましょう。

###BeeがZombieに触れたら爆発する

![スクリーンショット (1571).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b2bdcc34-ece6-c2fb-023f-c6feb27aaa26.png)
1：はじめにHierarchyからFlagRedを選択し、Inspectorでチェックボックスをオフにして、ゴールフラグをシーンビュー上で非表示にしておこう。

![スクリーンショット (1572).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/be9b0a02-4305-eb1a-dcfa-466850e00a76.png)
2：続いてHierarchyからEnemySpawnを選択し、Inspectorでチェックボックスをオンにする。これでBeeがランダムに出現するようになる。

![スクリーンショット (1575).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/5e286e4b-0e7a-b0d9-3f6d-7ef33c9cbad1.png)
3：プロジェクトエリアでBeeプレファブを選択し、InspectorでOpen Prefabをクリックする。

![スクリーンショット (1576).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/642ec6f3-fde0-21e1-ac4a-a8865941502e.png)
4：BeeプレファブでTagメニューを開き、Enemyタグを選択する。これでシーンビュー上に生成されるBeeの全インスタンスにEnemyタグが付与される。

![スクリーンショット (1577).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/09abb5a3-3ff6-b963-7695-e3e9e01342fb.png)
5：タグが設定されたら「＜」ボタンでシーンビューに戻ろう。

![スクリーンショット (1573).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b54adee0-4e42-18c2-c87b-d9bafbc9a092.png)
6：プロジェクトエリアでZombieプレファブを選択し、「Open Prefab」をクリックする。

![スクリーンショット (1574).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/3d94a75f-b7cb-73d9-f7b7-a037820cd15f.png)
7：ZombieプレファブのInspectorでAdd Componentから「Condition collision」を絞り込み検索し、アタッチする。

![スクリーンショット (1578).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/803b344e-0f7c-ddd3-e4e4-a1221d845594.png)
8：Condition collisionコンポーネントでFilter by Tagのチェックボックスをオンにし、Tag to check forメニューから「Enemy」を選ぶ。

![スクリーンショット (1579).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/5ddafb91-ae7a-2fc8-a9ab-b56c0b35981b.png)
9：Gameplay Actionsの＋ボタンをクリックし、リストから「Destroy Action」を選ぶ。

![スクリーンショット (242).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/1a4ecc17-9fc7-5049-5332-cc850e6aea5f.png)
10：Destroy Actionコンポーネントで、Targetを「Object That Collided（衝突した相手）」を選ぶ。その後、Death Effectのスロット右にある〇ボタンをクリックし、Select GameObjectウィンドウからAssets＞P_Explosionを選ぶ。

![スクリーンショット (1581).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b9ec1457-bb54-9723-83dd-dc9d70b85869.png)
11：無事アタッチされたら、「＜」ボタンをクリックしてシーンビューに戻る。

![スクリーンショット (1625).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/ea48a7df-9027-cce2-aa49-b326ce85215a.png)
12：再生ボタンをクリックして、ZombieがBeeに触れたら爆発エフェクトが表示されるか確認しよう。

####展開課題　爆発音を再生する
ConditionAreaスクリプトとCreateObjectActionスクリプトの組み合わせの時と同じように、Condition collisionスクリプトとDestroyActionスクリプトの組み合わせでも効果音を鳴らしてみよう。基本的なやり方は同じだが、ポイントはゲームオーバー時にZombieeが削除されてしまう点にある。インスタンスが削除されるので、AudioSourceをZobieeにアタッチすることが出来ないのだ。
そこでシーン上にGameManagerという空のオブジェクトを作成し、そこにAudioSourceをアタッチして、そこから音を鳴らすようにする。また、Zombieeプレファブではなく、シーン上にあるインスタンスから音を鳴らすアクションを設定するようにすればいい。

![スクリーンショット (247).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/0899f6d9-cabc-4488-ae92-bcc298a70640.png)
1：Hierarchyから右クリックしてメニューを開き、Create Emptyを選ぶ。

![スクリーンショット (249).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/c88d887e-4bc4-3aaf-d937-03d183623e76.png)
2：Hierarchyに新しく作られたGameObjectをクリックし、Inspectorで名称をGameManagerに変更する。

![スクリーンショット (250).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b7b206f9-e59e-696f-8e0e-0fdef529c0b0.png)
3：GameManagerのInspectorでAdd Componentから「Audio Source」を絞り込み検索して、アタッチする。

![スクリーンショット (251).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/e258d4ae-ae3f-cc9f-42d9-2bdc46833595.png)
4：HierarchyからZombieを選択し、InspectorのCondition collisionコンポーネントからUse custom actionsのチェックボックスをオンにする。

![スクリーンショット (253).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/43591b93-12b1-1077-5d87-493298eeb71a.png)
5：Custom Actions()のRuntime Onlyメニューの下にある〇ボタンをクリックし、Select ObjectウィンドウからSceneタブをクリックし、GameManagerを選ぶ。

![スクリーンショット (254).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/3dd086e4-1d69-a182-0350-6798b099fc3e.png)
6：Custom Actions()のNo FunctionメニューからAudioSource＞PlayOneShot（AuduoClip)を選択する。

![スクリーンショット (255).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/53db8a44-f961-9b13-079d-d69fb90ec6be.png)
7：Assets＞UnityPlayGround_Reference＞AudioからExplosion.mp3をCustom Actions()の図のスロットにドラッグ＆ドロップする。

####追記
Audioフォルダにgoal.mp3以外のサウンドファイルがない場合は、<a href="https://drive.google.com/file/d/1otQ8V22qw7RAZ61d7thYVg0_pkYw5Edw/view?usp=sharing">こちらからダウンロードして解凍</a>してください。フォルダ内にサウンドファイルが3つ入っていますので、Audioフォルダに相当するプロジェクトエリアにドラッグ＆ドロップしてください。

![スクリーンショット (246).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/7c79e6e0-b772-2517-2ba7-1aa04c8e0198.png)
8：再生ボタンをクリックして、ZombieがBeeに触れたら爆発エフェクトと共に爆発音が再生されるか確認しよう。

####展開課題2　BGMを再生する
![スクリーンショット (258).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/8ed38ced-305c-8aac-485a-8db98d3b0c10.png)
GameManagerのInspectorにアタッチしたAudio SourceのAudio Clipスロットに、Assets＞UnityPlayGround_Reference＞AudioフォルダにあるBGM.mp3をドラッグ＆ドロップしてアタッチすると、BGMを再生させられる。このときPlay On Awakeにチェックすると再生ボタンをクリックした直後からBGMが再生される。オフの場合は別途BGMを再生させるスクリプトが必要になる。また、Loopsにチェックすると自動的に繰り返し再生される。なお、ゲームオーバー時に別のジングルを再生するなどの高度な演出を行う場合も、別途スクリプトを作成する必要がある。

####ワンポイントアドバイス
Unityで音を鳴らすにはAudio SourceスクリプトとAudio Listenerスクリプトという二種類のスクリプトが必要になる。Audio Sourceスクリプトは音が発せられるオブジェクトにアタッチし、そこから発せられる音がAudio Listerスクリプトに集約されて、実際に音が鳴る仕組みだ。
![スクリーンショット (259).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/29e530b0-f220-f77b-e57c-98aa02dc1cd8.png)
そのためAudio Sourceスクリプトは同じシーン上で複数のオブジェクトにアタッチされることも少なくない。これに対してAudio Listenrスクリプトは1シーンにつき1つしかアタッチされず、通常はMainCameraコンポーネントにアタッチされている。
また、3Dゲームと違って2Dゲームでは音の立体感が求められないため、作例のように空のオブジェクト（ここではGameManager）に1つだけアタッチされ、外部のオブジェクトから関数として呼び出されて使用されることも多い。


##ConditionKeyPressとLoadLevelAction

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/1282229a-0be1-d260-07e4-223959f9218c.png)

ConditionKeyPressはキーボードの特定のキーの状態を検出するスクリプトです。「キーを押した時」「キーを離した時」「キーを押している間中、ずっと」という3つの状態を検出できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/7385b710-3035-1462-300e-c43d29a81443.png)
Happen Only Once：オンにすると1度だけキーの状態を検出します。
Key To Press：検出するキーを選択できます。
Event Type：「キーを押した時」「キーを離した時」「キーを押している間中、ずっと」を切り替えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/516f02fb-b279-25bb-b67b-a9533e6b5ffe.png)
LoadLevelActionスクリプトはUnityのシーンファイルを呼び出すスクリプトです。通常Unityではシーンファイルごとにステージを分けて作りますので、あるステージの終了条件を達成したら、次のステージに移行する、といった処理が可能です。また、ゲームの途中からゲームを初期状態に戻したりすることもできます。ただし、このスクリプトを使用するには事前にFile＞Build Settingsでシーンファイルを登録しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/b4dc1bdf-846a-000a-a3de-81dad9738638.png)
Scene to load：呼び出すシーンファイルを選ぶ。RELOAD LEVELの場合は現在のシーンを最初からやり直す。

それでは、この2つのスクリプトを組み合わせて、ゲームの途中から初期状態に戻す仕組みを作ってみましょう。

###BSキーを押すとゲームの途中から初期状態に戻る
![スクリーンショット (1635).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/f059fa6d-96bd-4164-64c7-26adb67d09e7.png)
1：File>Build Settingsを選択する。

![スクリーンショット (1628).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/807faa0a-f7fe-1b61-7476-8477e5fa65a9.png)
2：Build Settingsウィンドウが開くので、プロジェクトエリアからCondition.unityファイルをドラッグ＆ドロップするか、Add Open Sceneをクリックして、現在のシーンファイルを登録する。

![スクリーンショット (1629).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/07dfbff4-c4c5-08d7-64c2-e6de03a8e75a.png)
3：すでに空のボックスが表示されていたら、右クリック後に「Remove Selection」をクリックし、一つずつ削除していく。

![スクリーンショット (1630).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/e0784606-6341-47e3-7acd-7db1a306e453.png)
図のようにConditionだけになったら、✕をクリックしてウィンドウを閉じよう。

![スクリーンショット (260).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/9487e5f2-2451-36e0-1046-9c114f9cbafd.png)
3：HierarchyからGameManagerを選択し、InspectorでAdd Componentから「Condition Key Press」を絞り込み検索してアタッチする。

![スクリーンショット (261).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/345923d1-093c-53b7-c103-2bd3f614151a.png)
4：アタッチされたCondition Key PressコンポーネントのKey To Pressメニューをクリックして開く。

![スクリーンショット (262).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/5fcce741-3d34-e307-70d9-f3170fcc921c.png)
5：メニューから「Back Space」を選択する。

![スクリーンショット (269).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/e12f31c5-987b-a8c0-d15c-ededae6e1aeb.jpeg)
6：Load LevelコンポーネントでScene to Loadメニューから「RELOAD LEVEL」を選択する。

![スクリーンショット (271).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166666/4b817645-78e9-f822-12ed-f1ce01457e21.png)
7：再生ボタンをクリックして、BSキーを押すと初期状態に戻るか確認しよう。