miduo_client/Assets/LuaFramework/Scripts/Manager/LuaManager.cs

268 lines
7.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using UnityEngine;
using System.Collections;
using LuaInterface;
using GameCore;
namespace GameLogic
{
public class LuaManager : UnitySingleton<LuaManager>
{
/// <summary>
/// lua虚拟机
/// </summary>
private LuaState luaState;
/// <summary>
/// lua加载器
/// </summary>
private LuaLoader luaLoader;
/// <summary>
/// lua
/// </summary>
private LuaLooper luaLooper = null;
// Use this for initialization
/// <summary>
/// 初始化
/// </summary>
public void InitLua()
{
luaLoader = new LuaLoader();
luaState = new LuaState();
this.OpenLibs();
luaState.LuaSetTop(0);
//LuaBinder.Bind(luaState);
Bind();
//LuaCoroutine.Register(luaState, this);
}
/// <summary>
/// 启动lua虚拟机
/// </summary>
public void InitStart()
{
InitLuaPath();
InitLuaBundle();
this.luaState.Start(); //启动LUAVM
this.StartMain();
this.StartLooper();
}
/// <summary>
/// 添加SearchPath
/// </summary>
/// <param name="path"></param>
public void AddSearchPath(string path) {
if (luaState != null)
{
luaState.AddSearchPath(path);
Debug.LogFormat("AddSearchPath:{0}",path);
}
}
/// <summary>
/// 移除SearchPath
/// </summary>
/// <param name="path"></param>
public void RemoveSearchPath(string path) {
if (luaState != null)
{
luaState.RemoveSeachPath(path);
Debug.LogFormat("RemoveSearchPath:{0}", path);
}
}
void StartLooper()
{
luaLooper = gameObject.GetComponent<LuaLooper>();
if (luaLooper != null)
Destroy(luaLooper);
luaLooper = gameObject.AddComponent<LuaLooper>();
luaLooper.luaState = luaState;
}
//cjson 比较特殊只new了一个table没有注册库这里注册一下
protected void OpenCJson()
{
luaState.LuaGetField(LuaIndexes.LUA_REGISTRYINDEX, "_LOADED");
luaState.OpenLibs(LuaDLL.luaopen_cjson);
luaState.LuaSetField(-2, "cjson");
luaState.OpenLibs(LuaDLL.luaopen_cjson_safe);
luaState.LuaSetField(-2, "cjson.safe");
}
void StartMain()
{
luaState.DoFile("Main.lua");
LuaFunction main = luaState.GetFunction("Main");
main.Call();
main.Dispose();
main = null;
}
public void CallLuaFunction(string Path, string FunctionName)
{
luaState.DoFile(Path);
LuaFunction main = luaState.GetFunction(FunctionName);
main.Call();
main.Dispose();
main = null;
}
/// <summary>
/// 初始化加载第三方库
/// </summary>
void OpenLibs()
{
luaState.OpenLibs(LuaDLL.luaopen_pb);
//lua.OpenLibs(LuaDLL.luaopen_sproto_core);
//lua.OpenLibs(LuaDLL.luaopen_protobuf_c);
//lua.OpenLibs(LuaDLL.luaopen_lpeg);
//lua.OpenLibs(LuaDLL.luaopen_bit);
//lua.OpenLibs(LuaDLL.luaopen_socket_core);
this.OpenCJson();
}
/// <summary>
/// 绑定
/// </summary>
void Bind()
{
LuaBinder.Bind(luaState);
DelegateFactory.Init();
LuaCoroutine.Register(luaState, this);
}
/// <summary>
/// 初始化Lua代码加载路径
/// </summary>
void InitLuaPath()
{
if (!AppConst.luaBundleMode)
{
App.LuaMgr.AddSearchPath(AppConst.GameResRealPath + "/~Lua");
}
}
/// <summary>
/// 初始化LuaBundle
/// </summary>
void InitLuaBundle()
{
//if (loader.beZip)
//{
// loader.AddBundle("lua/lua.unity3d");
// loader.AddBundle("lua/lua_math.unity3d");
// loader.AddBundle("lua/lua_system.unity3d");
// loader.AddBundle("lua/lua_system_reflection.unity3d");
// loader.AddBundle("lua/lua_unityengine.unity3d");
// loader.AddBundle("lua/lua_common.unity3d");
// loader.AddBundle("lua/lua_logic.unity3d");
// loader.AddBundle("lua/lua_view.unity3d");
// loader.AddBundle("lua/lua_controller.unity3d");
// loader.AddBundle("lua/lua_misc.unity3d");
// loader.AddBundle("lua/lua_protobuf.unity3d");
// loader.AddBundle("lua/lua_3rd_cjson.unity3d");
// loader.AddBundle("lua/lua_3rd_luabitop.unity3d");
// loader.AddBundle("lua/lua_3rd_pbc.unity3d");
// loader.AddBundle("lua/lua_3rd_pblua.unity3d");
// loader.AddBundle("lua/lua_3rd_sproto.unity3d");
//}
}
public void DoFile(string filename)
{
if (!CanUseLua())
return;
luaState.DoFile(filename);
}
// Update is called once per frame
public void CallFunction(string funcName, params object[] args)
{
if (!CanUseLua())
return;
LuaFunction func = luaState.GetFunction(funcName);
if (func != null)
{
func.LazyCall(args);
}
}
public T DoString<T>(string str){
if (!CanUseLua())
return default(T);
return luaState.DoString<T>(str);
}
public void LuaGC()
{
if (!CanUseLua())
return;
luaState.LuaGC(LuaGCOptions.LUA_GCCOLLECT);
}
public void Close()
{
if (luaLooper != null)
Destroy(luaLooper);
if (luaState != null)
luaState.Dispose();
if (luaLoader != null)
luaLoader.Dispose();
luaState = null;
luaLooper = null;
luaLoader = null;
}
public bool CanUseLua()
{
if (luaLooper == null)
return false;
if (luaState == null)
return false;
if (luaLoader == null)
return false;
return true;
}
LuaTable profiler = null;
public void AttachProfiler()
{
if (profiler == null)
{
profiler = luaState.Require<LuaTable>("UnityEngine.Profiler");
profiler.Call("start", profiler);
}
}
public void DetachProfiler()
{
if (profiler != null)
{
profiler.Call("stop", profiler);
profiler.Dispose();
LuaProfiler.Clear();
}
}
public void Reset()
{
//LuaGC();
Close();
}
}
}