JavaScript
UE4
Blueprint
UnrealEngine
Unreal.js

[UE4]Unreal.jsでBlueprintからJSを実行する

More than 1 year has passed since last update.

Unreal.jsプラグインでは通常JSの実行手段はJavascriptコンポーネントを任意のActorにつけるか、ファイル名をextension-*.jsとする方法がある。ただし前者では何らかのActorをワールドに出す必要があり、後者はそもそもエディタの拡張用である。

可能なら任意のタイミングでBlueprint(以下、BP)からJS呼び出しのタイミングを制御したい。今回はその方法を簡単に説明する。

ゲーム起動時にJSを実行:カスタムGameInstanceクラスで呼ぶ

UE4ではゲームを最初に呼び出したときにGameInstanceというクラスBPが呼ばれるが、このクラスBPはプロジェクト設定で任意のものに変更ができる。この機能を使ってJSを呼ぶBPを組んでおけば、ゲーム起動時にJSを実行できる。

カスタムGameInstanceクラスの準備

  1. コンテンツブラウザのメニューから新規でBPクラスを作成する
  2. 親クラスにGameInstanceを指定
  3. 適当な名前を付けて保存(例では「HelloFromBP」)
  4. メニューのEdit > Project Settings... を選択
  5. 「Map & Modes」を選択し、さっき作成したカスタムGameInstanceクラスを指定
    • HelloFromBP_GameInstanceSetting.png

呼び出されるJSの用意

/Content/Scripts/以下に任意の名前のJSを用意する。今回は以下の内容で。

hi.js
console.log("hi console log!")

BPからJSを呼ぶノードを組む

  1. カスタムGameInstanceクラスをダブルクリックなどしてBPエディタを開く
  2. 以下のようなノードを組む
  3. Event Initから開始
  4. Construct Object from Classノードを追加
    • Outerピンには自身self
    • クラスはJavascriptIsolateを指定
  5. Create Contextノードを追加
    • Unreal.js導入で追加されるノード
  6. (任意)JSからイベントを呼べるようにExposeノートを追加
    • 後述
  7. Run FileもしくはRun Scriptノードを追加
    • Run Fileはファイルを指定するノード。例ではhi.jsを指定
    • Run Scriptは文字列をスクリプトとして実行するノード

BPをコンパイルして実行

HelloFromBP_console1.png

JavascriptConsoleに上記のログが出ればOK.

※なおGameInstanceからはそのままではGWorldが取得できないので注意。

レベル読み込み時に実行:レベルBPから呼び出す

開始のノードがEvent BeginPlayであること以外は基本的には同じように呼び出せる。

HelloFromBP_LevelBP.png

もちろん、開始ノードをEvent BeginPlay以外にすることで任意のタイミングでJSを実行可能。

おまけ:JSからBPを実行する

カスタムGameInstanceクラスにExposeノードで名前を付けておくことでJSから呼び出せるようになる。

HelloFromBP_ExposeNode.png

たとえばHelloFromBPと名前を付けておく。

HelloFromBP_CustomEvent.png

適当な名前(例:「HelloBP」)でカスタムイベントを作成するとそのカスタムイベントを以下の形でJSから呼び出せる。

hi.js
HelloFromBP.HelloBP();

HelloFromBP_PIE.png

HelloFromBP_console2.png

なお、WikiにはクラスBPを継承したクラスをJSで作る例も載っているので併せて読むといいかもしれない。

まとめ

  • BPからJSを呼ぶには以下のノードの組み合わせでできる
    • Construct Object from Class
      • クラスはJavascriptIsolateを指定
    • Create Context
    • Run File or Run Script
  • GameInstanceやレベルBPなどの任意のBPの任意のタイミングから呼べる
  • JSから見えるようにしておけば(Expose)JSからBPのカスタムイベントを呼ぶこともできる