Unreal Engine 5 を使って開発中のTPSプロジェクト「GASP-ALS」の改造進捗として、今回は「アイテム(武器)使用処理の責務分離」についてまとめます。

従来はキャラクターBP(CBP)側で直接武器を扱っていましたが、インターフェース(BPI_Item)を導入することで、コードの柔軟性と保守性を大幅に改善しました。
🎯 背景:CBP依存のEnum分岐に限界
以前の実装では、ピストルやライフルといった武器タイプごとの処理分岐を Enum Switch
で CBP 側に持たせていました。
しかし武器バリエーションが増えるたびに、CBP_SandboxCharacterを修正・拡張しなければならず、以下のような課題がありました:
- CBPが武器の内部動作に深く依存
- 武器の種類が増えるほど管理が煩雑に
🔁 改善方針:BPI_Itemによる抽象化と委譲
この課題を解決するため、CBPからアイテム(武器)使用処理を切り離し、Blueprint Interface(BPI_Item) に委譲しました。
🧱 実装詳細
✅ BPI_Item の新規関数追加
インターフェース BPI_Item
に以下の3関数を定義:
OnStartedUseItem()
: 使用し始め (旧 IA_Fireの Started)OnCompletedUseItem()
: 使用し終わり(旧 IA_Fire の Completed)Reload()
: 弾のリロード処理を想定

Reloadは銃系の武器前提の名前なので、SubA,SubBみたいな単純な名前に変えようかな?
これにより、武器ごとの処理実装を各BPに任せられるようになりました。
✅ BP_Gun の対応
既存の StartFire()
、StopFire()
、Reload()
の実装を BPI_Item の関数として再構築。


独自イベントからI/F定義に置き換えただけです。
「ピストル」や「ライフル」などの銃系はBP_Gunをそのまま使って問題ないです。
狙いは弓とか双眼鏡とかでも、同じI/F関数を使うことで、独自のアイテム使用に関するロジックをCBPをほとんどいじらずに実装可能にすることです。
✅ CBP_SandboxCharacter のBattleGraph変更
IA_Fire
の入力処理を削除- プレイヤーからもAIと同様に
StartFire()
/StopFire()
をコール
- プレイヤーからもAIと同様に
- Enumによる
OverlayState
分岐を廃止- BPI_Item の
OnStartedUseItem()
/OnCompletedUseItem()
を直接呼び出す設計に
- BPI_Item の
IA_Reload
はReloadBullet()
イベントに変更BP_Gun
へのキャストを廃止し、Reload()
I/F 経由で処理
Before

After


ブループリントインターフェースは、Castも不要で、実装されてなければ無視されるだけなので、Nullチェックも不要だそうで、超スッキリかつメンテナンスフリーに。
(※ ただしC++ではNullチェック必要とのこと)
✅ CBP_RetargetPlayerBase の連携
入力アクション IA_Fire
および IA_Reload
に対し、前述のCBPイベント (StartFire()
/ StopFire()
/ ReloadBullet()
) を呼び出す処理を追加。

これにより、入力 → CBP → インターフェース経由で武器制御、という明確な責務分離構造が確立されました。

RelaodBulletってタイポ。。。
🌱 効果と今後の展望
この変更により、以下のような利点が得られました:
- 武器BPを追加してもCBPをほぼ触る必要がない
- CBPの責務が大幅に軽減
- AIとプレイヤーが同一の武器使用ロジックを共有可能
- 将来的な多様な武器種・アイテム実装にも対応しやすい設計に

「ほぼ」と書いたのは、持ち手位置情報を変数でCBP内に持っているため、これもデータアセット化などで分離しようかな
📝 まとめ
- CBPから武器使用処理を分離し、BPI_Itemに委譲
- Fire/Reload の処理は各武器BPで個別対応可能に
- OverlayStateによるEnum分岐を完全撤廃
- 入力アクション → CBP → インターフェース → 武器BP の明確な処理フロー確立
🔧使用バージョン:Unreal Engine 5.5.4
🎮プロジェクトタイプ:GASP-ALS(改造)
ご意見・ご質問はぜひコメントやX(旧Twitter)でもお寄せください!
コメント