実行フローの理解
UdonEmu で UdonAssembly を実行するには、4つのステップを順番に実行する必要があります。
このページでは、各ステップが「何をしているか」「なぜ必要か」を詳しく説明します。
全体の流れ
// 1. プログラムを初期化
if (!UdonAssemblyAssembler.TryAssembleProgram(
uassembly,
typeResolver,
programDescriptor,
out var program
)) {
Debug.LogError("Failed to assemble UdonProgram");
return;
}
// 2. 変数テーブルを初期化
if (!UdonAssemblyAssembler.TryAssembleVariableTable(
uassembly,
typeResolver,
out var variables
)) {
Debug.LogError("Failed to assemble UdonVariableTable");
return;
}
// 3. VM に設定
vm.AssignProgramAndVariables(program, variables);
vm.InitializeUdonContent();
// 4. イベントを実行
vm.RunProgram("PrintGreeting");
ステップ 1:プログラムを初期化
if (!UdonAssemblyAssembler.TryAssembleProgram(
uassembly,
typeResolver,
programDescriptor,
out var program
)) {
Debug.LogError("Failed to assemble UdonProgram");
return;
}
何をしているか
テキスト形式の UdonAssembly を UdonProgram オブジェクトに変換します。
具体的には、命令列(.code_start 〜 .code_end)を VM が実行できる内部形式にパースします。
なぜ必要か
VM はテキストを直接実行できません。内部形式(命令配列)に変換する必要があります。
パラメータ
uassembly:テキスト形式の UdonAssemblytypeResolver:型情報を解決するためのオブジェクトprogramDescriptor:プログラム記述子out program:変換後の UdonProgram(出力パラメータ)
戻り値
true:パース成功false:パース失敗(構文エラー等)
失敗する場合
.data_start/.code_startのスペルミス.exportでエントリポイントが宣言されて いないEXTERNの関数名が不正- 命令のオペランド(引数)が不足
例:正しい UdonAssembly
.code_start
.export _start
_start:
PUSH, __const_SystemString_0
EXTERN, "UnityEngineDebug.__Log__SystemObject__SystemVoid"
JUMP, 0xFFFFFFFC
.code_end
ステップ 2:変数テーブルを初期化
if (!UdonAssemblyAssembler.TryAssembleVariableTable(
uassembly,
typeResolver,
out var variables
)) {
Debug.LogError("Failed to assemble UdonVariableTable");
return;
}
何をしているか
変数定義(.data_start 〜 .data_end)を UdonVariableTable に変換します。
定数の初期値も設定されます。
なぜ必要か
プログラムが参照する変数・定数を事前に用意する必要があります。
変数テーブルがないと、プログラムは変数にアクセスできません。