3D ゲームキットリファレンスガイド

Tutorial

·

Beginner

·

+0XP

·

75 mins

·

(20)

Unity Technologies

3D ゲームキットリファレンスガイド

3D ゲームキットを使用すると、コードを書かずに Unity で 3D プラットフォーマーのゲームプレイやパズルを作ることができます。このドキュメントでは、3D ゲームキットでゲームを作るために使う各コンポーネントについて、コンポーネントが何をするのか、コンポーネントの設定はどうなっているのかということを説明します。

Unity を初めて使う方は、インタラクティブチュートリアルインターフェースと基礎事項のチュートリアルをご覧になり、Unity のインターフェースとコンセプトに慣れることをお勧めします。また、2D 環境でのシステムやコンセプトを紹介する 2D ゲームキットをダウンロードして学習することもできます。Unity の詳細については、Learn サイトをご覧ください。

このドキュメントの最も良い使い方は、リファレンスガイドのように、詳しく知りたいコンポーネントや設定で検索することです。ゲームキットの使い方の基本を学ぶには、キットの使い方の基礎となるクイックスタートガイドをチェックしてください。このプロジェクトに含まれている「Start」サンプルゲームでは、ゲームプレイのために提供しているすべてのコンポーネントを使用しています。アイデアを探したり、ゲームオブジェクトの使用例を見たりしたいときは、Scenes > GamePlay フォルダー内でステージ 1、ステージ 2 のシーンを開いてみてください。重要な用語や概念については、詳細を確認したくなったとき便利なように、リンクで強調表示されています。

Languages available:

1. 3D ゲームキットリファレンスガイドについて

3D ゲームキットを使用すると、コードを書かずに Unity で 3D プラットフォーマーのゲームプレイやパズルを作ることができます。このドキュメントでは、3D ゲームキットでゲームを作るために使う各コンポーネントについて、コンポーネントが何をするのか、コンポーネントの設定はどうなっているのかということを説明します。


Unity を初めて使う方は、インタラクティブチュートリアルインターフェースと基礎事項のチュートリアルをご覧になり、Unity のインターフェースとコンセプトに慣れることをお勧めします。また、2D 環境でのシステムやコンセプトを紹介する 2D ゲームキットをダウンロードして学習することもできます。Unity の詳細については、Learn サイトをご覧ください。


このドキュメントの使い方


このドキュメントの最も良い使い方は、リファレンスガイドのように、詳しく知りたいコンポーネントや設定で検索することです。ゲームキットの使い方の基本を学ぶには、キットの使い方の基礎となるクイックスタートガイドをチェックしてください。


このプロジェクトに含まれている「Start」サンプルゲームでは、ゲームプレイのために提供しているすべてのコンポーネントを使用しています。アイデアを探したり、ゲームオブジェクトの使用例を見たりしたいときは、Scenes > GamePlay フォルダー内でステージ 1、ステージ 2 のシーンを開いてみてください。


重要な用語や概念については、詳細を確認したくなったとき便利なように、リンクで強調表示されています。


2. 3D の Ellen

Ellen のプレハブはこのゲームキットにおけるプレイヤーキャラクターです。歩く、走る、ジャンプ、攻撃のアクションを取ることができます。


標準の移動操作


移動:PCはWASD、ゲームパッドは左スティック


ジャンプ:PCはスペースキー、ゲームパッドはAボタン


攻撃:PCはマウスの左クリック、ゲームパッドはXボタン


カメラ移動:PCはマウス移動、ゲームパッドは右スティック


Ellen にはアニメーターキャラクターコントローラー、Damageable スクリプト(ステップ6を参照)および多数のカスタムスクリプトがアタッチされています。


Player Controller



Player Controller スクリプトは、Ellen がゲーム中でどのようにふるまうかの情報をすべて保持します。公開されている設定はほとんど動きを制御するものですが、スクリプトを開いて編集することですべての変数を調整することができます。


設定を変更した場合、変更はそのシーンのプレハブのインスタンスにのみ適用されます。ゲーム内のすべてのステージで変更を適用したい場合は、インスタンスの上部にある Apply をクリックして、Ellen プレハブに変更を適用します。


  • Max Forward Speed: デフォルト設定:8 Ellen の走る速度を設定します。

  • Gravity: デフォルト設定:20 Ellen が空中で落ちていく速度を設定します。

  • Jump Speed: デフォルト設定:10 ジャンプ時に Ellen が地面を離れる速度を設定します。

  • Turn Speed: デフォルト設定:400~1200 Ellen が回転する速度を設定します。回転速度は Ellen の移動速度によって変わります。静止しているときは速く回転しやすいので最大値が使われます。Max Forward Speed の速度で走っている場合は、速く回転することが難しいので、最小値が使われます。

  • Idle Timeout: デフォルト設定:5 ここで設定した秒数が経過すると、Ellen はランダムな静止ポーズを取り始めます。

  • Can Attack: デフォルト設定:false Ellen が杖で攻撃できるかどうかを設定します。この設定は外部から変更することができます。

  • References: この項目に設定されるものはすべてスクリプトが機能するために必要とする参照となります。その参照はすべて Ellen プレハブに載せられており、デフォルトのまま変更を加える必要はありません。

  • Melee Weapon: Ellen が杖を振ったとき、敵にダメージを与えます。

  • Camera Settings: Ellen が正しい方向を向くように、現在のカメラの回転を取得します。注意:これは唯一 Ellen プレハブに載っていないものに対する参照です。プレハブがインスタンス化されると、CameraRig ゲームオブジェクトの Camera Settings スクリプトに自動的に設定されます。

  • Footstep Random Audio Player: Ellen が歩いた時にランダムなサウンドを再生します。

  • Hurt Random Audio Player: Ellen がダメージを受けた時にランダムなサウンドを再生します。

  • Landing Random Audio Player: Ellen が着地した時にランダムなサウンドを再生します。

  • Emote Landing Player: Ellen が着地した時に、声の音源をランダムに再生します。

  • Emote Death Player: Ellen がやられた時に、声の音源をランダムに再生します。

  • Emote Attack Player: Ellen が攻撃する時に、声の音源をランダムに再生します。

  • Emote Jump Player: Ellen がジャンプする時に、声の音源をランダムに再生します。

3. ワールド構築

Instance Painter


Instance Painter コンポーネントは、Unity エディター内でシーンの作成を支援するために設計されたツールです。再生モードやビルドでは使用できません。シーンでプレハブを置きたい場所をペイントすると、各インスタンスの配置を自動的に行ってくれます。



  • Layer Mask: Instance Painter はここで設定したレイヤーの上にのみプレハブを配置します。

  • Root Transform: ペイントしたプレハブはすべて、ここに設定したゲームオブジェクトの子になります。

  • Brush Radius: マウスカーソルの周りに設定されるブラシのサイズです。

  • Brush Height: マウスカーソルの周りに設定されるブラシの高さです。

  • Brush Density: 大きな値を設定すると、ブラシの範囲内により多くのプレハブインスタンスが生成されます。小さな値を設定すると、インスタンスの数は少なくなります。

  • Max Random Rotation: ペイントされたインスタンスを、この値の範囲内でランダムに回転させます。

  • Rotation Step: ここに 0 より大きい値を設定すると、ペイントされたインスタンスに適用されるランダムな回転が、この値で量子化されるようになります。

  • Collision Test: Instance Painter は、ペイント中に重なったインスタンスを自動的に削除します。これは Renderer Bound や Collider Bound で指定されたボリュームを使って行うことができます。

  • Max Intersection Volume: 各インスタンスボリュームが他のインスタンスボリュームとどのくらい重なってよいかを、ボリュームに占める割合で指定します。

  • Max Slope: Instance Painter がインスタンスを配置する面の最大勾配を指定します。

  • Prefab Palette: これはペイントに使えるプレハブのリストです。各プレハブは、インスペクターにプレハブを表すボタンの形で表示されます。

  • Align to Normal: true の場合、配置された各インスタンスは配置された面の法線方向を向きます。そうでない場合はワールドの上方向ベクトルの方向を向きます。

  • Follow Surface: true の場合、ブラシはマウスカーソルの下にある面の法線に向きを合わせ、そうでない場合はワールドの上向きベクトルに向きを合わせます。

  • Randomize each Stamp: true の場合、スタンプ(ブラシの範囲内に配置されるアイテム)がクリックするたびにランダムに変わります。そうでない場合は、スペースバーを押して新しいスタンプを作成する必要があります。

  • Variations Panel: このパネルは、Variations コンポーネントを持つプレハブにのみ表示されます。このコンポーネントを使用すると、プレハブをさまざまなバージョンや大きさに置き換えて配置することができます。

  • Min Scale: 配置されたインスタンスをランダムな大きさにすることができます。ここの値は大きさの最小値を表します。

  • Max Scale: 配置されたインスタンスをランダムな大きさにすることができます。ここの値は大きさの最大値を表します。

  • Game Objects: このインスタンスで使える代替のプレハブを設定します。

Pressure Pad


Pressure Pad はプレイヤーが上を歩くと、光って音が鳴るように自動的に設定されています。Pressure Pad をトリガーイベントと接続して、踏むとドアが開くような仕掛けを作ることができます。



このプレハブの機能の大部分は、2 つのスクリプトで実現されています。


  • Send On Trigger Enter: あらゆる種類のゲームプレイインタラクションを生成します。これはコマンドシステムの一部です。Send On Trigger Enter スクリプトフィールドの概要は以下の通りです。コマンドシステムの使用方法の詳細については、コマンドシステムのページを参照してください。

  • Interaction Type: デフォルト設定:Open Pressure Pad が送信するコマンドのタイプです。これは純粋にラベルとして機能しますが、場合により複数のインタラクションを使い分けて設定するのがよいでしょう。Pressure Pad がドアを開けるために使用される場合は、Open が良い選択となります。トラップを非アクティブにする場合は、Deactivate が適しています。

  • Interactive Object: ここに設定されるのは、使用されている Pressure Pad に反応する Game Command Receiver です。例えば、ここにドアを設定すると、Pressure Pad はドアを開けるための仕掛けになります。

  • One Shot: デフォルト設定:true Pressure Pad を複数回使用できるかどうかを指定します。デフォルト設定だと 1 回しか使用できません。

  • Cool Down: デフォルト設定:1 One Shot が true ではない場合、Pressure Pad を再度使用できるようになるまでの時間を設定します。One Shot を含めてデフォルト設定になっている場合、この設定は何の効果も及ぼしません。

  • On Send Audio: Pressure Pad を踏んだときに再生するオーディオソースです。

  • Audio Delay: デフォルト設定:0 プレッシャーパッドを踏んでからオーディオが再生されるまでの時間です。

  • Layers: デフォルト設定:Player ここで設定されたレイヤーのゲームオブジェクトが上に載ったときに Pressure Pad はアクティブになります。デフォルトでは Ellen だけが Pressure Pad を起動できるので、レイヤーは Player だけが設定されています。

  • Interact On Trigger: Ellen がパッドの上に立っているときにアニメーションを再生します。

4. 3D ゲームキットのオブジェクト

接触を武器


キットには 2 種類の武器が用意されています。近接攻撃用の武器(Melee Weapon)と遠距離攻撃用の武器(Range Weapon)です。


Melee Weapon



Melee Weapon はゲーム中の 3 つのオブジェクトで使われています。


  • Ellen の杖

  • Chomper(噛みつき攻撃は Melee Weapon で実装)

  • Grenadier がパンチ攻撃するときの拳

Melee Weapon をつけて制御する武器は、Attack Points と呼ばれる、武器のどの部分でダメージを与えるかを定義する球体を持ちます。Attack Point は、Attack Root と呼ばれるゲームオブジェクトからの位置のオフセットと、サイズを表す半径で定義されます。


Attack Points は、シーンビューでは白い透明な球体として視覚化されます。



Range Weapon



ゲームでの Range Weapon の使用箇所は以下の通りです。


  • Spitter の吐く酸の弾

  • Grenadier の跳ね回る爆弾

Range Weapon をつけて制御する武器には 2 つの設定項目があります。


  • Muzzle Offset は発射物が出現する位置を表します。シーンビューでは、位置の確認がしやすいように、Muzzle Offset 黄色の十字で表示されています。

  • Projectile には武器から発射される発射物を指定します。

Projectile


Projectile は Projectile クラスを継承したカスタムスクリプトです。独自の発射物を作りたい場合は、Spitter の Spit を使えば簡単に自作することができます。



  • Shot Type: 使う発射物のタイプを指定します。

  • HIGHEST_SHOT: 設定した速度に基づく最も高い放物線を描いて発射されます。

  • MOST_DIRECT: 設定した速度に基づく最も平坦な放物線を描いて(つまり、最短距離で目標に飛んでいくように)発射されます。

  • LOWEST_SPEED: 発射した場所と目標の間を、できるだけゆっくり飛んでいくような放物線を描いて発射されます(キットではこの設定が使われています)。

  • Explosion Timer: この値が 0 より大きな値に設定されている場合、発射物は接触を検出して、設定した時間が経過した後に爆発します。0 以下の値を設定した場合は、発射物は接触を検出した瞬間に爆発します。

5. Enemy Controller スクリプト

Enemy Controller スクリプトは、具体的な敵キャラを制御するコンポーネントのベースになっているクラスです。以下のコンポーネントに共通のプロパティが含まれています。


  • ChomperBehaviour

  • SpitterBehaviour

  • GrenadierBehaviour

NavMesh Agent と Animator のマッチングを処理します。また、任意の力を設定することもできます(例えば、Chomper と Spitter が打撃を受けたとき、飛んでいく動きの表現に使用されます)。



パラメーター


  • Interpolate Turning: SetForward を呼んだ時、すぐに前方向を指定した値に設定するのか、navmeshAgent.angularSpeed フィールドで指定した速度で徐々に指定した方向に変化させるのかを指定するフラグです。このフラグが true に設定されている場合は、フレームをまたいで何度も SetForward を呼び出す必要があります。一般的には、これは Behaviour の Update を通して手動で SetForward を呼び出す場合に行われます。

  • Apply Animation Rotation: true に設定すると、アニメーションのルートモーションの回転を適用します。

各ビヘイビア(通常は SceneLinkedSMB を介します。詳細は次のステップを参照してください)は、Animator と NavMesh Agent の間で切り替わります。デフォルトでは、NavMesh Agent が優先されます。


NavMesh Agent プロパティ


これがデフォルトです。NavMesh Agent を優先するようにリセットするには、SetFollowNavmeshAgent に true を与えて呼び出します。


そのモードでは、敵キャラは NavMesh Agent で動かされ、速度は (animator.deltaPosition / Time.deltaTime).magnitude に設定されます。これにより、NavMesh Agent の速度とアニメーションの速度が一致します。


Animator プロパティ


SetFollowNavmeshAgent に false を与えて呼び出すことでこのモードに設定できます。このモードでは、アニメーションによって与えられた deltaPosition に基づいて、OnAnimatorMove 関数によって位置が設定されます。


例えば、Chomper の攻撃アニメーションでは、NavMesh のパス/方向と攻撃したい場所や距離をマッチさせるのではなく、このモードでアニメーションをさせています。


External Force


AddForce を呼ぶと、制御対象にその動きを変える力が加わります。FixedUpdate が呼ばれるたびに、その力に Gravity が加算され、制御対象は与えられた力の分だけ移動します。摩擦は加算されないので、力がかかり続けることになります。この機能の主な使い方は、短い時間に大きな力をかけて制御対象を押し戻すというものです。


ClearForce を呼ぶと、このモード以外のモードに戻ります。


6. 3D ゲームキットのダメージシステム

Damageable



Damageable は、ゲーム内の武器によってオブジェクトにダメージを与えることができるようにするためのコンポーネントです。オブジェクトが置かれているレイヤーによって、どの武器がダメージを与えることができるかが決まります(各武器にはダメージを与えることができるレイヤーのリストがあります)。


InvulnerabilityTime はデフォルトでは 0 に設定されています。 この数字の単位は秒で、0 より大きい値を設定すると、Damageable は最後にダメージを受けてからその秒数が経過するまで、ダメージを与えられても無視します。


HitAngleHitRotation は、オブジェクトに攻撃してダメージを与えられる方角を定義することができます。デフォルトでは角度は 360 に設定されているので、どこから攻撃してもダメージを与えることができますが、例えば 180 に設定すると、オブジェクトは半円の中でしかダメージを与えることができません。


Damageable をアタッチしたオブジェクトを選択すると、攻撃してダメージを与えられる範囲が赤い円で視覚化されます。


下の図は、後ろからしかダメージを与えられない Grenadier の例です。



さまざまなイベントについて、その発生時にそのイベントを何かのトリガーとして使うことができます。下の画像は壊すことのできる箱の Death(箱が壊された)イベントの例です。



この例では、壊された箱を無効化して、複数のパーツでできた別バージョンの箱を有効化し、適切なオブジェクトを親に設定して適切な場所に移して、サウンドを再生するトリガーとして Death イベントが使われています。


Checkpoints


これは Prefabs > Scenes > Checkpoint フォルダーに格納されています。シーン内に配置して、ステージを移動するときにプレイヤーが通れるようにコライダーのサイズを変更することができます。


プレイヤーがやられた時、最後に触れたチェックポイントの場所にリスポーンされます。


注意:プレイヤーはチェックポイントの位置でリスポーンされるので、チェックポイントは地上に置くようにしてください。


Damage Zone


このコンポーネントをオブジェクトに追加して、コライダーのサイズを調整して適当な大きさの領域をカバーするように設定します。Damageable が付いたオブジェクトがこの領域に入ると、そのオブジェクトに対して設定した量のダメージを与えることができます。


Death Volume


このコンポーネントをオブジェクトに追加して、コライダーのサイズを調整して適当な大きさの領域をカバーするように設定します。この領域にプレイヤーが入ると、即座にライフをすべて失います。例えば、キット内のゲームでは水にこのコンポーネントを使っています。


Contact Damager


Contact Damager は主に敵に使用され、接触するとプレイヤーにダメージを与える動きを実装します。トリガーにしたコライダーを持つゲームオブジェクトにこのコンポーネントを追加するだけで使用することができます。


注:このコンポーネントは、ダメージを与えられるものを定義するためにレイヤーシステムを使用しているため、他のダメージスクリプトとは分離しています。これは、トリガーイベントを生成するためには、そのコンポーネントを持つオブジェクトがプレイヤーと衝突するレイヤーにある必要があるためです。しかし、敵のレイヤーはプレイヤーと衝突しない(敵はプレイヤーの動きを妨げない)ため、スクリプトは別のレイヤー(プレイヤーと衝突するレイヤー)を持つ敵の子オブジェクトに追加して、その damagedLayer を Player レイヤーに設定する必要があります。


ScenelinkedSMB


SceneLinkedSMB は、StateMachineBehaviour から MonoBehaviour を簡単に高速に参照できるスクリプトです。SceneLinkedSMB は、特定の MonoBehaviour を参照する必要があればどこでも使用できるようにはなっていますが、ロジックと機能を分離することを考えて設計されていることは念頭に置いておくべきです。アニメーターコントローラーには、実行フローを制御するのに最適なステートマシンが含まれています。SceneLinkedSMB を使用することで、MonoBehaviour の public な関数を呼び出すことができ、シーン参照をより簡単に取得して、機能を制御することができます。このように、SceneLinkedSMB は、ステートマシンの一部としてロジックを制御し、機能を制御するためにリンクされた MonoBehaviours を制御することができます。


SceneLinkedSMB を使用してビヘイビアを作成するには、以下の手順に従います。


  1. SceneLinkedSMB を継承するクラスを作成し、そのジェネリック引数にアクセスしたい MonoBehaviour のタイプを指定します。例えば、Chomper の場合は次のようになります。

SceneLinkedSMB<ChomperBehaviour>


  1. それらを使用して、各オブジェクトの SceneLinked ビヘイビアを初期化します。例えば、ChomperBehaviour スクリプトの Start 関数で、以下の呼び出しを行います。

SceneLinkedSMB<ChomperBehavior>.Initialise(animator, this);


ここで、animator は、その SceneLinkedSMB を使う Animator への参照です。


  1. SceneLinkedSMB で、m_Monobehaviour メンバーは、Animator が動作しているオブジェクトを指します。

  1. 必要な関数(Enter, Exit, Update など)をオーバーライドして、必要なビヘイビアを実装します。

ヒント:プロジェクトが各ステートにリンクされたコードビヘイビアをどのように使用しているかの例については、名前に SMB を含むスクリプトを参照してください。


7. Target Scanner クラス

Target Scanner は、敵がプレイヤーの姿を見られるかどうかを検出するために使用するシンプルなクラスです。


パラメーター


  • height Offset: キャラクターの「目」がスキャナーを使用している高さを表します。0に設定したとき、レイキャストは遮蔽されない視線をオブジェクトのピボットの開始位置に持ちます。height Offset は、シーンビューでは黄色のワイヤーフレームで表された球体として表示されます。

  • detection Radius: スキャナーがプレイヤーを見つけることのできる範囲を示す、オブジェクトを中心とした円の半径です。detection Radius は、シーンビューでは青い円として表示されます。

  • detection Angle: スキャナーがプレイヤーを見つけることができる範囲を示す角度です。オブジェクトがプレイヤーに正対する方向を基準とした角度を表します。例えば、値が90であれば、スキャナーはプレイヤーに向かって細い円錐形の視界を伸ばす形になります。シーンビューの青い円弧は、上記の detection Radius の値を半径として、このパラメーターに設定した角度を中心角とした視界を表しています。

  • max Height Difference: オブジェクトのピボットとプレイヤーのピボットの間の高さの差の最大値を表し、高さの差がこの値に収まっている場合のみ、スキャナーはプレイヤーを検出できます。これは、プレイヤーの上または下にいる敵がプレイヤーを視線で捉えて、プレイヤーを追いかけて走り出すという挙動を避けたい場合に便利です。

  • viewBlockerLayerMask: スキャナーの視界を「遮る」とみなすレイヤーマスクを指定します。視線のレイキャストは、このパラメーターに指定したレイヤー内のオブジェクトに対してのみ衝突の判定を行います。

使い方


Monobehaviour のメンバーとして Target Scanner を使用し、敵からプレイヤーが見えているかチェックをしたいときに Detect を呼び出します。敵からプレイヤーが見えている場合はプレイヤーにアタッチされた PlayerController を返し、見えていない場合は null を返します。


ChomperBehaviour.cs の関数 FindTarget で使用例を見ることができます。


8. ゲームプレイに関するコンポーネント

コマンドシステム


ゲームキットにはゲームプレイの要素を互いにつなげるコマンドシステムが搭載されています。このシステムは、主に SendGameCommand、GameCommandReceive、GameCommandHandler の 3 つのスクリプトを使って動作します。


SendGameCommand スクリプトは、キャラクターが圧力パッドを踏んだときなど、いつ何かが起こるかを決定します。そして、Activate、Close、Stopなどの特定のタイプの「コマンド」を送信します。


このコマンドは GameCommandReceiver スクリプトによって受信されます。このスクリプトには、受信したコマンドに対して実行されるさまざまなアクションのコレクションがあります。例えば、Activate コマンドを受信すると、その特定のコマンドを待っていた 3 つのハンドラに対してアクションを実行します。


GameCommandHandler は、コマンドの結果が出力される場所です。その結果とは、ゲームオブジェクトを有効にする、サウンドを再生する、といった内容です。GameCommandHandler スクリプトが反応するためには、GameCommandReceiver スクリプトがアタッチされているものと同じゲームオブジェクトにアタッチされていることが重要です。このようにして、GameCommandReceiver 特定のコマンドを待つように登録を行います。


コメントが送信されるきっかけとなる現象はいくつかあり、これらのケースをカバーするために SendGameCommand を継承したクラスがいくつかあります。SendOnBecameInvisible、SendOnBecameVisible、SendOnCollisionEnter、SendOnCollisionExit、SendOnCollisionStay、SendOnTriggerEnter、SendOnTriggerExit、SendOnTriggerStay などがそうしたクラスの例です。


また、コマンドによって引き起こされる結果もいくつかあるので、GameCommandHandler を継承したクラスもいくつかあります。MovingPlatform、TriggerUnityEvent、ToggleGameObjectActive、SwitchMaterial、StartPlayableDirector、SimpleTransformer、SimpleRotator、SimpleTranslator、SetGameObjectActive、SetAnimatorTrigger、RespawnPlayer、PlaySound、PlayAnimation、ParticleSystemEmitMovingPlatform、TriggerUnityEvent、ToggleGameObjectActive、SwitchMaterial、StartPlayableDirector、SimpleTransformer、SimpleRotator、SimpleTranslator、SetGameObjectActive、SetAnimatorTrigger、RespawnPlayer、PlaySound、PlayAnimation、ParticleSystemEmit、GameplayCounter がそうしたクラスの例です。GameCommandHandler は抽象クラスで、このクラスそのものとしては存在せず、先ほどリストアップした派生クラスの 1 つとして存在していることに注意してください。


例えば、Ellen が圧力パッドの上に立ったらドアを開けたい場合、SendOnTriggerEnter スクリプトを使用して、エレンが圧力パッドの上に立ったときに Open コマンドを GameCommandReceiver スクリプトに送信します。ドアが開く時にドアがアニメーションして音を出すようにしたいので、GameCommandReceiver をリスンする SetAnimatorTrigger スクリプトと PlaySound スクリプトを用意しておきます。


Send Game Command


これはコマンドを生成するための基本となるクラスです。例として、DoorHuge プレハブはこのクラスを使用して Grenadier を起動します(Assets > 3DGamekit > Scenes > Level1 シーンを開き、Hierarchy ウィンドウで Level01Gameplay > DoorHuge を選択して確認してみてください)。



  • Interaction Type: デフォルト設定:送信されるコマンドのタイプを識別します。これはラベル付けにのみ使用され、コマンドの最終的な効果には影響しません(ドアを開くコマンドは、ハンドラが Spawn に反応するように設定されている限り、Open と同じくらい Spawn を簡単に使用できます)。コマンドのタイプは、他には NoneActivateDeactivateOpenCloseSpawnDestroyStartStop があります。

  • Interactive Object: これは、さまざまなコマンドのハンドラーを収集する Game Command Receiver です。

  • One Shot: デフォルト設定:false このコマンドを複数回送信できるかどうかを指定します。

  • Cool Down: デフォルト設定:1 One Shot を false に設定した場合、コマンドを再度送信できるようになるまでの時間を設定します。

  • On Send Audio: ここに任意で Audio Source を設定することができ、コマンドを送信するとオーディオクリップが再生されるといった仕組みを作ることができます。このスロットには、Audio Source コンポーネントを持つ任意のゲームオブジェクトを割り当てることができます。

  • Audio Delay: デフォルト設定:0 On Send Audio Audio Source が設定されている場合、コマンドが送信されてからどのくらいの時間でオーディオが再生されるかを決定します。

詳細については、Send Game Command サブタイプを参照してください。


Game Command Receiver


このスクリプトは、ゲームコマンドのタイプと、それぞれのコマンドタイプをリスンするハンドラーを集めたものです。これは、送信されるコマンドと処理されるコマンドをつないで整理するシステムです。



このスクリプトにフィールドを設定する必要はありません。このレシーバーに送信されるコマンドは、Send Game Command スクリプトによって制御され、それらのコマンドをリスンするハンドラーは、Game Command Handler スクリプトによって制御されます。


Game Command Handler


これはコマンドを扱うための抽象基底クラスです。このクラスは抽象クラスなので、基本クラスそのままではなく、子クラスの 1 つとして存在します。すべての Game Command Handler には共通して以下のフィールドがあります。


  • Interaction Type: デフォルト設定:None リスンされるコマンドのタイプを識別します。これはラベル付けのためにのみ使用され、コマンドの最終的な効果には影響しません(ドアを開けるハンドラは、送信者が Spawn コマンドを送信するように設定されている限り、Spawn タイプは Open と同様に簡単に使用することができます)。用意されているタイプは、NoneActivateDeactivateOpenCloseSpawnDestroyStartStop です。

  • Is One Shot: デフォルト設定:false この反応が繰り返し起こるかどうかを指定します。

  • Cool Down: デフォルト設定:0 Is One Shot が false の場合、ここに設定した値が、このハンドラーが再度トリガーできるようになるまでの時間を表します。

  • Start Delay: デフォルト設定:0 コマンドを受信してから、コマンドが処理されるまでの時間を指定します。

詳細については、Game Command Handler サブタイプを参照してください。


Send Game Command サブタイプ


以下のサブセクションでは、Send Game Command スクリプトの代わりに使用できるクラスを紹介します。各クラスには Send Game Command フィールドが含まれており、いくつかは追加のフィールドを持っています。


Send On Became Invisible


ゲームオブジェクトがシーン内のどのカメラからも見えなくなると、このコンポーネントが起動してコマンドを送信します。このスクリプトは、MonoBehaviour クラスの OnBecameInvisible 呼び出しからコマンドを送信します。このスクリプトには追加フィールドはありません。



Send On Became Visible


GameObject がシーン内の任意のカメラで表示されるようになると、このコンポーネントが有効になりコマンドを送信します。このスクリプトは、MonoBehaviour クラスの OnBecameVisible 呼び出しからコマンドを送信します。このスクリプトには追加フィールドはありません。



Send On Collision Enter


ゲームオブジェクトが指定されたレイヤー内にある他のオブジェクトと衝突したとき、このコンポーネントが有効化されてコマンドを送信します。このスクリプトは、MonoBehaviour クラスの OnCollisionEnter コールからコマンドを送信します。



  • Layers: コマンドを送信するきっかけとなる衝突に関与するゲームオブジェクトのレイヤーに対して適用されるレイヤーマスクを指定します。

Send On Collision Exit


ゲームオブジェクトが指定されたレイヤー内にある他のオブジェクトと衝突し、その衝突から抜けると、このコンポーネントが有効化されてコマンドを送信します。このスクリプトは、MonoBehaviour クラスの OnCollisionExit コールからコマンドを送信します。



  • Layers: コマンドを送信するきっかけとなる衝突を発生させることができるゲームオブジェクトのレイヤーに対して適用されるレイヤーマスクを指定します。

Send On Collision Stay


このゲームオブジェクトが指定されたレイヤー内にある別のオブジェクトと衝突した場合、SendOnCollisionEnter コンポーネントが有効化された後、このコンポーネントが有効化され、オブジェクトが衝突状態のままになります。このスクリプトは、MonoBehaviour クラスの OnCollisionStay コールからコマンドを送信します。



  • Layers: コマンドを送信するきっかけとなる衝突を発生させうるゲームオブジェクトのレイヤーに対して適用されるレイヤーマスクを指定します。

Send On Trigger Enter


このコンポーネントがトリガーになっているコライダーにアタッチされている場合、指定されたレイヤーにある別のオブジェクトと衝突すると、このコンポーネントが有効化されてコマンドを送信します。このスクリプトは、MonoBehaviour クラスの OnTriggerEnter コールからコマンドを送信します。


次の画像は、立方体のトリガーを使用した圧力パッドを示しています。Send Open は送信されるコマンドを示しており、白い矢印がターゲットとなるオブジェクトに向かっています。



  • Layers: コマンドを送信するきっかけとなる衝突を発生させうるゲームオブジェクトのレイヤーに対して適用されるレイヤーマスクを指定します。

Send On Trigger Exit


このコンポーネントがトリガーになっているコライダーに接続されている場合、指定されたレイヤー内にある別のオブジェクトとの衝突により、このコンポーネントが有効化され、ゲームオブジェクトが衝突領域から離れると、このコンポーネントからコマンドが送信されます。このスクリプトは、MonoBehaviour クラスの OnTriggerExit コールからコマンドを送信します。



  • Layers: コマンドを送信するきっかけとなるトリガーイベントに関与するゲームオブジェクトのレイヤーに対して適用されるレイヤーマスクを指定します。

Send On Trigger Stay


このコンポーネントがトリガーになっているコライダーに接続されている場合、指定されたレイヤー内にある別のオブジェクトとの衝突により、このコンポーネントが有効化され、ゲームオブジェクトが衝突領域内にある間、毎フレームこのコンポーネントからコマンドが送信されます。このスクリプトは、MonoBehaviour クラスの OnTriggerStay コールからコマンドを送信します。



  • Layers: コマンドを送信するきっかけとなるトリガーイベントに関与するゲームオブジェクトのレイヤーに対して適用されるレイヤーマスクを指定します。

9. Game Command Handler のサブタイプ

以下のサブセクションは、Game Command Handler の機能を持つ特別なコンポーネントに関するものです。Game Command Handler で共通のフィールドに加えて使用される追加のフィールドをリストアップしています。


Moving Platform


このコンポーネントを使用して、予測可能なパスで移動するプラットフォームを制御します。このコンポーネントは Project ウィンドウの Prefabs > Interactables に格納されています。このタイプの Game Command Handler の詳細については、動くプラットフォームに関するチュートリアルページを参照してください。


Interact On Trigger が付いたライフ回復アイテム


壊すとプレイヤーのライフを回復する、ライフ回復アイテム(HealthCrate)プレハブは、Interact On Trigger の良い使用例です。このプレハブは、Project ウィンドウの Prefabs > Interactables にあります。HealthCrate プレハブは、下の画像のように Interact On Trigger スクリプトを使用します。



インスタンス化した段階では、Interact On Trigger スクリプトのイベントが 1 つ設定されていない状態になっています。このイベントが発生したとき、プレイヤーは自分のライフがリセットされることを知らされる必要があります。これを行うには、シーンから Ellen を関数を呼び出す対象のゲームオブジェクトとして選択します。次に、関数のドロップダウメニューから、Damageable > ResetDamage() を選択します。


これで、Ellen がシーンのライフ回復アイテムにぶつかるとライフが回復するようになりました。


Trigger Unity Event


コマンド送信時に Unity イベントを呼び出します。



  • Unity Event: コマンド送信時に呼ばれるイベントをここに設定します。

Toggle Game Object Active


このクラスは、ゲームオブジェクトのコレクションの有効、無効を切り替えます。各ゲームオブジェクトが有効の場合は無効に、無効の場合は有効に切り替えます。



  • Targets: 有効、無効の切り替えを行うゲームオブジェクトのコレクションをここに設定します。

Switch Material


このクラスは、レンダラーのマテリアルを順番に変更することで、ゲームオブジェクトの外観を変更します。


このコマンドは GameCommandReceiver で、これはターゲットのオブジェクトのマテリアルを切り替えるものです。コマンドを受信するたびに、マテリアルのリスト中で、その時適用されているものの次のマテリアルが適用されます。リストの最後のマテリアルが適用されているときにこのコマンドを受信すると、リストの最初のマテリアルに戻ります。



  • Target: マテリアルを順番に変更させるレンダラーを指定します。

  • Materials: 順番に切り替えていくマテリアルのリストを設定します。インデックス 0 のマテリアルは、レンダラーのデフォルトのマテリアルとなります。よって、コマンドを初めて受信して処理したときには、インデックス 1 のマテリアルが使用されます。

Start Playable Director


このクラスはコマンドが処理されるとタイムラインを開始するクラスです。また、タイムラインが再生を開始したり終了したりするときに呼び出されるイベントも持っています。



  • Director: 再生するタイムラインを参照する Playable Director を指定します。

  • On Director Play: タイムラインが再生を開始する直前に呼び出されるイベント。

  • On Director Finish: タイムラインが終了した直後に呼び出されるイベント。これは時間指定された Invoke を使って動作します。もし何かがタイムラインの長さを変更したり、Time.timeScale を変更せずに一時停止した場合、イベントはタイムラインの終了と一致しない可能性があります。

Simple Rotator


ゲームオブジェクトを回転させたいが、アニメーションを使うほどでもないときにこのクラスを使います。このコマンドは GameCommandReceiver です。指定されたコマンドを受信すると、トランスフォームを回転します。



  • Loop Type: デフォルト設定:Once これは、Duration の時間が経過した時のゲームオブジェクトの動作を制御します。

  • Once 回転を繰り返しません。

  • PingPong ゲームオブジェクトはその軸を中心に順方向と逆方向の回転を交互に繰り返します。

  • Repeat Duration の時間が経過するたびに最初の位置に戻って、回転を続けます。

  • Duration: デフォルト設定:1 回転動作を実行する時間の長さを秒単位で指定します。

  • Accel Curve: 時間経過により回転速度がどのように変化するかを指定します。

  • Activate: デフォルト設定:false ゲームオブジェクトが、コマンドを受信して回転を行う状態であるかを指定します。

  • On Start Command: 回転開始時に送信するコマンドを指定します。

  • On Stop Command: 回転停止時に送信するコマンドを指定します。

  • On Start Audio: 回転開始時に再生する音声を指定します。

  • On Stop Audio: 回転停止時に再生する音声を指定します。

  • Preview Position: このスライダーで指定した位置でのコンポーネントの動作のプレビューを行えます。

  • Axis: デフォルト設定:(0, 0, 1) ゲームオブジェクトの回転軸をローカル空間のベクトルで指定します。

  • Start: デフォルト設定:0 ゲームオブジェクトが回転を開始するときの軸周りの角度です。度数法で指定します。

  • End: デフォルト設定:90 ゲームオブジェクトが回転を停止するときの軸周りの角度です。度数法で指定します。

Simple Translator


ゲームオブジェクトのリジッドボディを指定された開始位置から指定された終了位置に移動するクラスです。このコマンドは GameCommandReceiver です。指定されたコマンドを受信すると、トランスフォームの移動を行います。


次の画像は GameCommandReceiver のついているオブジェクトの例です。Recv Open ラベルがありますが、これは Open コマンドを受信したときにこのゲームオブジェクトが反応することを示しています。白い矢印は、コマンドが入力されてくる方向を示しています。




  • Loop Type: デフォルト設定:Once これは、Duration の時間が経過した時のゲームオブジェクトの動作を制御します。

  • Once 移動を繰り返しません。

  • PingPong ゲームオブジェクトはそのパスを行ったり来たりします。

  • Repeat Duration の時間が経過するたびに最初の位置に戻って、回転を続けます。

  • Duration: デフォルト設定:1 パスの移動にかける時間の長さを秒単位で指定します。

  • Accel Curve: 時間経過により移動速度がどのように変化するかを指定します。

  • Activate: デフォルト設定:false ゲームオブジェクトが、コマンドを受信して移動を行う状態であるかを指定します。

  • On Start Command: 動作開始時に送信するコマンドを指定します。

  • On Stop Command: 動作停止時に送信するコマンドを指定します。

  • On Start Audio: 動作開始時に再生する音声を指定します。

  • On Stop Audio: 動作停止時に再生する音声を指定します。

  • Rigidbody: 移動させるゲームオブジェクトの rigidbody コンポーネントを指定します。移動させるリジッドボディは、このスクリプトをアタッチしているゲームオブジェクトと同じゲームオブジェクトにアタッチしていないものを指定するようにしてください。通常、ここで指定するリジッドボディはこのスクリプトがアタッチしているゲームオブジェクトの子になります。そのリジッドボディは、このスクリプトがアタッチしているゲームオブジェクトに対する相対座標を使って移動を行います。

  • Start: デフォルト設定:(0, 0, -1) リジッドボディが移動を開始する位置を、ローカル空間座標で指定します。

  • End: デフォルト設定:(0, 0, 1) リジッドボディが移動を停止する位置を、ローカル空間座標で指定します。

Set GameObject Active


このクラスは ToggleGameObjectActive クラスと同様に動作します。ただし、往復動作をする代わりに、各ゲームオブジェクトの有効/無効状態が切り替わります。



  • Targets: 有効/無効状態の設定対象となるゲームオブジェクトを指定します。

  • Is Enabled デフォルト設定:true Targets で指定されたゲームオブジェクトに対して設定される有効/無効の状態を指定します。

Set Animator Trigger


このクラスは、コマンドを受信したときの Animator のトリガーパラメーターを設定します。



  • Animator: トリガーパラメータを設定する Animator コンポーネントを指定します。

  • Trigger Name: 設定されるトリガーパラメーターの名前を指定します。

Respawn Player


このクラスは単純に Player Controller の Respawn 関数を呼び出します。これにより、シーンがフェードアウトし、Ellen は最後に触れたチェックポイントに戻されます。



  • Player: Ellen の PlayerController スクリプトへの参照を指定します。

Play Sound


このクラスは、オーディオソースのコレクションに割り当てられたオーディオクリップを再生します。オーディオソースは別途設定する必要があります。



  • Audio Sources: コマンドを受信したときに再生するオーディオソースを指定します。

Play Animation


このクラスは、アニメーションコンポーネントのコレクションに割り当てられたアニメーションクリップを再生します。アニメーションコンポーネント自体は別途設定する必要があります。



  • Animations: コマンドを受信したときにアニメーションを再生するアニメーションコンポーネントを指定します。

Particle System Emit


このクラスでは、パーティクルシステムのコレクションにある各パーティクルシステムに、指定した数のパーティクルを放出させます。



  • Particle Systems: コマンドを受信したときにパーティクルを放出するパーティクルシステムを指定します。

  • Count: 各パーティクルシステムが放出するパーティクルの数を指定します。

Gameplay Counter


このクラスは他の GameCommandHandler とは少し違い、コマンドが処理されるまでに何らかの事象を複数回発生させる必要がある場合に、コマンドが処理されるまでの中間的なステップを処理するという動作をします。選択されたコマンドが受信された回数をカウントし、必要なカウント数に達すると、指定された GameCommandHandler が動作します。



  • Current Count: デフォルト設定:0 現時点でコマンドを受け取った回数を表します。

  • Target Count: デフォルト設定:3 GameCommandHandler が動作するまでに受け取る必要のあるコマンドの回数を指定します。

  • On Increment Send Command: カウントがインクリメントされるたびに送信されるコマンドで、指定は任意です。Target Count に達したときは、コマンドは送信されません。

  • On Increment Perform Action: ハンドラーを指定すると、カウントがインクリメントされるたびにアクションを実行させることができます。指定は任意です。Target Count に達したときは、アクションは実行されません。

  • On Target Reached Send Command: Target Count に達したときにコマンドを送信させることができます。指定は任意です。

  • On Target Reached Perform Action: ハンドラーを指定すると、Target Count に達したときにアクションを実行させることができます。指定は任意です。

Simple FX Synth


SimpleFXSynth コンポーネントは、ゲームのサウンドエフェクト用の AudioClip を生成するために使用されます。



  • Fx Name: 再生モードでは、Fx Name フィールドは、すべての SimpleFXSynth インスタンス間で AudioClip を共有するために使用されます。つまり、一意なサウンドエフェクトは、それぞれ一意な Fx Name を必要とします。

  • Duration: AudioClip の長さを秒単位で指定します。

  • Layers: SynthLayer オブジェクトのスタックです。各 SynthLayer オブジェクトにはオシレーターがあり、AudioClip の長さに応じて周波数と音量のエンベロープが適用されます。オシレーターからの出力は、カットオフと反響のエンベロープを持つフィルターに送られます。このエンベロープも、AudioClip の長さに応じて適用されます。

  • Audio: AudioClip を再生するオーディオソースを指定します。

Complete this tutorial