【STEP2】的が壊れる仕組みを作ろう&UI表示と扉が開くギミックを作ろう

2000.01.01
チュートリアル
この記事をシェア!
Twitter Facebook LINE B!
Twitter Facebook LINE B!

本STEPでは、ブループリントを使った本格的なギミックの実装を行います。このプロジェクトでは、サンプルゲームにあった「的を撃ったら壊れる」処理や「すべての的が壊されたら扉が開く」処理がまだ実装されていません。これらの処理を、自分で実装してみましょう。

目次

※本ページは、ゲームメーカーズ×GALLERIA コラボPCに同梱される「ゲーム制作キット」の解説ページです。本コンテンツが含まれるコラボPCはGALLERIAの販売ページでお求めいただけますので、ぜひご検討ください。

「的を壊す」処理をブループリントで実装する

本STEPで使用するマップに移動しましょう。コンテンツドロワー上で、「コンテンツ」→「GameMaking_Kit」→「Maps」を開きます。その中にある「Step2_P」をダブルクリックし、「Step2_P」へ移動します。

Ctrl + スペースキーでコンテンツドロワーが開ける

開いたマップには、的と扉が設置されており、扉の奥にゴールがあります。

「Step2_P」の構成

試しにプレイしてみましょう。的を壊して扉を開かなければゴールに到達できませんが、現状「壊れる処理」が実装されていないため、的を撃ってもなにも起こりません

左クリックで射撃、右クリックで銃を構える。現段階ではギミックが未完成であるため、的を撃っても壊れない

的のブループリントを編集し、撃たれたら壊れる処理を実装します。コンテンツドロワーから、「コンテンツ」→「GameMaking_Kit」→「Blueprints」にある「BP_Target」のブループリント編集画面を開きましょう。

「BP_Target」は、動く床やトランポリンと同じフォルダにある。「BP_Target」をダブルクリックすると、新しいウィンドウでブループリントの編集画面が開く

「BP_Target」のイベントグラフ画面。まだ何も機能が実装されていない

イベントグラフが表示されないときは……

「BP_Target」のブループリント編集画面を開いた際、上図のようにイベントグラフではない画面が表示される場合があります。

その場合は、画面上部にある「イベントグラフ」と書かれたタブをクリックすると、イベントグラフが表示できます。

処理のきっかけとなる「イベント」を用意する

「ゲームづくりを始めよう!」で「動く床」や「触るとゲームオーバーになるトゲ」を作ったように、ノードを組み合わせることで「BP_Target」に機能を実装していきます。

まずは、処理が実行されるきっかけとなるノードを配置します。処理の起点となるノードは「イベント」と呼ばれ、ノードの上部が赤色になっています。

今回は撃たれたことをきっかけに処理を始めるため、「ダメージを受けた時」に実行されるイベントノード「Event AnyDamage」を配置しましょう。

イベントグラフの何もないところを右クリックすると、配置可能なノードを一覧できるメニューが表示される。上部にある検索窓に「any damage」と入力し、「Event AnyDamage」をクリックしよう

イベントグラフに配置された「Event AnyDamage」ノード

壊れた時にSEを鳴らす処理を追加する

「Event AnyDamage」をきっかけにして、サウンド再生を実行する処理を作っていきます。弾がきちんと的に当たったことをプレイヤーに示すために、SE(サウンドエフェクト/効果音)を鳴らす処理を入れましょう。

「Event AnyDamage」ノードの右側にある白い矢印(右向きの五角形)は、「実行ピン」と呼ばれます。ブループリントでは、実行ピンがつながっているノードが、順番に処理を実行していきます

実行ピンの矢印の向きにしたがって処理が実行されていく

サウンドを再生するノード「Play Sound 2D」を、「Event AnyDamage」の実行ピンから続くように配置しましょう。

「Event AnyDamage」の実行ピンをドラッグすると、実行ピンに接続できるノードが一覧表示される

ノード一覧から「play sound」と検索し、「Play Sound 2D」をクリックして選択しよう

実行ピンが接続された状態で、「Play Sound 2D」ノードが配置される

「Play Sound 2D」ノードの「Sound」と書かれた青い丸(ピン)には、鳴らしたいサウンドを指定します。「アセットを選択」をクリックし、サウンドのリストから、弾が当たった時のSE「SE_Hit_Cue」を選択しましょう。

サウンドを選択後、「アセットを選択」と書かれていた場所が「SE_Hit_Cue」になっていれば、正しく選択できている

これで、SEが鳴るようになりました。

的を消す処理を追加する

自身を消滅させる処理を実行させれば、的が破壊されたことになります。そこで、オブジェクトを消滅させるノード「Destroy Actor」を、「Play Sound 2D」の後に実行されるように配置しましょう。

「Target」ピンに、消滅させたいアクタを入力する。デフォルトで「self」、つまり「BP_Target」自身が指定されているため、今回はこのままでよい

これで、撃たれた的を消す処理は完成です。

処理の完成図

プレイして、処理が正しく行われるかを確かめましょう、撃たれた的がSEとともに消えるようになったことを確認できます。

以上で、ハンドブックP.9〜P.10の手順は完了です。P.11に進みましょう。

壊した的の数をUIに表示させる

このゲームは、ゴールするために的をすべて壊す必要があります。「すべての的を壊せたかどうか」をプレイヤーが把握するためには、マップ上にある的の数と、自分が壊した的の数をUI (※)として表示しておく必要があります
※ ユーザーインターフェースの略称。ゲームの状態を視覚的に伝える要素であり、プレイヤーの残り体力を示す体力ゲージなどが該当する

そこで、UIに的の数を反映させる処理を、このゲームでUIを管理しているアクタ「PlayerController」に対して実装します。

「PlayerController」のブループリントは、「コンテンツ」→「GameMaking_Kit」→「Blueprints」にある「BP_PlayerController」です。コンテンツドロワーから「BP_PlayerController」をダブルクリックし、ブループリント編集画面を開きましょう。

「BP_PlayerController」の編集画面。イベントグラフにはすでに実装されている処理がいくつかあるが、無視してよい

具体的なUIを更新する処理の流れは、以下の通りです。

  1. 的が壊されたら
  2. 壊された的のカウントを1増やし
  3. 更新後の的の数でUIを更新する

オリジナルのイベントを作成する

今までの処理は「ゲーム開始時」など汎用的なタイミングで行うものばかりであったため、デフォルトでイベントが用意されていました。しかし、今回は「的が壊されたとき」という独自のタイミングであるため、UE5には用意されていません。

そこで、オリジナルのイベントを作れる「カスタムイベント」ノードを使えば、「的が壊されたとき」に実行されるイベントを新たに作成できます。

イベントグラフを右クリックし、ノード一覧メニューから、「custom event」と検索しましょう。「Add Custom Event…」を選択すると、オリジナルのイベント「カスタムイベント」を配置できます。

配置した「カスタムイベント」には自身で名前を付けられます。今回は「OnTargetBroken」とします。

カスタムイベントを配置した直後であれば、そのままキーボードで名前を入力できる。名前を付けた後であっても、ノードを選択した状態からF2キーで名前を変更できる

今はまだ設定していませんが、的が壊されるたびに「OnTargetBroken」の処理が実行される前提で処理を組み立てます。

カウントを加算する処理を追加する

「OnTargetBroken」に、壊した的のカウントを1増やす処理を追加します。

「壊した的のカウントを増やす」を行うためには、壊した的の数を記録しておく必要があります。そこで、値を保存する「変数」という仕組みを使います。

ブループリント編集画面左下の「変数」に、「BrokenTargetCount」と書かれた変数が確認できます。この「BrokenTargetCount」が、壊された的の数を保存するための変数です。

今回は事前に用意しておいたが、自分で変数を作ることもできる

画面左下の「変数」から、「BrokenTargetCount」をイベントグラフにドラッグ&ドロップし、変数「BrokenTargetCount」の現在値を取得する「Broken Target Count」ノードを配置しましょう。

「BrokenTargetCount」をイベントグラフにドラッグ&ドロップする。現れたメニューから「Get BrokenTargetCount」を選択すると、「Broken Target Count」ノードが配置できる

配置した「Broken Target Count」ノード

「Broken Target Count」にある緑色のピンをドラッグし、足し算を行う「Add」ノードを配置しましょう。

「Add」ノードには、「+」が書かれている。上のピンの数値と下のピンの数値が加算され、右のピンに出力される

「0」と書かれている左下のピンには、「1」を直接入力しましょう。

ピンの右側にある数値をクリックすると、直接入力できるようになる

これで、「BrokenTargetCount」の現在値を1増やした値を計算できます。計算結果(右側のピン)の値を、「BrokenTargetCount」にセット(上書き)すれば、壊した的のカウントを更新できます。

「変数」にある「BrokenTargetCount」をイベントグラフにドラッグ&ドロップし、「BrokenTargetCount」の値を更新する「Set BrokenTargetCount」ノードを配置しましょう。

「BrokenTargetCount」をイベントグラフにドラッグ&ドロップし、出現するメニューから「Set BrokenTargetCount」を選択。「Set BrokenTargetCount」ノードが配置される

下図の通り、「Set BrokenTargetCount」ノードとほかのノードをつなげましょう。

これで、「BrokenTargetCount」を1増やす処理が実装できた

的の総数と破壊状況をUIに反映させる

変数に保存した「壊した的の数」をUIに反映させる処理を実装します。UIを更新する「Update Target UI」ノードを配置し、「Set BrokenTargetCount」の後に実行されるよう実行ピンをつなげましょう。

イベントグラフの何もないところを右クリックし、ノード一覧から「Update Target UI」を選択しよう

「Set BrokenTargetCount」と「Update Target UI」の実行ピンをドラッグ&ドロップで接続する

これで、的を壊すと、UI側に表示された数字が+1ずつ増えるように実装できました。

UIの更新処理の完成図

以上で、ハンドブックP.11〜P.12の手順は完了です。P.13に進みましょう。

破壊されたことを通知する処理を的に追加する

UIの更新処理は実装できましたが、このままでは「OnTargetBroken」はどこからも実行されません。的のブループリント「BP_Target」に処理を追加し、的が壊れたタイミングで「OnTargetBroken」を実行するようにします。

「BP_Target」のブループリント編集画面を再度開きましょう。

「BP_Target」は「コンテンツ」→「GameMaking_Kit」→「Blueprints」にある

弾が当たったときのイベント「Event AnyDamage」の後に「OnTargetBrokenを実行する」処理を追加します。

現時点における「Event AnyDamage」の処理

「OnTargetBroken」を実行するためには、どのアクタが「OnTargetBroken」の処理を実装しているかを知る必要があります。今回は「BP_PlayerController」が「OnTargetBroken」を実装しているため、ゲーム内の「PlayerController」にアクセスするための「Get Player Controller」ノードをイベントグラフに配置します。

プレイヤーキャラクターにアクセスする「Get Player Character」と間違えないようにしよう

続いて、「Get Player Controller」の「Return Value」ピンをドラッグし、「Cast to BP_PlayerController」を配置します。

実際は「PlayerController」にはさまざまな種類がある……などのプログラム的な理由から「Cast to ○○」ノードを使う必要があるのだが、今は深く考えなくてもよい。自分で「PlayerController」に実装した処理を使うときは、「Get Player Controller」と「Cast to ○○(PlayerControllerのブループリント名)」を組み合わせるのだな、という認識で問題ない

現時点の「Play Sound 2D」ノードの実行ピンには「Destroy Actor」が接続されています。実行ピンをドラッグして、下図の通り「Cast to BP_PlayerController」につなぎかえましょう。

すでにつながれているピンであっても、ドラッグ&ドロップでつなぎ直せる

「As BP Player Controller」ピンから、「BP_PlayerController」の処理が使えます。ピンをドラッグし、「OnTargetBroken」ノードを配置しましょう。

実行ピンは自動的に配線される。このままで問題ない

「OnTargetBroken」の後に「Destroy Actor」が実行されるよう実行ピンをつなげたら、処理は完成です。

「BP_Target」の完成図

これで、的の数がUIに反映されるようになりました。プレイして確かめてみましょう。

的が壊されたときの処理を実装する

続けて、すべての的を壊したときに扉を開く処理を追加します。コンテンツドロワーから、「BP_PlayerController」の編集画面を再度開きましょう。

「OnTargetBroken」イベントに、「的がすべて壊れたら扉を開く」処理を追加します。

壊した的の変数を更新した後に、数が「的の総数(ゲーム開始時に存在している的の数)」と一致しているかどうかをチェックするようにしましょう。

「Set BrokenTargetCount」ノードの出力ピン(右側のピン)からは、更新後の値(+1した後の数値)が出力されます。ドラッグして「Equal(==)」ノードを配置します。

「Equal(==)」は、左側の2つのピンに入力された値が一致しているかどうかを右側のピンに出力するノード。この処理を生かせば、出力された値=残りの的の数が0か否かをチェックする機能が作れる

「Equal(==)」を使えば、更新後の値が的の総数と同じかどうかをチェックできます。的の総数は、変数「InitialTargetCount」に保存されています。

画面左下の「変数」から、「InitialTargetCount」をドラッグし、「Equal(==)」ノードの左下のピンにドロップしましょう。「InitialTargetCount」の値を取得する「Initial Target Count」ノードが、自動的に接続されます。

続いて、「Equal(==)」の結果に応じて処理を分岐させるために、「Branch」ノードを配置しましょう。

実行ピンは「Update Target UI」の実行ピンに、「Condition」ピンは「Equal(==)」ノードの出力ピンに接続します。

「Equal(==)」ノードへの入力(壊した的の数と的の総数)が一致している場合に、「True」側の実行ピンにつないだ処理が実行されます。「True」に、扉を開ける処理を続けていきます。

マップ上に配置されているアクタを検索・取得するノード「Get Actor Of Class」を配置し、「True」ピンに接続します。

「Get Actor Of Class」は、マップ内から指定したアクタを探し、最初に見つかったアクタを出力するノードだ。今回、扉のアクタは1つしかマップ上に存在しないため、常に同じアクタを取得できる

検索するアクタを指定する「Actor Class」ピンには、扉のアクタ「BP_Door」を指定します。

「Return Value」ピンから、「BP_Door」の処理を使えます。ドラッグして「BP_Door」が持っている「扉を開ける」処理を実行するノード「Open」を配置しましょう。

ここまでの一連の作業で、「すべての的を壊したら扉が開く処理」が完成しました。

「BP_PlayerController」の完成図

テストプレイを行い、2つの的を壊すと扉が開くかどうか確かめましょう。

STEP2は以上です。ハンドブックに戻り、STEP3P.15)に進みましょう。

ゲームメーカーズ×GALLERIA コラボPC 紹介ページコラボPC 特設ページ

関連記事

アークライト 野澤 邦仁のボードゲームを作るには Vol.04「ルール調整編」
2024.11.01
2Dプラットフォーマーのステージを15分で制作。YoYo Games、2D向けゲームエンジン「GameMaker」用チュートリアル記事を公開
2024.09.17
WebブラウザもSwitchもサポートするゲームエンジンで、フォルダの作成方法からゲームプログラミングが学べる。「Go言語とEbitengineによる ゼロから始めるゲームプログラミング」連載開始
2024.08.19
Unity Technologies、初心者から上級者まで幅広くカバーしたアニメーションの電子書籍を無料で公開。Blenderからのインポート、AIナビゲーションなど解説
2024.06.14
スタジオ木曜日、Houdiniでプロシージャルモデリングを学べる記事を公式ブログに連載。画面の見方から家の3Dモデルを作るまでを解説
2024.06.07
ゲームメーカーズが贈る“ゲーム制作の入門書”が2024年9月下旬 発売決定!『ゼロから始めるゲーム制作!プロが使うUE5で3Dアクションゲームを作ろう(仮)』
2024.05.25

注目記事ランキング

2024.11.28 - 2024.12.05
VIEW MORE

連載・特集ピックアップ

イベントカレンダー

VIEW MORE

今日の用語

レンダリング(Rendering)
レンダリング コンピューターグラフィックスにおける、各種データ(3Dモデルなど)をプログラムを用いて計算し、画像として表示すること。レンダリングを行うプログラムをレンダラー(Renderer)と呼ぶ。
VIEW MORE

Xで最新情報をチェック!