ゲーム開発を試してみようと思い立ち、Unreal Engine 5をインストールして開発する過程で調べてみた部分を備忘録的に投稿します。今回は[ブループリント インターフェイス]の使い方です。
クラスに後付けで関数を追加
ブループリント インターフェイスをイメージで表すと、こんな感じになります。
既存のブループリントクラスを拡張するような形で関数を追加して、別のブループリントからアクセスできるようになります。
何が便利になるかは後で説明するとして、とりあえず使い方は、こんな感じになります。
近づくとダメージを受けるアクター
今回は簡単なサンプルとしてレベルに配置したアクターに近づくと、キャラクターにダメージを受ける仕組みを作っていきます。
ダメージを与えるアクターを作成
インターフェイスにアクセスするためのアクターを作成します。
具体的には次の手順で行います。
1. [コンテンツドロワー]を開いて空いている場所で右クリックします。
2. 表示されるポップアップメニューで[ブループリント クラス]メニューを選択します。
3.[親クラスを選択]画面で[Actor]を選択します。
4. 追加された[ブループリント クラス]の名前を “BP_Damage” に変更します。
5.[BP_Damage]を開いて[コンポーネント]画面で[Cube]を追加します。
6.[詳細]画面の[トランスフォーム|拡大・縮小]を変更してサイズを調整します。
7.[コンポーネント]画面で[Box Collision]を追加します。
8. 追加した[Box]が下のイメージのように[Cube]の下に並んでいるか確認します。
9.[詳細]画面の[レンダリング|Hidden in Game]のチェックを外します。
10. [詳細]画面の[イベント|On Component Begin Overlap]の[+]をクリックします。
11.[イベントグラフ]に[On Component Begin Overlap (Box)]が追加されます。
ここまでの作業で、レベルに配置するアクターが作成できました。
ダメージを処理するインターフェイスを作成
実際の処理を行うインターフェイスを作成します。
具体的には次の手順で行います。
1. [コンテンツドロワー]を開いて空いている場所で右クリックして表示されるポップアップメニューで[ブループリント|ブループリントインターフェイス]メニューを選択します。
2. 追加された[ブループリントインターフェイス]の名前を “BPI_Damage” に変更します。
3.[BPI_Damage]を開いて[マイブループリント]画面の[関数]の[新規作成]を[Recieve Damage]に変更します。
4. [インプット]設定の(+)をクリックして追加された項目の名前を[Value]に型を[Integer]に変更します。
5.[アウトプット]設定の(+)をクリックして追加された項目の名前を[New Life]に型を[Integer]に変更します。
ここまでの作業で、インターフェイスの作成ができました。
インターフェイスの処理は[ブループリント インターフェイス]では追加ができません。処理部分は、インターフェイスを追加したブループリントクラスで追加します。
プレイヤーにライフを設定
ダメージ処理をするためにプレイヤーから減らすための「ライフ」を設定します。
具体的には次の手順で行います。
1. [コンテンツドロワー]を開いて[BP_ThirdPersonCharacter]を開きます。
2.[マイブループリント]画面の変数を追加して名前を[Life]に型を[Integer]に変更します。
3.[詳細]画面[デフォルト値]を適当な値(例 “100”)に設定します。
ココまでの作業で、プレイヤーにライフ(100)を設定できました。
アクターに近づくとダメージを与える処理
作成したアクターからインターフェイスに追加した[Receive Damage]関数を呼び出してダメージを与える処理を追加します。
具体的には次の手順で行います。
1. [BP_Damage]を開いて[イベントグラフ]画面の[On Component Begin Overlap (Box)]の実行ピンを伸ばして表示された[実行可能なアクション]画面で “Receive Damage” を検索して追加します。
2. 追加された[Receive Damage]ノードの[Target]ピンと[Other Actor]ピンを接続します。
3.[Receive Damage]ノードの[Value]に与えるダメージ量(例 “10”)を設定します。
4.[Receive Damage]の結果を確認するために[Print String]ノードで[New Life]の値を表示します。
インターフェイスにダメージ処理を追加
アクターから呼び出された[Receive Damage]関数に実際に処理する部分を追加します。
具体的には次の手順で行います。
1. [BP_ThirdPersonCharacter]を開いて[クラス設定]をクリックします。
2.[詳細]画面の[インターフェイス|実装インターフェイス]の[追加]から “BPI_Damage” を検索して追加します。
3.[実装インターフェイス]に[BPI_Damage]が追加されます。
4.[マイブループリント]画面の[インターフェイス]に表示された[Receive Damage]をダブルクリックします。
5.[Receive Damage]と[Return Node]が表示されます。
6.[マイブループリント]画面の[Life]変数をドラッグして表示されたポップアップメニューの[Set Life]を選択します。
7. 追加された[セット]ノードを下のイメージのように接続します。
8. 再度[Life]変数をドラッグして[Get Life]メニューを選択します。
9. さらに[-]ノードを追加して[Life]ノードと[セット]ノードを下のイメージのように接続します。
ここまでの作業で[Receive Damage]に受け渡された[Value]を使って[BP_ThirdPersonCharacter]の[Life]変数を操作する処理が出来上がりました。
ダメージ処理の確認
[Receive Damage]関数の処理を確認してみます。
レベルに [BP_Damage]アクターを配置します。
ゲームを実行してプレイヤーを操作して追加した[BP_Damage]アクターに近づけるとデバッグ表示で[Life]のデフォルト値から設定した[Value]を引いた値が表示されます。
[BP_Damage]プループリントクラスから、インターフェイスに追加した[Receive Damage]関数が呼び出されて[BP_ThirdPersonCharacter]の[Life]変数を操作する処理が出来上がりました。
Interface(インターフェイス)のメリット
今回の処理は、インターフェイスを使わなくても下のイメージのように[BP_ThirdPersonCharacter]クラスに[Receive Damage]関数の処理を追加することも可能です。
インターフェイスを実装する手間の分、直接ブループリントに追加した方が効率的とも考えられます。
しかし、処理を呼び出す場合側には相手先のクラスを考えなくても良くなるメリットがあります。
例えば、今回[BP_Damage]クラスから[Receive Damage]関数を呼び出す場合、相手先のクラスを意識していません。
特定のブループリントクラス内に[Receive Damage]関数が追加されていた場合、クラスを特定してから関数を呼び出す処理になります。
今回はアクターに近づくキャラクターが1つでしたが実際のゲームを製作する場合には、もっと複雑な処理になる場合があります。
Interfaceを利用した場合は相手先のクラスを気にせず、とりあえず[Recieve Damage]関数を呼び出すだけになるので処理が簡略化できます。
その他にも特定の[ブループリントクラス]に依存することなく処理部分を別クラス化できるので、別のブループリントクラスを生成した場合でも[インターフェイスの追加]処理だけで済むのもメリットがあります。
まとめ
今回は、Unreal EngineのInterface(ブループリントインターフェイス)について実装方法とメリットついて書きました。
クラスのイベントグラフに直接処理を追加するよりも面倒な実装になりますが、実際の処理部分を分離することができるので、呼び出し側や将来的にクラスを切り替えるような際にメリットがあります。
Unreal Engineのゲーム開発でブループリント間で関数の編集を行う[インターフェイス]の実装について知りたい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。