Unity Playgroundリファレンスガイド日本語訳版の内容をもとに、スクリプトの内容を一つずつ確認していきます。プロジェクトファイルはこれまでのものを続けて使います。
#ConditionスクリプトとActionスクリプト
ConditionスクリプトはActionスクリプトとセットで使用します。これにより、さまざまな条件分岐が作れるようになります。事前に用意されているActionスクリプトだけでなく、自作のスクリプトを実行させることもできます。
すべてのConditionスクリプトにはActionスクリプトを設定するプロパティが存在します。
プラスアイコンを押すと、追加可能なアクションのリストが表示されます。ドロップダウンの最後に、空のスロット(Empty slot)を追加することもできます。
Custom Actionsをオンにすると、PlayGroundに登録されている以外のさまざまなスクリプトを実行させられます。特定の条件化(敵を破壊したときなど)で音を鳴らすなどは、その一つです。
##Condition AreaとCreate Object Action
Condition Areaは何か特別なオブジェクトが重なった状態を検出したい時に使用するスクリプトです。オブジェクトがゴールに到達した時の状態を検出する際などに使われます。この時オブジェクトは何らかのCollider 2Dがアタッチされており、かつIs Trigerがオンになっている必要があります。この点がCondition Conditionとの違いです。また、Condition Areaを使うと、オブジェクトが「重なった瞬間」「重なり続けている間ずっと」「一度重なって、離れた瞬間」をそれぞれ検出することもできます。
Happen Only Once:オンにすると一度重なりを検出したら、以後は検出しなくなります。
Filter by Tag:オンにすると特定のタグがついたオブジェクトのみ重なりを検出させられます。
Event Type:検出するタイミングを「重なった瞬間」「重なり続けている間ずっと」「一度重なって、離れた瞬間」のいずれかから選択できます。
Create Object Actionは指定したプレハブから新しいインスタンスを作り出すスクリプトです。
Prefab To Create:生成するプレハブを指定します。
New Position:プレハブが生成されるワールド座標を指定します。
Relative To This Object:オンにするとプレハブの生成位置をワールド座標ではなく、本スクリプトがアタッチされたオブジェクトのローカル座標にできます。
ここでは、この2つのスクリプトを組み合わせて、Zombieがゴールに到達したらメッセージが表示される仕組みを作ってみましょう。
###Zombieがゴールに到達したらメッセージを表示する
1:プロジェクトエリアのツリーからAssets>UnityPlayGroundReference>Conditionを開き、Condition.unityをダブルクリックして、Hierarchyのルートに登録する。その後、プロジェクトエリアでFlagRedプレハブを選択し、InspectorでOpen Prefabをクリックする。
2:FlagRedプレハブのInspectorでAdd Componentから「Condition Area」を絞り込み検索し、アタッチする。Condition collisionと間違えないように注意。
3:Condition Areaコンポーネントで「Happen Only Once」と「Filter by Tag」をオンにする。続いて「Tag to check for」で「Player」、「Event Type」で「Enter]を選択する。最後に「Gameplay Actions」エリアの「+」ボタンをクリックする。
4:Actionsメニューから「Create Object Action」を選択する。
5:プロジェクトエリアからgoalプレファブをCreate Objectコンポーネントの「Prefab To Create」スロットにドラッグ&ドロップする。
6:FlagRedプレハブをHierarchyにドラッグ&ドロップし、インスタンスの位置を調整する。
7:再生ボタンをクリックして、Zombieeをシーン上でFlagRedインスタンスの位置に移動させ、「CONGRATULATIONS」が画面中央に表示されれば成功だ。
####展開課題 ゴールに到達したら音を鳴らす
1:プロジェクトエリアのFlagRedプレハブを選択し、先ほどと同じように「Open Prefab」をクリックする。
2:FlagRedプレハブのAdd Componentから「Audio Source」を絞り込み検索し、アタッチする。
3:Condition Areaコンポーネントの「Use Custom Actions」チェックボックスをオンにする。
4:Condition AreaコンポーネントのCustom Actions()プロパティの〇ボタンをクリックし、Select Objectウィンドウの「セルフ」タブから「FlagRed」をクリックする。
5:No Functionメニューを開き、「Audio Source」→「PlayOneShot(AudioClip)」を選択する。
6:プロジェクトエリアのツリーからAssets>UnityPlayGround_Reference>Audioと進み、goal.mp3をFlagRedプレファブのCustom Actions()にある図のスロットにドラッグ&ドロップする。
7:再び再生ボタンをクリックして、ZombieeがFlagRedインスタンスに触れたら効果音が鳴るか確認しよう。
##Condition CollisionとDestroy Action
Condition Areaスクリプトと似たような機能をもつものにCondition Collisionスクリプトがあります。Condition Areaスクリプトがオブジェクト同士の重複を判定するのに対して、Condition collisionスクリプトはオブジェクト同士の接触を判定する点が異なります。そのためCollider 2DのIs Trigerをオフのまま使用できる点が魅力です。
Happen Only Once:オンにすると一度接触を検出したら、以後は検出しなくなります。
Filter by Tag:オンにすると特定のタグがついたオブジェクトのみ接触を検出させられます。
Destroy Actionスクリプトは指定したオブジェクトを削除するスクリプトです。OnOffActionスクリプトと異なり、オブジェクト自体を削除してしまいます。またDestroy Actionスクリプトには、削除しつつ別のオブジェクトを表示することもできます。そのため、ミサイルに当たった敵が消滅する際、同時に爆発エフェクトを表示するなどの演出を加えられます。
Target:衝突した側と衝突された側のどちらを消滅させるか選択できます。
Death Effect:オブジェクトを消滅させる際に表示するエフェクトなどを設定できます。
ここでは、この2つのスクリプトを組み合わせて、BeeがZombieに触れたら爆発する仕組みを作ってみましょう。
###BeeがZombieに触れたら爆発する
1:はじめにHierarchyからFlagRedを選択し、Inspectorでチェックボックスをオフにして、ゴールフラグをシーンビュー上で非表示にしておこう。
2:続いてHierarchyからEnemySpawnを選択し、Inspectorでチェックボックスをオンにする。これでBeeがランダムに出現するようになる。
3:プロジェクトエリアでBeeプレファブを選択し、InspectorでOpen Prefabをクリックする。
4:BeeプレファブでTagメニューを開き、Enemyタグを選択する。これでシーンビュー上に生成されるBeeの全インスタンスにEnemyタグが付与される。
6:プロジェクトエリアでZombieプレファブを選択し、「Open Prefab」をクリックする。
7:ZombieプレファブのInspectorでAdd Componentから「Condition collision」を絞り込み検索し、アタッチする。
8:Condition collisionコンポーネントでFilter by Tagのチェックボックスをオンにし、Tag to check forメニューから「Enemy」を選ぶ。
9:Gameplay Actionsの+ボタンをクリックし、リストから「Destroy Action」を選ぶ。
10:Destroy Actionコンポーネントで、Targetを「Object That Collided(衝突した相手)」を選ぶ。その後、Death Effectのスロット右にある〇ボタンをクリックし、Select GameObjectウィンドウからAssets>P_Explosionを選ぶ。
11:無事アタッチされたら、「<」ボタンをクリックしてシーンビューに戻る。
12:再生ボタンをクリックして、ZombieがBeeに触れたら爆発エフェクトが表示されるか確認しよう。
####展開課題 爆発音を再生する
ConditionAreaスクリプトとCreateObjectActionスクリプトの組み合わせの時と同じように、Condition collisionスクリプトとDestroyActionスクリプトの組み合わせでも効果音を鳴らしてみよう。基本的なやり方は同じだが、ポイントはゲームオーバー時にZombieeが削除されてしまう点にある。インスタンスが削除されるので、AudioSourceをZobieeにアタッチすることが出来ないのだ。
そこでシーン上にGameManagerという空のオブジェクトを作成し、そこにAudioSourceをアタッチして、そこから音を鳴らすようにする。また、Zombieeプレファブではなく、シーン上にあるインスタンスから音を鳴らすアクションを設定するようにすればいい。
1:Hierarchyから右クリックしてメニューを開き、Create Emptyを選ぶ。
2:Hierarchyに新しく作られたGameObjectをクリックし、Inspectorで名称をGameManagerに変更する。
3:GameManagerのInspectorでAdd Componentから「Audio Source」を絞り込み検索して、アタッチする。
4:HierarchyからZombieを選択し、InspectorのCondition collisionコンポーネントからUse custom actionsのチェックボックスをオンにする。
5:Custom Actions()のRuntime Onlyメニューの下にある〇ボタンをクリックし、Select ObjectウィンドウからSceneタブをクリックし、GameManagerを選ぶ。
6:Custom Actions()のNo FunctionメニューからAudioSource>PlayOneShot(AuduoClip)を選択する。
7:Assets>UnityPlayGround_Reference>AudioからExplosion.mp3をCustom Actions()の図のスロットにドラッグ&ドロップする。
####追記
Audioフォルダにgoal.mp3以外のサウンドファイルがない場合は、こちらからダウンロードして解凍してください。フォルダ内にサウンドファイルが3つ入っていますので、Audioフォルダに相当するプロジェクトエリアにドラッグ&ドロップしてください。
8:再生ボタンをクリックして、ZombieがBeeに触れたら爆発エフェクトと共に爆発音が再生されるか確認しよう。
####展開課題2 BGMを再生する
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スクリプトに集約されて、実際に音が鳴る仕組みだ。
そのためAudio Sourceスクリプトは同じシーン上で複数のオブジェクトにアタッチされることも少なくない。これに対してAudio Listenrスクリプトは1シーンにつき1つしかアタッチされず、通常はMainCameraコンポーネントにアタッチされている。
また、3Dゲームと違って2Dゲームでは音の立体感が求められないため、作例のように空のオブジェクト(ここではGameManager)に1つだけアタッチされ、外部のオブジェクトから関数として呼び出されて使用されることも多い。
##ConditionKeyPressとLoadLevelAction
ConditionKeyPressはキーボードの特定のキーの状態を検出するスクリプトです。「キーを押した時」「キーを離した時」「キーを押している間中、ずっと」という3つの状態を検出できます。
Happen Only Once:オンにすると1度だけキーの状態を検出します。
Key To Press:検出するキーを選択できます。
Event Type:「キーを押した時」「キーを離した時」「キーを押している間中、ずっと」を切り替えられます。
LoadLevelActionスクリプトはUnityのシーンファイルを呼び出すスクリプトです。通常Unityではシーンファイルごとにステージを分けて作りますので、あるステージの終了条件を達成したら、次のステージに移行する、といった処理が可能です。また、ゲームの途中からゲームを初期状態に戻したりすることもできます。ただし、このスクリプトを使用するには事前にFile>Build Settingsでシーンファイルを登録しておく必要があります。
Scene to load:呼び出すシーンファイルを選ぶ。RELOAD LEVELの場合は現在のシーンを最初からやり直す。
それでは、この2つのスクリプトを組み合わせて、ゲームの途中から初期状態に戻す仕組みを作ってみましょう。
###BSキーを押すとゲームの途中から初期状態に戻る
1:File>Build Settingsを選択する。
2:Build Settingsウィンドウが開くので、プロジェクトエリアからCondition.unityファイルをドラッグ&ドロップするか、Add Open Sceneをクリックして、現在のシーンファイルを登録する。
3:すでに空のボックスが表示されていたら、右クリック後に「Remove Selection」をクリックし、一つずつ削除していく。
図のようにConditionだけになったら、✕をクリックしてウィンドウを閉じよう。
3:HierarchyからGameManagerを選択し、InspectorでAdd Componentから「Condition Key Press」を絞り込み検索してアタッチする。
4:アタッチされたCondition Key PressコンポーネントのKey To Pressメニューをクリックして開く。