PlayMaker, playMaker,

本記事では、Unity内でPlayMakerを使って主観シューティングゲームを作り、それをSTYLYエディタにエクスポートすることを目的とします。

1〜7まで続いてますので、セットで確認することでより流れが理解できると思います。今回は、銃コントローラにEnemy Counter & Spawnerの設定をする方法をご紹介します。

 

[7] Enemy Counter & Spawnerの設定

画面上の敵の数を管理するためにカウンターオブジェクトを作っていきます。

こういった管理用のオブジェクトを作ることで、ゲーム内に存在する細々としたオブジェクトと関わりを持たせ、プロジェクトそのものによりよい構造的な整いをもたらすことができ、いくつものゲームオブジェクトのFSM内の設定を変更する必要がなく、一つの場所でより簡単に高いレベルの編集を加えることができるようになります。

それでは新しく空のゲームオブジェクトをScene Hierarchy内に作り、enemyCounterと名前をつけましょう。

 

FSMをenemyCounterに付け加え、整合性のために開始ステートにSetupと名前をつけます。

 

「addEnemy」と「subtracetEnemy」と言った名前でこのFSM内にイベントを二つつくり、名前の横のボックスにチェックを入れてグローバルイベントにし、ゲーム内のFSMを持った他のオブジェクトからアクセスできるようにします。

 

対応させた名前のついたグローバルイベントをそれぞれに追加します。FSMは次の図のようにしてください。

 

Int AddアクションをAdding Enemyステートに追加し、Addを1に設定し、名前の通り、シーン内で敵の数をカウントするために使われるenemyCountという新しいInt Variableに追加されるようにします。

 

Subtracting Enemyステートにも全く同じことをしますが、今回は値を-1に設定します。これはシーン内における敵の数のカウントを1ずつ減らしていくためです。

 

Subtracting Enemyステート内でVariablesタブをクリックしmaxEnemiesという新しい変数を作ります。この値は20西ます。後ほど、これは画面内にいる敵の数を制限しゲームの遅れを避けるために使います。

 

maxEnemiesはIntとして設定しておきます。

 

次に空のゲームオブジェクトをScene Hierarchy内に作り、「enemySpawner」と名前をつけます。さらにそれがPlayMaker Tutorial Gameの子要素であることに注意します。それによりSTYLYに後ほどエクスポートするプレハブ内に含まれることになります。

 

enemySpawner内に新しいFSMを作り、上の図のように初めのステートである「Setup」と名前をつけます。この開始ステート内にmaxEnemiesという新しい変数を作ります。これはenemyCounter FSM内のmaxEnemies変数と全く同じ名前でなければなりません。これがなぜかはすぐにわかると思います。

 

enemySpawner用のSetupステート内にも次の写真のように新しいGet Fsm Variableアクションを作ります。

 

Game ObjectドロップダウンメニューからSpecify Game Objectを選択し、Scene HierarchyからenemyCounterオブジェクトにドラッグして、Game ObjectenemyCounterとして指定します。

次に、enemySpawner内で作成した変数maxEnemiesに値を格納します。これをするのは、STYLYplayMakerのグローバル変数の使用をサポートしていないからです。グローバル変数は、通常、異なるオブジェクトに接続された複数のFSM間で情報をやりとりするために使用されます。この場合、enemy counterとenemy spawnerの両方が最大敵数を知る必要があるため、グローバル変数のように機能する変数が必要です。

しかし、グローバル変数を使用することはできないため、Get Fsm Variableアクションを使用して強制的にハックすることになります。これで別のオブジェクトの変数の値を別のオブジェクトの同じ名前にコピーします。ここでは、変数の名前はmaxEnemiesにします。これは、二つの異なる変数を個別に設定し敵の最大数を調整する際に両方とも変更することもできましたが、一つの場所で変更したら全てが変更できるので敵の数を変更するのにもっとも簡単な方法だと思います。これこそプログラマーが最初に変数を利用する理由だと思います。

次に、新しくInt変数を作ってenemyCountとします。これは敵の数をカウントするために使います。

 

次に、Setupステートの完了時にWaitingという新しいステートへの遷移を作成し、そのステートの完了時に「Checking Number of Enemies」というステートに遷移するように設定します。

 

「Checking Number of Enemies」ステート内で新しくGet Fsm Variableアクションを追加し、enemyCounterオブジェクトからmaxEnemies変数を取得したときのSetupステート内と同じように、Game ObjectをenemyCounterとして指定します。しかしながら今回はenemyCount変数を取得したいので、Store ValueをenemyCountに設定します。maxEnemiesとenemyCountの両方の変数は、enemyCounterとenemySpawnerで共有されます。

 

今度はspawn enemyと呼ばれる新しいイベントを作成し、それをChecking Number of Enemiesステートに追加します。

 

これが完了したら、enemyCountとmaxEnemiesを比較するInt Compareアクションを作成し、enemyCountが少ない場合(Integer 1がInteger 2未満の場合)、spawn enemyイベントをトリガーします。

「Every Frame」ボックスがチェックされていることを確認してください。これでゲームがシーン内の敵の数を常に確認してくれます。

 

次に、Spawn Enemyステートに遷移を加えます。 これが終了すると、Waitingステートに戻ってこさせます。

 

サークル上でランダムに敵を生み出すに当たって少し計算をしてあげる必要があります。

まず、 “radius”という新しいfloat変数を作成し、その値を76に設定します。これは、敵を生み出すのに欲しい円周の半径です。

 

また、Scene Hierarchy内のenemySpawnerオブジェクトのTransformコンポーネントでenemySpawnerの位置を(0,0,0)に設定してください。これにより、アリーナの真ん中にサークルを配置します。これで敵はすべての方向においてプレーヤーから均等に離れたところで生成されます。

 

円上の任意の点を選択するには、基礎的な三角法を少し使用します。 次のような円を考慮する場合:

赤と青の矢印の交点を(0,0)とすると、sinとcosineを使って赤い矢印の先端のx座標とy座標を簡単に調べることができます。

 

x = rcosθ

y = rsinθ

 

ゲーム内の円形アリーナに関してはすでに半径があり、ベクトルの開始位置(0,0)もあります。これはenemySpawnerを配置する場所であるため、円上にランダムな点を取得するために全く同じ計算が使えます。

 

ここではランダムな角度θを選ぶだけです。そのθについては、上記のようにx座標とy座標を計算する必要があります。

playMakerでこれを行うために必要なステップは、下の画像に示されているとおりです。

 

 

最初に0から360度までのランダムな浮動小数点数を取得し、randomThetaという変数に格納します。これはランダム変数として機能します。この変数のコサインを取得し、xCoordという新しい変数に格納します。playMakerのコサイン(cosine)はラジアン単位の角度で動作するため、Deg to Rad変換ボックスも必ずチェックを入れてください。xCoordの値に半径を掛けます。これは76に設定していました。同じrandomTheta変数を使用して、サイン(sine)を取得します。今回もラジアンに変換してから同様の浮動小数点数を半径で掛けます。これで、ランダムに敵を発生させるための最終的なx座標とy座標が得られました。

 

最後のステップは、positionと呼ばれるベクトル変数にそれらを格納し、Unityではz軸が水平面内にあるのでxをxCoordに、zをyCoordに設定します。一般的な慣例としてxとyをサークルジオメトリに使用しました。最後に、ベクトルのy値を1に設定します。これにより、敵を正確に正しい高さに配置し、ステージ上に立っているように見えます。

ここで、Create Objecetアクションを追加し、オブジェクトがpositionに表示されるように設定します。サークル上のランダムな点がベクトルとして保存されます。Game Objectフィールドは空白のままにしておきます。敵キャラクターのプレハブを作成し、後でこれを埋めて戻します。

 

また、enemy counterも更新する必要があります。enemyCounterにaddEnemyというグローバルイベントを作成しており、このイベントをenemySpawnerオブジェクトのFSMから呼び出し、敵のカウント数が増加していることを確認します。

enemySpawnerの下で、Event Browserをクリックし、addEnemyを検索します。 次に、Add Selected Eventをクリックします。

 

次に、Spawning Enemyステートをクリックし、Send Eventアクションを追加してaddEnemyイベントをenemyCounterオブジェクトに送ります。

 

後で敵のプレハブを追加する以外はcounterとspawnerシステムはこれで完了です。今度は敵を作っていきましょう。

[関連記事]
PlayMakerの利用 -1-
PlayMakerの利用 -2-
PlayMakerの利用 -3-
PlayMakerの利用 -5-
PlayMakerの利用 -6-
PlayMakerの利用 -7-

“PlayMakerの利用 -4-” への1件のコメント

  1. 畠山草平 より:

    https://drive.google.com/open?id=1HWgcFvqpoZfwKhKVGzuvfBTPpiqIG-Se

    上記キャプチャ内のSpawner Enemyの解説の画像についてGetPositionアクション、RandomFloatアクションなどの詳細がCreateObjectアクションのように開いているスクリーンショットがあると嬉しいです。
    (説明画像が2枚同じものが続いています)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Miyuki Yasuzawa

デジタルハリウッド東京本校卒業後、今はフリーランスデザイナーです。主に動画制作、プロジェクションマッピング制作などをしていて、HP制作や英訳もたまにやります。宇宙と読書が好きです。

Share this article

Shares
Facebook Twitter Google+ Pinterest hatebu

About STYLY

STYLYは、VR空間を駆使した新たな表現・体験を生み出せるクリエイティブプラットフォームです。 STYLYを活用することで、コンセプチュアルなショップ空間やインスタレーション、ギャラリーなど クリエイターのイマジネーションを際限なく表現した多彩な空間を構築できます。 またその空間を通じて、今までの現実では成し得なかった体験をインターネットの世界へシェアすることができます。
 

Unity

Unityで制作されたコンテンツをお持ちの方へ
Unityシーンアップロード機能を活用すれば簡単にVR化が可能に!

Click here

×