Unreal.jsプラグインでは通常JSの実行手段はJavascript
コンポーネントを任意のActorにつけるか、ファイル名をextension-*.js
とする方法がある。ただし前者では何らかのActorをワールドに出す必要があり、後者はそもそもエディタの拡張用である。
可能なら任意のタイミングでBlueprint(以下、BP)からJS呼び出しのタイミングを制御したい。今回はその方法を簡単に説明する。
ゲーム起動時にJSを実行:カスタムGameInstance
クラスで呼ぶ
UE4ではゲームを最初に呼び出したときにGameInstance
というクラスBPが呼ばれるが、このクラスBPはプロジェクト設定で任意のものに変更ができる。この機能を使ってJSを呼ぶBPを組んでおけば、ゲーム起動時にJSを実行できる。
カスタムGameInstance
クラスの準備
- コンテンツブラウザのメニューから新規でBPクラスを作成する
- 親クラスに
GameInstance
を指定 - 適当な名前を付けて保存(例では「HelloFromBP」)
- メニューのEdit > Project Settings... を選択
- 「Map & Modes」を選択し、さっき作成したカスタム
GameInstance
クラスを指定
呼び出されるJSの用意
/Content/Scripts/
以下に任意の名前のJSを用意する。今回は以下の内容で。
console.log("hi console log!")
BPからJSを呼ぶノードを組む
- カスタム
GameInstance
クラスをダブルクリックなどしてBPエディタを開く - 以下のようなノードを組む
- Event Initから開始
-
Construct Object from Class
ノードを追加- Outerピンには自身
self
- クラスは
JavascriptIsolate
を指定
- Outerピンには自身
-
Create Context
ノードを追加- Unreal.js導入で追加されるノード
- (任意)JSからイベントを呼べるように
Expose
ノートを追加- 後述
-
Run File
もしくはRun Script
ノードを追加-
Run File
はファイルを指定するノード。例ではhi.js
を指定 -
Run Script
は文字列をスクリプトとして実行するノード
-
BPをコンパイルして実行
JavascriptConsoleに上記のログが出ればOK.
※なおGameInstance
からはそのままではGWorld
が取得できないので注意。
レベル読み込み時に実行:レベルBPから呼び出す
開始のノードがEvent BeginPlay
であること以外は基本的には同じように呼び出せる。
もちろん、開始ノードをEvent BeginPlay
以外にすることで任意のタイミングでJSを実行可能。
おまけ:JSからBPを実行する
カスタムGameInstance
クラスにExpose
ノードで名前を付けておくことでJSから呼び出せるようになる。
たとえばHelloFromBP
と名前を付けておく。
適当な名前(例:「HelloBP」)でカスタムイベントを作成するとそのカスタムイベントを以下の形でJSから呼び出せる。
HelloFromBP.HelloBP();
なお、WikiにはクラスBPを継承したクラスをJSで作る例も載っているので併せて読むといいかもしれない。
まとめ
- BPからJSを呼ぶには以下のノードの組み合わせでできる
-
Construct Object from Class
- クラスは
JavascriptIsolate
を指定
- クラスは
Create Context
-
Run File
orRun Script
-
-
GameInstance
やレベルBPなどの任意のBPの任意のタイミングから呼べる - JSから見えるようにしておけば(
Expose
)JSからBPのカスタムイベントを呼ぶこともできる