PlayMaker, playMaker,

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

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

 

[5] 銃コントローラの設定

銃と銃弾の周りを移動する銃コントローラを作成して、ゲームを開始します。ここでは有限状態マシン(FSM – Finite State Machine)、イベント、アクションの基本的な紹介もします。これは様々なplayMakerゲームを作る上でのコアコンセプトになります。

まず、PlayMaker Tutorial Gameに空の子オブジェクトを作成し、gunController_Rという名前を付けます。ここには右手の銃コントローラ要素が入っていきます。のちにこれを複製し、少し変更を加えて左手の銃コントローラを作ります。

(ちなみに、これ以降イメージ図を通じてScene Hierarchy内にplaymaker GameFinishedというオブジェクトが表示される場合がありますが、これはこのチュートリアルを作成する目的でのみ存在するため、作成されているプロジェクト内に存在しなくても驚かないでください。)

 

次に、gunController_Rを選択したまま、PlayMakerエディタで右クリックし、[Add FSM]を選択してオブジェクトにFSMを追加します。

 

FSM(有限状態マシン)は、異なるステート(状態)間の遷移に基づいて動作するシステムです。これにはオブジェクトの現在の状態を表すステート(State)と、オブジェクト間に遷移をもたらすイベント(Event)が必要です。

簡単な例としてはドアの開閉が挙げられます。この現象を表すFSMのステートは「開く」と「閉じる」の2つで、これら遷移は「open door」と「close door」と呼ばれるでしょう。このチュートリアルを通じて、これらの概念や、それらがどのようにplayMakerで使用されているか理解が深まると思います。

それでは、もう一度右クリックし、メニューから[Add State]を選択して、ゲームにステートを​​追加します。ステートの名前はSetupにします。これにより、銃コントローラオブジェクトの初期設定がすべて実行されます。

 

Actionsウィンドウに移動し、[Find Game Object]アクションを検索し、それをクリックしてSetupステートに追加します。

 

 

次に、Object Nameに探したい「Controller (right)」を入力・検索し、「controller」という新しい変数の中に保存します。

 

このアクションの目的は、シーン内で適切なコントローラを見つけて、このFSM内で使う変数を格納し、そこで特定のアクションを実行します。これは、グラフィカルインタフェースであるということを除けば、通常のプログラミングと同じように機能します。

次に、さきほど格納したコントローラの変数にGet Positionアクションを追加し、オブジェクトを設定することでシーン内のコントローラーの位置を取得します。これが右手のコントローラーとなります。

この位置は、controllerPositionというベクトル変数に格納されます。これは後で使用します。

 

controllerRotationと呼ばれる変数内にコントローラーの現在の回転を格納します。あるベクトルにx、y、z方向の回転角度を格納するために、「Euler Angles(オイラー角)」オプションを用いて、controllerRotation変数内にこれら角度を格納していきます。

 

アセットリストからRainbowCrossbowアセットを見つけます。これはFPL_ISBITのWeaponsPack > 3Dの中にあります。

 

これをScene Hierarchyにドラッグします。これによりUnity Scene Editor内で編集した後にプレハブにすることができます。Rainbow CrossbowのScaleは0.2、0.2、0.2に設定してゲーム内でサイズが正しくなるようにしておきます。

 

RainbowCrossbowの子オブジェクトにSphere(球体)をつくります。これは銃弾の発生源となります。

 

この球体をボーガンの先端部に移動し、インスペクタ内のボックスのチェックを外してMesh Rendererを無効化します。これでこの球体が位置するところが銃弾の発生源となりますがプレイヤーには球体は見えていません(見える必要がないため)。

 

RainbowCrossbowオブジェクト全体をmyPrefabsフォルダにドラッグして、一つのプレハブにしてしまいます。これで本ゲーム用にカスタムしたプレハブ第1号ができました!Unityでは非常に簡単にオブジェクト全体の構成を作ってこのようにプレハブにすることができます。

playMakerの利点は、シーンに戻したときにプレハブの全てのインスタンスがプロパティとFSMコードと完全に同じものを持つことです。また、Scene Hierarchyに戻すことなく、直接プレハブのFSMコードを編集することができます。

尚、球体の名前をspawnPointSphereとしておきましょう。シーン内で見つけやすくなります。

 

これが完了しプレハブができたら、RainbowCrossbowはScene Hierarchyから削除し整頓します。

 

次にRainbowCrossbowプレハブをコントローラにつなげ、実際の銃を作っていきます。右手の銃コントローラが選択された状態で、そのFSMに移動し、Create Objecetアクションを加えます。追加したいオブジェクトはRainbowCrossbowプレハブで、アクションのGame ObjectフィールドにプレハブをドラッグしてくるだけでOKです。その位置と回転をコントローラの位置と回転に設定することで、完全に同じ方向に向きます。これには先ほど作ったcontrollerPositionとcontrollerRotation変数を用います。最後に、これを「crossbow」という新しい変数として保存します。後ほどこれを参照しにくることになります。

 

事前にcrossbowとコントローラの関係を実験したところ、ユーザーがcrossbowを打つのに最も快適な形でVRコントローラーを握るには、crossbowをx軸に40度回転させると最も平行になることがわかりました。

次の図の中でアクションブラウザからRotationアクションを追加するように回転の角度を設定します。

 

回転を一度実行したいだけないので「Every Frame」のチェックを外してください。

次に、Set Parentアクションを作り、crossbowの親がコントローラとなるように設定します。crosswbowがコントローラの子としていかなる時もコントローラについて動きます。

 

Get Childアクションを加えてspawnPointSphereというcrossbowオブジェクトの子を探します。これはRainbowCrossbowプレハブの作成時にUnity Scene Editor内で直接設定したプロパティと同じものを持つ球体です。後で参照しやすいようにspawnPointSphereという新しい変数内にこの子要素を格納します。

 

ここでコントローラ用のモデルを削除してcrossbowモデルを見た目的に邪魔しないようにします。もう一つGet Childアクションを作って、「Model」というコントローラオブジェクトの子要素を探します。これはVRコントローラ用の3Dモデルを含んでいます。controllerModelという変数内に結果を格納しておきます。

 

次に、Destroy  ObjectアクションとともにcontrollerModel変数を削除し、コントローラからなくしてしまいます。

 

これはScene Hierarchy内で直接編集可能なコントローラのプレハブを持っていないため、子モデルを見つけ、それを消してしまうプロセスは必要です。むしろコントローラはゲームによって作成され、ゲーム世界内で名前で探して連動させます。

次に、右手の銃コントローラ用の残りのロジックをコーディングしていきます。Waiting for Triggerという新しいステートを作成し、そのステートにつなげるSetupステート内にFINISHEDと呼ばれる遷移も作ります。

これはSetupを右クリックし、メニューからAdd Transition、FINISHEDと選択し、FINISHEDから新しいステートに矢印を左クリック&ドラッグすることでできます。

 

Eventリストから“Global_TriggerPressDown_R”と“Global_TriggerPressUp_R” という名前と同じ二つのグローバルイベントを加えます。これら名前は必ず完全に同じスペルでなければならず、ゲームをアップロードした際にSTYLYと連動されます。

 

Waiting for Triggerステート内の遷移としてGlobal_TriggerPressDown_Rを加えます。

 

このトリガーはユーザーが押した時に銃弾を打つのに使われることになります。Global_TriggerPressUp_Rは以下のAdd Global Transitionメニューからグローバルイベントとして追加される必要があります。

 

グローバル遷移として追加したのは、トリガーが押された際にループをを起こして継続的に銃弾が発せられるので、このループから抜け出す簡易的な方法としてグローバル遷移を持たせ、このシステムをループから抜け出させ、他に複雑なロジックなしにWaiting for Triggerステートに戻させるためです。これはトリガーを離した時に銃弾が打つのが止まることを意味しています。

次にSpawning Bulletと呼ばれる新しいステートを作成し、それをGlobal_TriggerPressDown_R遷移を通じてWaiting for Triggerにつなげます。

 

Spawning Bulletステート内ではじめにしなければならないことはspawnPointSphereの回転を取得し、spawn point sphereにの軸と同じ軸方向に銃弾を向かわせることです。これは銃から直接銃弾を打つ際に、この動きを起こすのに必要な力の方向を正確に知る上で必須です。これはアクションブラウザからGetRotationアクションを追加し、次の図で示されているフィールドを埋めればできます。

 

次に実際に銃弾を生み出すCreate Objectアクションが必要になります。銃弾の発生源となるspawnPointSphereと回転をspawnPointRotationに設定します。この回転は以前追加したアクションとともに取得した発生源の回転です。

いまのところは銃弾のプレハブがまだ作られていないためGame Objectフィールドを空欄にしておきますが、後ほどこれを埋めに戻ってきます。

playMakerではステート上に赤い警告マークを置いてくれて不完全なアクションを知らせてくれます。後ほど探しやすくなります。

 

Spawning Bulletが終わった際、次の銃弾を発生させたいですが、これらのアクション間には遅れが生じて欲しいです。これをSpawning Bulletステートを煩雑にせずに行うには、waitアクションを持つ別のWaiting Stateを作るのがよいです。次の図のようなステートを作って、終了時にSpawning Bulletステートに戻ってこさせます。Spawning Bulletステートが終了時にもWaitingステートにつながるようにしてください。

 

Waitingステート内にWaitアクションを追加し、0.2秒待たせるようにします。

Waitアクションメニュー下のfinish eventをFINISHEDに設置し、Real Timeにチェックをします。これで実際の世界における0.2秒が各銃弾の間に入ります。

 

これで銃コントローラーの設定が完了しました。次は、弾丸の設定をご紹介します。

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

About Styly

STYLY is a cloud-based service for creating high quality, beautiful VR spaces that doesn’t require any coding.

By using STYLY, creators can express their imaginations indefinitely and build a variety of virtual spaces.

Through these spaces, we can share experiences that are unachievable in the real world.

STYLY Official Site:https://styly.cc

Shares
Facebook Twitter Google+ Pinterest hatebu

コメントを残す

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

Miyuki Yasuzawa

Miyuki Yasuzawa

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