ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
「どこからでも呼べる」の意味
UE5 で「Blueprint からどこからでも呼び出せるカスタムイベント」を作りたい場合、その本質はグローバルな置き場(シングルトン)を確保することです。レベル(マップ)が切り替わるたびに破棄されない場所に、イベントの発信源を置きます。
| 置き場 | 寿命 | 用途 |
|---|---|---|
| GameInstance | ゲーム起動〜終了 | レベル跨ぎグローバル(推奨) |
| GameInstanceSubsystem | ゲーム起動〜終了 | 機能別分割(モダン推奨) |
| GameState | レベル切替で破棄 | マップ内グローバル |
| GameMode | レベル切替で破棄(サーバのみ) | ルール定義 |
| PlayerController | プレイヤー単位 | 入力・UI 制御 |
| 個別 Actor | そのレベルのみ | ローカル機能 |
方法1: GameInstance に Event Dispatcher を置く
最も古典的で確実な方法です。次の手順で進めます。
- Content Browser → 右クリック → Blueprint Class → Game Instance を継承 →
BP_MyGameInstance - Project Settings → Maps & Modes → Game Instance Class を
BP_MyGameInstanceに変更 BP_MyGameInstanceを開き、Event Dispatchers ペインでOnEnemyDefeated等を追加- イベント発信側:
Get Game Instance→Cast To BP_MyGameInstance→Call OnEnemyDefeated - イベント受信側: 同様に Cast →
Bind Event to OnEnemyDefeated→ カスタムイベントに接続
[Enemy_BP] [HUD_BP]
↓ Defeated ↓ BeginPlay
Get Game Instance Get Game Instance
↓ ↓
Cast To BP_MyGameInstance Cast To BP_MyGameInstance
↓ ↓
Call OnEnemyDefeated Bind Event to OnEnemyDefeated
↓
Custom Event: UpdateScore
方法2: GameInstanceSubsystem(推奨・モダン)
UE 4.22+ で導入された UGameInstanceSubsystem は、GameInstance を肥大化させずに機能ごとに分離できるモダンな仕組みです。Blueprint からは Get Game Instance Subsystem (BP_QuestSubsystem) でいきなり取れるため、Cast 不要でアクセスできます。
// MyQuestSubsystem.h
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyQuestSubsystem.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnQuestCompleted, FName, QuestId);
UCLASS()
class MYGAME_API UMyQuestSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable, Category="Quest")
FOnQuestCompleted OnQuestCompleted;
UFUNCTION(BlueprintCallable, Category="Quest")
void CompleteQuest(FName QuestId)
{
OnQuestCompleted.Broadcast(QuestId);
}
};
Blueprint からは以下のように使えます。
[発信側]
Get Game Instance Subsystem (MyQuestSubsystem)
→ Complete Quest (QuestId="DragonSlain")
[受信側 - BeginPlay 等で]
Get Game Instance Subsystem (MyQuestSubsystem)
→ Bind Event to On Quest Completed
→ Custom Event handler でクエスト UI 更新
方法3: Blueprint Interface
「呼び方の契約」だけ共有したい場合は Blueprint Interface を使います。シングルトンとは異なり、対象 Actor が分かっているケースで利用します。
- Content Browser → Blueprint Interface →
BPI_Damageable作成 - Function:
ReceiveDamage(int32 Amount)を追加 - 各 Actor の Class Settings → Interfaces → Add で
BPI_Damageableを実装 - 呼ぶ側:
Receive Damage (Message)ノードで、Target に Actor を渡す
方法4: シーン跨ぎの永続データ
イベントだけでなく値も保持したいなら、GameInstance のメンバ変数(Save Game との連携も)を使います。
| 用途 | 置き場 | 備考 |
|---|---|---|
| レベル間のスコア/所持金 | GameInstance 変数 | メモリ上のみ。閉じると消える |
| セーブデータ | SaveGame オブジェクト | ファイル書き込み |
| ステージ間の進捗 | GameInstance + SaveGame | 両立 |
| ネットワーク同期データ | GameState / Replicated | マルチプレイ向け |
レベル間通信のフロー例
Level_Field(フィールドマップ)
Player が敵に勝利
→ GameInstance.OnVictory(EnemyId, Reward) を呼ぶ
→ GameInstance に Reward を保存
→ Open Level "Level_Result"
Level_Result(リザルト画面)
BeginPlay
→ Get Game Instance.GetReward() で値取得
→ UI に表示
注意点と落とし穴
- GameInstance クラスを設定し忘れると、いくら Blueprint を作っても使われない(Project Settings 必須)
- Subsystem は引数なしの Initialize しか持てない。データは
Initialize内で別から取得 - Event Dispatcher の Bind は重複防止のために Unbind を意識。EndPlay で Unbind All を推奨
- Actor が破棄された後でも Bind が残るとクラッシュリスク。Weak Reference / EndPlay で確実に解除
- マルチプレイ環境では、GameInstance はクライアント/サーバそれぞれにあるため、同期は別途 Replication 設計が必要
C++ から Multicast Delegate を公開する
// マルチキャストデリゲートで Blueprint からも Bind 可能に
UCLASS(Blueprintable)
class UMyEventBus : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnPause);
UPROPERTY(BlueprintAssignable) FOnPause OnPause;
UFUNCTION(BlueprintCallable) void Pause() { OnPause.Broadcast(); }
};
FAQ
Q: GameInstance と Subsystem、どちらを使うべき?
A: 新規プロジェクトは Subsystem。GameInstance を肥大化させず機能ごとに分離できます。既存プロジェクトの拡張なら GameInstance に追加で問題なし。
Q: PlayerController に置くのとどう違う?
A: PlayerController はプレイヤー単位。ローカルマルチでは複数生成され、レベル切替で破棄されます。ゲーム全体のイベントには不向き。
Q: Bind がリークしたとき?
A: 破棄済 Actor のハンドラに Broadcast すると Access None / クラッシュの原因になります。Actor の EndPlay で Unbind を呼ぶ習慣を。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- 床の上に乗ったらイベントを発生させる方法
- OverlapAllDynamicとOverlapAllの違い
- タイトル画面を作る方法
- サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
- ボタンに文字を記載する方法
- Event ActorBeginOverlapとOn Component Begin Overlapの違い
- キャラクターに特定のオブジェクトとの当たり判定を付ける
- 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
- 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
- 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
- Blenderファイルをインポートする方法
- 鏡を作成する方法
- レベルブループリントでキャラクターの出現を設定する方法
- サードパーソンテンプレートにおけるキャラクター出現の定義
- アイテムに近づいたらボタンを押してイベントを発火させる方法
- 画面の中央にメッセージを表示する方法
- どこからでも呼び出せるカスタムイベントを作成する方法
- カスタムイベントに引数を追加する方法
- 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
- オブジェクトに近づいている間だけメッセージを表示する方法
- PCの画面を操作するUIを作る方法
- コンテンツブラウザに画像を追加する方法
- SetInputMode_UIOnlyを取り消す方法
- 特定の画像の上にマウスカーソルを置いたら手マークにする方法
- オブジェクトがアウトライナーで選択できない原因と解決策
- PlayerStartを作成する方法
- メニュー画面を作成して開く方法
- 「Esc」キーを押してメニュー画面を開く方法
- イベントの「On Clicked」と「On Pressed」の違い
- 「Set Input Mode」の種類と使い方
- 「Set Game Paused」の使い方と詳細解説
- Motion Matchingとは?
- 「GameMode」と「GameModeBase」の違い
- マップに配置したTargetPointを取得する方法
- TargetPointにタグをつけて取得する方法
- Spawnしたインスタンスがイベントを実行する方法
- 特定の時間ごとに処理を実行する方法
- 数値をランダムで出力する方法
- ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
- MaxWalkSpeedを変更する方法
- しゃがむ動作を導入する方法
- キャラクターのアニメーションを設定する方法
- 導入済みのプラグインを確認する方法
- Motion Matchingの導入と必要なプラグイン
- プレイヤーを非表示にする方法
- カメラを傾ける角度を制限させる方法
- 配列からランダムに重ならない要素を特定の数取得する方法
- カメラの映す画面に文字やエフェクトを付ける方法
- キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
- プライマリーデータアセットを活用する方法
- プレイヤーのHPといった変数を定義する最適な場所
- カメラに映った画面をスクリーンショットとして保存する方法
- ゲーム内のカメラ映像を保存して再表示する方法
- HighResShot を使って高解像度の画像を保存する方法(UE5)
- HighResShotで保存した画像のファイル名を取得する方法
- SceneCapture2DとFrameGrabberの画像保存方法の比較
- SceneCapture2Dを使用して画像を保存・取得する方法
- HighResShotとTake High Res Screenshotの違い
- ゲーム終了ボタンを作成する方法
- 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
- 画面上にメッセージを指定された時間表示させる方法
- シェーダコンパイル時間を短縮する方法
- 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
- データベースを活用する方法
- UE5.5がインストールされた環境にUE5.4を追加で導入する方法
- World PartitionとWorld Compositionの違い
- オープンワールドテンプレートとは?
- ポーンをスポーンさせても視点を切り替えない方法
- キャラクター同士がすり抜けてしまう問題の解決方法
- キャラクターの外見を動的に変更
- World Partitionでインスタンスが「アンロード済み」になる問題
- データ アセットとデータ テーブルの違い
- コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
- エディターのソースコードの自動保存の頻度を高める方法
- SpawnActorでSpawn Transform Rotationが反映されない理由
- ミニマップを表示しポーンの位置を反映する方法
- RInterp ToとVInterp Toの違い
- 毎秒実行するイベントの定義方法
- Niagara のエフェクトにコリジョンを持たせる方法
- 「Overlap」と「Hit」の違い
- OverlapはあるがHitがない原因
- Overlapした位置の座標を取得する方法
- ブループリントでレベル間のパラメータを受け渡す方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?