// @desc スクリプトから呼べる関数を登録します // @param function 関数 // @result 関数ID private static int L_export_function(ILuaState lua) { LuaVM vm = LuaVM.instance; int fid = vm.ExportFunction(lua); lua.PushInteger(fid); return(1); }
// @desc 関数登録を解除します // @param fid 関数ID private static int L_unexport_function(ILuaState lua) { LuaVM vm = LuaVM.instance; int fid = lua.ToInteger(-1); vm.UnexportFunction(lua, fid); return(0); }
// protected static T get_member <T>(ILuaState lua, int idx, string key) { idx = LuaVM.NormalizeIndex(lua, idx); lua.GetField(idx, key); T obj = (T)lua.ToUserData(-1); lua.Pop(1); return(obj); }
// protected static bool get_boolean(ILuaState lua, int idx, string key) { idx = LuaVM.NormalizeIndex(lua, idx); lua.GetField(idx, key); bool b = lua.ToBoolean(-1); lua.Pop(1); return(b); }
// スタック上の指定インデクスから指定個数の要素をテーブルにセットする protected static void set_value_to_table(ILuaState lua, int dst, int src, int nval) { dst = LuaVM.NormalizeIndex(lua, dst); src = LuaVM.NormalizeIndex(lua, src); for (int i = 1; i <= nval; ++i) { lua.PushValue(src + i - 1); lua.RawSetI(dst, i); } }
// スタック上の指定位置にあるテーブルの要素をコピーする protected static void copy_table(ILuaState lua, int dst, int src) { dst = LuaVM.NormalizeIndex(lua, dst); src = LuaVM.NormalizeIndex(lua, src); int sz = lua.RawLen(src); for (int i = 1; i <= sz; ++i) { lua.RawGetI(src, i); lua.RawSetI(dst, i); } }
public int InvokeScriptFunction(ILuaState lua, string funcname, int narg) { if (_script != null && _script.HasFunction(funcname)) { PushSelfTable(lua); if (narg > 0) { lua.Insert(LuaVM.NormalizeIndex(lua, -(narg + 1))); } return(_script.InvokeFunction(lua, funcname, narg + 1)); } return(0); }
// private static LuaVM retain_vm() { if (_vm == null) { _vm = LuaVM.instance; if (_vm == null) { GameObject obj = new GameObject("catan.LuaVM"); _vm = obj.AddComponent <LuaVM>(); } } return(_vm); }
internal int InvokeFunction(ILuaState lua, string funcname, int narg, int selftable = LuaConstants.LUA_NOREF) { LuaVM.Assert(lua, _functions.ContainsKey(funcname)); int key = _functions[funcname]; lua.RawGetI(LuaDef.LUA_REGISTRYINDEX, key); int b = LuaVM.NormalizeIndex(lua, -(narg + 1)); lua.Insert(b); int nresult = invoke_function(lua, narg, selftable); return(nresult); }
// @desc 登録した関数を起動します // @param fid 関数ID private static int L_invoke_function(ILuaState lua) { LuaVM vm = LuaVM.instance; int sz = lua.GetTop(); int narg = sz - 1; int fid = lua.ToInteger(1); for (int i = 0; i < narg; ++i) { lua.PushValue(2 + i); } int nresult = vm.InvokeFunction(lua, fid, narg, LuaDef.LUA_MULTRET); return(nresult); }
// @class Application // @desc シーンをロードします // @decl load_level(index) // @decl load_level(name) // @param index シーン番号 // @param name シーン名 private static int L_load_level(ILuaState lua) { if (lua.IsString(1)) { string name = lua.ToString(1); LuaVM.Log(string.Format("LOAD LEVEL {0}", name)); Application.LoadLevel(name); } else { int idx = lua.ToInteger(1); LuaVM.Log(string.Format("LOAD LEVEL {0}", idx)); Application.LoadLevel(idx); } return(0); }
public static int PushNewAsPrefab(ILuaState lua, GameObject obj) { LuaVM.Assert(lua, obj != null); // o = {} lua.NewTable(); // setmetatable(o, self) //lua.PushValue(-2); // self lua.GetGlobal(klassName); lua.SetMetaTable(-2); // -> o // self.__index = self lua.GetMetaTable(-1); lua.SetField(-1, "__index"); // return o set_internal <GameObject>(lua, -1, obj); set_boolean(lua, -1, "is_prefab", true); return(1); }
// void Awake() { if (_instance != null) { Destroy(this); } else { _instance = this; _androidPlatform = Application.streamingAssetsPath.Contains("://"); create_state(); StartCoroutine("gc"); StartCoroutine("low_freq_callback"); #if UNITY_EDITOR { #else if (Debug.isDebugBuild) { #endif _debugMenu = LuaDebugMenu.instance; } } } // void OnDestroy() { destroy_state(); if (_instance == this) { _instance = null; } } // void Start() { } // void Update() { _utilClass.Update(); }
internal int invoke_function(ILuaState lua, int narg, int selftable = LuaConstants.LUA_NOREF) { int top = lua.GetTop() - (narg + 1); // insert `traceback' function lua.PushCSharpFunction(Traceback); int b = LuaVM.NormalizeIndex(lua, -(narg + 2)); lua.Insert(b); var status = lua.PCall(narg, LuaDef.LUA_MULTRET, b); if (status != ThreadStatus.LUA_OK) { Debug.LogError(status); Debug.LogError(lua.ToString(-1)); } // remove `traceback' function lua.Remove(b); return(lua.GetTop() - top); }
public static Color ToColor(ILuaState lua, int idx) { idx = LuaVM.NormalizeIndex(lua, idx); check_value(lua, idx); int n = lua.GetTop(); lua.RawGetI(idx, 1); float r = (float)lua.ToNumber(-1); lua.RawGetI(idx, 2); float g = (float)lua.ToNumber(-1); lua.RawGetI(idx, 3); float b = (float)lua.ToNumber(-1); lua.RawGetI(idx, 4); float a = (float)lua.ToNumber(-1); lua.SetTop(n); return(new Color(r, g, b, a)); }
// protected static void set_member <T>(ILuaState lua, int idx, string key, T obj) { idx = LuaVM.NormalizeIndex(lua, idx); lua.PushLightUserData(obj); lua.SetField(idx, key); }
// protected static void set_boolean(ILuaState lua, int idx, string key, bool b) { idx = LuaVM.NormalizeIndex(lua, idx); lua.PushBoolean(b); lua.SetField(idx, key); }
// -- describing object oriented class in Lua // Test = {} // function Test:new() // o = {} // setmetatable(o, self) // self.__index = self // return o // end // function Test:hoge() // return 3 // end // NewTest = Test:new() // function NewTest:hoge() // return 4 // end public static int PushNew(ILuaState lua, GameObject obj) { LuaVM.Assert(lua, obj != null); LuaGameObjectCache cache = obj.GetComponent <LuaGameObjectCache>(); if (cache != null && cache.index == LuaConstants.LUA_NOREF) { Object.Destroy(cache); cache = null; } if (cache == null) { cache = obj.AddComponent <LuaGameObjectCache>(); // o = {} lua.NewTable(); // setmetatable(o, self) //lua.PushValue(-2); // self lua.GetGlobal(klassName); lua.SetMetaTable(-2); // -> o // self.__index = self lua.GetMetaTable(-1); lua.SetField(-1, "__index"); // return o set_internal <GameObject>(lua, -1, obj); set_boolean(lua, -1, "is_prefab", false); // LuaScriptBehaviour lsb = obj.GetComponent <LuaScriptBehaviour>(); if (lsb != null) { LuaComponentBehaviour.PushNew(lua, lsb); lua.SetField(-2, "behaviour"); } LuaComponentTransform.PushNew(lua, obj.transform); lua.SetField(-2, "transform"); RectTransform rt = obj.GetComponent <RectTransform>(); if (rt != null) { LuaComponentRectTransform.PushNew(lua, rt); lua.SetField(-2, "rect_transform"); } LuaComponentUIText.PushNew(lua, obj); lua.SetField(-2, "ui_text"); LuaComponentUIImage.PushNew(lua, obj); lua.SetField(-2, "ui_image"); if (constructorHook != null) { constructorHook(lua, obj); } lua.PushValue(-1); int refidx = lua.L_Ref(LuaDef.LUA_REGISTRYINDEX); cache.index = refidx; cache.luaState = lua; } lua.RawGetI(LuaDef.LUA_REGISTRYINDEX, cache.index); //Debug.Log(string.Format("Find {0} {1}", objid, obj.name)); if (get_internal <GameObject>(lua, -1) == null) { set_internal <GameObject>(lua, -1, obj); } return(1); }