割と簡単なコードで、MoonSharpとC#とのコルーチンで処理をピンポンさせつつ合間にちゃんとUnityの他の処理も実行させることが出来ました。これで、ゲームのシナリオ進行やイベント演出等をMoonSharpで直列で書きつつ具体的な処理についてはUnityでまったく制約なく書くことが出来そうです。 MoonSharpはC#で書かれたLuaライクなスクリプト言語で、一部の機能を除いてLuaととてもよく似ています。APIもC#の機能を活用しつつLuaのAPIから類推出来る部分も多いので、Luaを使ったことがあるならすぐに使えるようになると思います。
using UnityEngine;
using System.Collections;
using MoonSharp.Interpreter;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
StartCoroutine(CSharpFunc());
}
IEnumerator CSharpFunc()
{
string src = @"
function wait(i)
coroutine.yield(i)
end
return function ()
for i=1,10 do
wait(i)
end
end
--coroutine.yieldは関数の中からでも呼べる。
";
Script s = new Script();
DynValue luafunc = s.DoString(src);
DynValue cr = s.CreateCoroutine(luafunc);//C#からでもコルーチンを作れる
while (true)
{
DynValue x = cr.Coroutine.Resume();
if (cr.Coroutine.State == CoroutineState.Dead) break;
Debug.Log(x);
yield return null;
}
}
// Update is called once per frame
int count = 0;
void Update () {
count++;
if (count<15)
{
Debug.Log("Update");
}
//Updateで全部流れてしまわないように15回だけ表示している。
}
}
//出力に数字とUpdateが入り交じり、C#のCSharpFunc、MoonSharpのコルーチン、Updateがそれぞれ呼ばれてるのが分かる。
https://wakelet.com/wake/8_J9srOXSpy_0PWc6qY2t
https://wakelet.com/wake/Ene5g1lRZedqNIY0QBHbU
https://wakelet.com/wake/h2irnX-MdtQxn7ao8i3KR
https://wakelet.com/wake/WVvm_nr2-pPE-UE03Eo1L
https://wakelet.com/wake/d5WDIc6mtHmYpjTrA6O-A
https://wakelet.com/wake/q0oJs6ofijqT0bO1JT6fB
https://wakelet.com/wake/raly8S-KEGJ0moFBXUjqq
https://wakelet.com/wake/3BJgHHRl5bVuAIGOyMJ79
https://wakelet.com/wake/lKG9rT6jxQWLUGy1JFeF2
https://wakelet.com/wake/03oA2vN6tkgcNj7dsvyZF
https://wakelet.com/wake/0W8T2s_5kLPTStlU8XZAE
https://wakelet.com/wake/LsRkpMZA9mvlkj1yapT4C
https://wakelet.com/wake/stx0dBoDdfhXqv46Zw36R
https://wakelet.com/wake/fWBLusGiB4cNT-ve1dP-A
https://wakelet.com/wake/P9BJn00wH-uVwTN5c7KSm
https://wakelet.com/wake/Wlm4YVbJy438J2Mh0JTvj
https://wakelet.com/wake/dl4NQTrPGuiMMvR9zrKRX
https://wakelet.com/wake/AyYYJGDWqu501X3K8_oI-
https://wakelet.com/wake/rqmzkmVlwj4etx3U_FDX5
https://wakelet.com/wake/sgHxU5ApWkjFZwIeIYesR
https://wakelet.com/wake/G425FVDqYnRuYKkafFCyX
https://wakelet.com/wake/PYVjmS_pSg4PCLKJwWYYD
https://wakelet.com/wake/2ME0Vy5dEfGYkrv0svJVb
https://wakelet.com/wake/xCuztVyiKKMZJat1k0tlJ
https://wakelet.com/wake/tUcMOuc6wEhOMbozhPsYo
https://wakelet.com/wake/Zu27zSDlzEFBY8XXL5mNz
https://wakelet.com/wake/XbThAq-jmJ8yg-i-AJJlp
https://wakelet.com/wake/SsqQ7xvcPcW2OqiYDcKRf
https://wakelet.com/wake/ZkNJzMLi4jyTJsk_m8UBV
https://wakelet.com/wake/ySJYS5_BOoCduM5TUt7V7
https://wakelet.com/wake/SSJW9BfX9FHg2fJyLcoJb
https://wakelet.com/wake/Aq3C49yD9y9Q2AH8U0mZx
https://wakelet.com/wake/bwtR-TIPVaRZ3gapFeF8W
https://wakelet.com/wake/3SMPFj6LVKA1bvCsDQpoD
https://wakelet.com/wake/y6TnVhJ9Oo8Bq2TfIRKP-
https://wakelet.com/wake/plJ9vMpmsNjRDCHut_EQN
https://wakelet.com/wake/nog10xGk9HYsbvC5dvYEJ