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