Unity Playgroundリファレンスガイド日本語訳版の内容をもとに、スクリプトの内容を一つずつ確認していきます。プロジェクトファイルはこれまでのものを続けて使います。
Conditon RepeatとOn-Off
ConditionRepeatスクリプトは一定の頻度で処理を繰り返すスクリプトです。
Initial Delay:シーンファイルが読み込まれて何秒後に処理を開始するか設定できます。
Frequency;処理を繰り返す頻度を秒数で指定できます。
On-Offスクリプトはオブジェクトの表示と非表示を反転させるスクリプトです。よりプログラム的に言うと、Activeフラグをtrueまたはfalseに設定できます。
Object to Affect:対象となるオブジェクトを指定できます。
Just Make Invisible:このチェックをオンにすると、SpriteRendererのオン/オフを切り替えられます。つまり、目には見えないが実際には存在するという、透明人間的なオブジェクトにすることができます。
それでは、この2つのスクリプトを組み合わせて、一定時間で表示と非表示を繰り返す魔法の鍵をつくってみましょう。
出たり消えたりする魔法の鍵を作る
1:HierarchyでGameManagerを選択し、InspectorでAdd ComponentからCondition Repeatを絞り込み検索して、アタッチする。
2:GameManagerのInspectorからCondition RepeatコンポーネントにあるFrequencyパラメータを任意の秒数(ここでは3秒)にする。その後、Gameplay Actionsから+をクリックし、OnOffActionを選ぶ。
3:オブジェクトエリアからKeyGoldプレハブをHierarchyにドラッグ&ドロップし、シーンビュー上でイチを調整する。その後、HierarchyにあるKeyGoldのインスタンスをGameManagerのInspectorにあるOn-OffコンポーネントのObject To Affectスロットにドラッグ&ドロップする。
4:再生ボタンをクリックして、3秒ごとにKeyGoldが点滅するか確認しよう。
残りのActionsスクリプト
すでに述べたように、Actionsスクリプトは単独では動作せず、Conditionスクリプトと組み合わせて使用する。ここでは残りのActionsスクリプトの使い方について解説しよう。
ConsumeResorceAction
ConsumeResorceActionスクリプトはResorceスクリプトと組み合わせて使用します。Resorceスクリプトがついたオブジェクトはインベントリに格納できるのでしたね。格納したオブジェクトはConsumeResorceActionスクリプトを使うことで、特定のアクションを行うために使うことが可能になります。
ここでは、先ほど作った魔法の鍵を一部修正して、鍵のかかった宝箱を開け、コインを入手する仕組みを作ってみましょう。
鍵のかかった宝箱を開けてコインを入手する
1:はじめにHierarchyでGameManagerを選択し、InspectorでCondition Repeatをオフにしておこう。
2:続いてCoinプレハブの準備をしておこう。プロジェクトエリアのCoinプレハブを選択し、InspectorでOpen Prefabをクリックする。
3:Add ComponentでResorceを絞り込み検索し、アタッチする。
4:続いてResorceコンポーネントのTyep of ResorceのCoinをクリックする。なお、このときAmmountのパラメータを変更すると、スコアの値を変更できる。最後に「<」ボタンをクリックしてシーンビューに戻る。
5:続いて先ほどのKeyGoldにResourceスクリプトをつけよう。プロジェクトエリアでKeyGoldプレハブを選択し、InspectorでOpen Prefabをクリックする。
6:InspectorのAdd ComponentからResourceを絞り込み検索し、アタッチする。
7:ReferenceコンポーネントのType of ResourceメニューでKeyを選択する。この時、先ほど設定したCoinプレハブと同じようにAmmoutのパラメータを変更すると、一度に入手できるKeyの数をふやせる。設定が終わったら「<」ボタンをクリックしてシーンビューに戻る。
8:プロジェクトエリアのTreasureChestGoldプレハブを選択し、InspectorでOpen Prefabをクリックする。
9:TreasureChestGoldプレハブを開き、Add ComponentからCondition Collision を絞り込み検索して、アタッチする。
10:Condition CollisionコンポーネントでFilter by Tagをオンにして、Tag to check forをPlayerにする。その後、Gameplay Actionsで+ボタンをクリックし、ConsumeResorceActionを選択する。
11:ConsumeResorceActionコンポーネントでType of ReferenceメニューからKeyを選択する。
12:再びCondition CollisionコンポーネントでGameplay Actionsから+ボタンをクリックし、Destroy Actionを選択する。
13:続いてTargetメニューからThis Objectを選択する。
14:プロジェクトエリアからCoinプレハブをTreasureChestGoldプレハブのDestroy ActionコンポーネントにあるDeath Effectスロットにドラッグ&ドロップする。その後「<」ボタンをクリックしてシーンビューに戻る。
展開課題
Death EffectスロットでP_Impactを選択すると、Coinプレハブが表示されるかわりに、Impactエフェクトが表示される。そのうえでCoinプレハブを表示させるには、再びCondition CollisionコンポーネントでGameplay Actionsから+ボタンをクリックし、GameObjectActionを選択して、Coinプレハブを選択すればいい。
12:プロジェクトエリアのTreasureChestGoldプレハブをHierarchyにドラッグ&ドロップする。その後、シーンビュー上でTreasureChestGoldインスタンスの場所を調整する。
13:再生ボタンをクリックして、Zombieを右に移動させよう。
14:GoldKeyに触れるとGoldKeyが消えてUIにインベントリが表示される。続いて右に移動させていく。
15:TreasureChestGoldに触れると、TreasureChestGoldが消えて、Coinが表示される。
16:Coinに触れるとインベントリにCoinが表示される。このようにResourceスクリプトとConsumeResorceActionスクリプトを連鎖させることで、複雑なメカニクスが作れる。
DialogueBalloonAction
DialogueBalloonスクリプトを使用すると、簡単なセリフをゲームに追加できます。 Roguelikeのサンプルシーンに例があります。
このスクリプトを使って、簡単な会話イベントを作ってみましょう。
会話イベントを作る
1:シーンビュー上でZombie、GoldKey、TreasureChestGoldの位置を修正します。HierarchyでGameManagerを選択し、InspectorでCondition Repeatのコンポーネントをオフにしておきます。これでGoldKeyが点滅しなくなりまs。
2:プロジェクトエリアからAlien2をHierarchyにドラッグ&ドロップして、シーンビュー上で位置を調整します。その後、Alien2のInspectorからBox Collider 2Dコンポーネントをオフにします。これでAlien2に当たり判定がなくなり、Zombieが通り抜けられるようになります。
3:Hierarchyエリアで右クリックし、Create Emptyを選択します。
4:新しくできたGameObjectのInspectorで名称をTalkに変更し、位置を調整します。Alien2の左側に透明なサークル(=Talkオブジェクト)が表示されるようにします。
5:TalkのInspectorでAdd ComponentからBox Collider 2Dを絞り込み検索して、アタッチします。
6:TalkのInspectorでAdd ComponentからCondition Areaを絞り込み検索して、アタッチします。
7:TalkのInspectorでBox Collider 2DのIs Trigerをオンにします。続いてCondition AreaコンポーネントでFilter by Tagをオンにして、Tag to check forメニューをPlayerにします。
8:Condition AreaコンポーネントのGameplay Actions欄にある+ボタンをクリックし、メニューからDialogue Balloonを選択します。
9:Dialogue BaloonコンポーネントでText to display欄に表示したいテキスト(ここでは「Hey! get a key」)を入力します。次にHierarchyでAlien2をTarget Object欄にドラッグ&ドロップします。
10:再生ボタンをクリックして、ZombieをAlie2に近づけると、メッセージが表示されることを確認します。Enterキーを押すとメッセージが消えます。
展開課題 会話の連鎖
1:一つのイベントで会話を連鎖させるには、同じオブジェクトにDialogue Baloonコンポーネントを追加していきます。同じようにTalkオブジェクトのInspectorからAdd Componentをクリックし、Dialogue Baloonを絞り込み検索して、アタッチしましょう。
2:複数のキャラクターの掛け合い表現も可能です。ここではZombieにお礼を言わせてみましょう。まずDialogue BaloonコンポーネントでText to display欄に表示したいテキスト(ここでは「Thanks」)を入力します。次にBackground colorをクリックし、メッセージウインドウの色を緑色に変更します。
3:HierarchyでZombieを選択し、TalkオブジェクトのInspectorを開きます。その後、先ほどアタッチした新しい方のDialogue Baloonコンポーネントにある、Target ObjectスロットにZombieをドラッグ&ドロップします。
4:2つめのDialogue Baloonコンポーネントの名称部分を1つめのDialogue BaloonコンポーネントのFowlloing Textスロットにドラッグ&ドロップします。
5:実際にゲームを動かして確かめてみましょう。Zombieが近づくとAlien2のメッセージが表示されます。
6:Enterキーを押すと、続いてZombieのテキストが表示されます。
7:同じようにDialogue Baloonコンポーネントを連鎖させることで、延々と会話を続けられます。英語だけでなく、日本語の表示も可能です。
Teleport Action
Teleport Actionスクリプトは指定したオブジェクトをシーンビュー上の特定の座標に瞬間移動させるスクリプトです。このスクリプトがアタッチされたオブジェクト自体を瞬間移動させることもできます。
Object To Move:瞬間移動させるオブジェクトを設定する。空欄の場合はこのスクリプトがアタッチされたオブジェクトが瞬間移動する
New Position:瞬間移動後のワールド座標
Stop Movements:オンにすると移動後に元のキャラクターの移動速度をゼロにできる
それでは、このスクリプトを使って障害物を回避する仕組みを作ってみましょう
瞬間移動で障害物を回避する
1:はじめにHierarchyでZombie以外のオブジェクトを選び、Inspectorでオブジェクトを非表示にしておきます。
2:プロジェクトエリアからOrcプレハブをHierarchyにドラッグ&ドロップして、シーンビュー上で場所を調整します。
3:OrcのInspectorでScaleをX=2、Y=2にします。次にRigidbody 2DのConstraintsメニューを開き、Freeze PositionとFreeze Rotationをすべてオンにします。
4:最後にOrcのTagをEnemyからUntaggedに変えておこう。ここがEnemyのままだと、Zombieに触れると爆発してしまうので注意。
5:これでZombieが決して通り越せない障害物ができた。ここから画面の左側に移動すると、瞬間移動して右側に向かう仕組みを作ってみよう。
6:Hierarchyエリアで右クリックし、Create Emptyを選ぶ。
7:新しくできたゲームオブジェクトの名称をTelleportとして、PositionをX=-10、Y=ー4にする。
8:TelleportオブジェクトのInspectorからAdd ComponentでBox Collider 2Dを絞り込み検索し、アタッチする。
9:TelleportオブジェクトのInspectorからAdd ComponentでCondition Areaを絞り込み検索し、アタッチする。
10:TelleportオブジェクトのInspectorからBox Collider 2DコンポーネントのIs Trigerをオンにする。次にCondition AreaコンポーネントのFilter by Tagをオンにして、Tag to check forメニューからPlayerを選ぶ。
11:Condition AreaコンポーネントのGameplay Actionsで+ボタンをクリックし、メニューからTelleportActionを選ぶ。
12:HierarchyにあるZombieeをTelleportコンポーネントのObject To Moveスロットにドラッグ&ドロップする。その後、New Positionでテレポート後の座標(X=7、Y=5)を選ぶ。