embed:tutorial1
差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
embed:tutorial1 [2023/01/14 18:08] – 作成 machiaworx | embed:tutorial1 [2023/01/15 10:16] (現在) – [UnityへのMiniscriptの埋め込み(組込)ガイド] machiaworx | ||
---|---|---|---|
行 1: | 行 1: | ||
- | Miniscriptの埋め込みガイド | + | ====== UnityへのMiniscriptの埋め込み(組込)入門 ====== |
+ | |||
+ | ==== 資料 ==== | ||
+ | |||
+ | https:// | ||
+ | |||
+ | ==== 概要 ==== | ||
+ | |||
+ | Unity上でMiniscriptを組み込む手順を書く。 | ||
+ | |||
+ | 元々MiniscriptがUnityへの組込を想定して作られたとのことで、割と導入は整備されてます。 | ||
+ | |||
+ | ==== 手順 ==== | ||
+ | |||
+ | まずMiniscriptのソースコード一式をUnityのプロジェクトに追加した後、以下のコードを書きます。 | ||
+ | |||
+ | <code csharp> | ||
+ | |||
+ | public string loadText; | ||
+ | public TextAsset textAsset; | ||
+ | |||
+ | void Start(){ | ||
+ | loadText = textAsset.text; | ||
+ | |||
+ | RunScript(loadText); | ||
+ | } | ||
+ | |||
+ | public void RunScript(string sourceCode) { | ||
+ | string extraSource = " | ||
+ | interpreter.Reset(extraSource + sourceCode); | ||
+ | interpreter.Compile(); | ||
+ | ValMap data = new ValMap(); | ||
+ | |||
+ | data[" | ||
+ | data[" | ||
+ | data[" | ||
+ | |||
+ | interpreter.SetGlobalValue(globalVarName, | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ここで重要なのは、interpreterクラスで実行している処理と、そのあとのバインド処理になります。 | ||
+ | |||
+ | interpreterクラスのReset関数にてソースコードを読み込み、Compile関数にて処理を利用可能な状態にしている、という形です。 | ||
+ | |||
+ | また、「ValMap」というクラスを初期化してますが、これがMiniscript側で管理できる変数を保管するクラスみたいなんですね。 | ||
+ | |||
+ | ここに参照先を指定して、言ってしまうと変数をバインドする形になります。 | ||
+ | |||
+ | 余談ですがグローバル変数みたいな形でも管理が出来る模様(SetGlobalValueってメソッドで行うみたいですね) | ||
+ | |||
+ | ソースコードの実行と変数の反映 | ||
+ | |||
+ | <code csharp> | ||
+ | void Update(){ | ||
+ | try{ | ||
+ | // | ||
+ | if( !interpreter.Running()) | ||
+ | interpreter.Restart(); | ||
+ | interpreter.RunUntilDone(1.0f); | ||
+ | |||
+ | }catch (MiniscriptException err) { | ||
+ | #if UNITY_EDITOR | ||
+ | Debug.Log(" | ||
+ | #endif | ||
+ | } | ||
+ | |||
+ | UpdateFromScript(); | ||
+ | } | ||
+ | |||
+ | public void UpdateFromScript() { | ||
+ | ValMap data = null; | ||
+ | try { | ||
+ | data = interpreter.GetGlobalValue(globalVarName) as ValMap; | ||
+ | } catch (UndefinedIdentifierException) { | ||
+ | Debug.LogWarning(globalVarName + " not found in global context." | ||
+ | } | ||
+ | if (data == null) return; | ||
+ | |||
+ | Transform t = transform; | ||
+ | Vector3 pos = t.localPosition; | ||
+ | |||
+ | Value xval = data[" | ||
+ | if (xval != null) pos.x = xval.FloatValue(); | ||
+ | Value yval = data[" | ||
+ | if (yval != null) pos.y = yval.FloatValue(); | ||
+ | |||
+ | t.localPosition = pos; | ||
+ | |||
+ | Value rotVal = data[" | ||
+ | if (rotVal != null) t.localRotation = Quaternion.Euler(0, | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ここでやってることは、スクリプトの実行と、Valueクラスからデータを参照し、値をバインドした変数に代入しています。 | ||
+ | |||
+ | スクリプトの実行は、RunUntilDoneメソッドで行います。 | ||
+ | |||
+ | これは、指定秒数までを許容し、それ以上だと途中で打ち切るみたいです。(オプションで指定秒数まで待つことも可能) | ||
+ | |||
+ | また、処理は毎フレームで処理してもらうのが重要なので、常時Running()状態にしてます。 | ||
+ | |||
+ | Running状態とは、コンパイルして動かす準備ができたという事みたいです。 | ||
+ | |||
+ | 実行した後だとRunning()がFalseに切り替わるため、Restart()関数を実行することでRunning()がTrueを返すようにします。 | ||
+ | |||
+ | ValueクラスはMiniscriptで持っているクラス名、このクラスからFloatValue()メソッド等の変数として取得出来るメソッドに変換して、元の値に格納していく形になります。 | ||
+ |
embed/tutorial1.1673687326.txt.gz · 最終更新: 2023/01/14 18:08 by machiaworx