using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using System.Linq; using MoonSharp.Interpreter; using MoonSharp.Interpreter.Loaders; public class FirstTest : MonoBehaviour { //============================================================ // 変数宣言 //============================================================ //-------------------------------------------------- // public //-------------------------------------------------- [MoonSharpUserData] class MyLua { FirstTest m_Parent; public MyLua(FirstTest parent) { m_Parent = parent; } public void TimeWait() { if (m_Parent != null) m_Parent.SetTimeWait(); } public void KeyWait() { if (m_Parent != null) m_Parent.SetKeyWait(); } public void NoWait() { if (m_Parent != null) m_Parent.SetNoWait(); } } public enum EZ_WAIT_KEY { _NONE // 待たない ,TIME // 時間待ち ,KEY // キー入力待ち } public EZ_WAIT_KEY WaitKey { get; private set; } public void SetNoWait() { WaitKey = EZ_WAIT_KEY._NONE; } public void SetTimeWait() { WaitKey = EZ_WAIT_KEY.TIME; } public void SetKeyWait() { WaitKey = EZ_WAIT_KEY.KEY; } //-------------------------------------------------- // private //-------------------------------------------------- private Text m_Text; private string m_CurMsg; private int m_iNum; // lua 用クラス private Script m_Lua; private DynValue m_Func; private DynValue m_LuaCoroutine; //============================================================ // 関数定義 //============================================================ //-------------------------------------------------- // コンストラクタ //-------------------------------------------------- void Awake() { UserData.RegisterAssembly(); m_Text = GetComponent(); m_Lua = new Script(); WaitKey = EZ_WAIT_KEY._NONE; #if false Dictionary scripts = new Dictionary(); object[] result = Resources.LoadAll("Lua", typeof(TextAsset)); foreach(TextAsset ta in result.OfType()) { scripts.Add(ta.name, ta.text); } Script.DefaultOptions.ScriptLoader = new MoonSharp.Interpreter.Loaders.UnityAssetsScriptLoader(scripts); #endif } //-------------------------------------------------- // 最初の更新 //-------------------------------------------------- void Start() { ((ScriptLoaderBase)m_Lua.Options.ScriptLoader).ModulePaths = //ScriptLoaderBase.UnpackStringPaths(Application.dataPath + "/Resources"); ScriptLoaderBase.UnpackStringPaths(UnityAssetsScriptLoader.DEFAULT_PATH + "/?"); m_Lua.Globals["obj"] = new MyLua(this); var ret = m_Lua.DoFile("test");//Script.RunFile("test"); Debug.Log( ret.Table ); if (ret.Table != null) { foreach (DynValue pKey in ret.Table.Keys) { Debug.Log(pKey + "," + ret.Table.Get(pKey)); m_Text.text += ret.Table.Get(pKey) + "\n"; } //Debug.Log(ret.Table.Values); //Debug.Log( m_Lua.Globals.Get("req").String ); } TryLuaCoroutine(); } //-------------------------------------------------- // 更新処理 //-------------------------------------------------- void Update() { } //--------------------------------------------------- // Lua のコルーチンてすと //--------------------------------------------------- void TryLuaCoroutine() { m_Func = m_Lua.DoFile("adv"); m_LuaCoroutine = m_Lua.CreateCoroutine(m_Func); /* foreach (DynValue x in m_LuaCoroutine.Coroutine.AsTypedEnumerable()) { //DynValue x = coroutine.Coroutine.Resume(); m_Text.text += x + "\n"; Debug.Log(x); } */ StartCoroutine(ShowDialog()); } //--------------------------------------------------- // Lua のコルーチンを受け取る C# コルーチン //--------------------------------------------------- IEnumerator ShowDialog() { foreach (DynValue x in m_LuaCoroutine.Coroutine.AsTypedEnumerable()) { //DynValue x = coroutine.Coroutine.Resume(); if (x.IsNotVoid()) { //m_Text.text = x.CastToString(); m_CurMsg = ""; m_iNum = 0; var textPut = StartCoroutine( PutText(x.CastToString()) ); //m_Text.text = m_CurMsg; Debug.Log(x); yield return textPut; switch (WaitKey) { case EZ_WAIT_KEY._NONE: yield return null; break; case EZ_WAIT_KEY.TIME: yield return new WaitForSeconds(3); break; case EZ_WAIT_KEY.KEY: yield return new WaitUntil(() => Input.anyKeyDown); break; } } } } //-------------------------------------------------- // メッセージを1文字ずつ表示するコルーチン //-------------------------------------------------- IEnumerator PutText(string sText) { int iNum = 0; while (iNum < sText.Length) { m_CurMsg = sText.Substring(0, ++iNum); m_Text.text = m_CurMsg; yield return new WaitForSeconds(0.1f); } }