283 lines
7.0 KiB
C#
283 lines
7.0 KiB
C#
|
|
/*
|
|||
|
|
Copyright (c) 2015-2017 topameng(topameng@qq.com)
|
|||
|
|
|
|||
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
|
of this software and associated documentation files (the "Software"), to deal
|
|||
|
|
in the Software without restriction, including without limitation the rights
|
|||
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
|
copies of the Software, and to permit persons to whom the Software is
|
|||
|
|
furnished to do so, subject to the following conditions:
|
|||
|
|
|
|||
|
|
The above copyright notice and this permission notice shall be included in all
|
|||
|
|
copies or substantial portions of the Software.
|
|||
|
|
|
|||
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
|
|
SOFTWARE.
|
|||
|
|
*/
|
|||
|
|
using UnityEngine;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using LuaInterface;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.IO;
|
|||
|
|
using System;
|
|||
|
|
#if UNITY_5_4_OR_NEWER
|
|||
|
|
using UnityEngine.SceneManagement;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
public class LuaClient : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
public static LuaClient Instance
|
|||
|
|
{
|
|||
|
|
get;
|
|||
|
|
protected set;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected LuaState luaState = null;
|
|||
|
|
protected LuaLooper loop = null;
|
|||
|
|
protected LuaFunction levelLoaded = null;
|
|||
|
|
|
|||
|
|
protected bool openLuaSocket = false;
|
|||
|
|
protected bool beZbStart = false;
|
|||
|
|
|
|||
|
|
protected virtual LuaFileUtils InitLoader()
|
|||
|
|
{
|
|||
|
|
return LuaFileUtils.Instance;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void LoadLuaFiles()
|
|||
|
|
{
|
|||
|
|
OnLoadFinished();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void OpenLibs()
|
|||
|
|
{
|
|||
|
|
luaState.OpenLibs(LuaDLL.luaopen_pb);
|
|||
|
|
luaState.OpenLibs(LuaDLL.luaopen_struct);
|
|||
|
|
luaState.OpenLibs(LuaDLL.luaopen_lpeg);
|
|||
|
|
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
|
|||
|
|
luaState.OpenLibs(LuaDLL.luaopen_bit);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
if (LuaConst.openLuaSocket)
|
|||
|
|
{
|
|||
|
|
OpenLuaSocket();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (LuaConst.openLuaDebugger)
|
|||
|
|
{
|
|||
|
|
OpenZbsDebugger();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void OpenZbsDebugger(string ip = "localhost")
|
|||
|
|
{
|
|||
|
|
if (!Directory.Exists(LuaConst.zbsDir))
|
|||
|
|
{
|
|||
|
|
Debugger.LogWarning("ZeroBraneStudio not install or LuaConst.zbsDir not right");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!LuaConst.openLuaSocket)
|
|||
|
|
{
|
|||
|
|
OpenLuaSocket();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrEmpty(LuaConst.zbsDir))
|
|||
|
|
{
|
|||
|
|
luaState.AddSearchPath(LuaConst.zbsDir);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
luaState.LuaDoString(string.Format("DebugServerIp = '{0}'", ip), "@LuaClient.cs");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
|||
|
|
static int LuaOpen_Socket_Core(IntPtr L)
|
|||
|
|
{
|
|||
|
|
return LuaDLL.luaopen_socket_core(L);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
|||
|
|
static int LuaOpen_Mime_Core(IntPtr L)
|
|||
|
|
{
|
|||
|
|
return LuaDLL.luaopen_mime_core(L);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void OpenLuaSocket()
|
|||
|
|
{
|
|||
|
|
LuaConst.openLuaSocket = true;
|
|||
|
|
|
|||
|
|
luaState.BeginPreLoad();
|
|||
|
|
luaState.RegFunction("socket.core", LuaOpen_Socket_Core);
|
|||
|
|
luaState.RegFunction("mime.core", LuaOpen_Mime_Core);
|
|||
|
|
luaState.EndPreLoad();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//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");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void CallMain()
|
|||
|
|
{
|
|||
|
|
LuaFunction main = luaState.GetFunction("Main");
|
|||
|
|
main.Call();
|
|||
|
|
main.Dispose();
|
|||
|
|
main = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void StartMain()
|
|||
|
|
{
|
|||
|
|
luaState.DoFile("Main.lua");
|
|||
|
|
levelLoaded = luaState.GetFunction("OnLevelWasLoaded");
|
|||
|
|
CallMain();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void StartLooper()
|
|||
|
|
{
|
|||
|
|
loop = gameObject.AddComponent<LuaLooper>();
|
|||
|
|
loop.luaState = luaState;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void Bind()
|
|||
|
|
{
|
|||
|
|
LuaBinder.Bind(luaState);
|
|||
|
|
DelegateFactory.Init();
|
|||
|
|
LuaCoroutine.Register(luaState, this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void Init()
|
|||
|
|
{
|
|||
|
|
InitLoader();
|
|||
|
|
luaState = new LuaState();
|
|||
|
|
OpenLibs();
|
|||
|
|
luaState.LuaSetTop(0);
|
|||
|
|
Bind();
|
|||
|
|
LoadLuaFiles();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void Awake()
|
|||
|
|
{
|
|||
|
|
Instance = this;
|
|||
|
|
Init();
|
|||
|
|
|
|||
|
|
#if UNITY_5_4_OR_NEWER
|
|||
|
|
SceneManager.sceneLoaded += OnSceneLoaded;
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void OnLoadFinished()
|
|||
|
|
{
|
|||
|
|
luaState.Start();
|
|||
|
|
StartLooper();
|
|||
|
|
StartMain();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void OnLevelLoaded(int level)
|
|||
|
|
{
|
|||
|
|
if (levelLoaded != null)
|
|||
|
|
{
|
|||
|
|
levelLoaded.BeginPCall();
|
|||
|
|
levelLoaded.Push(level);
|
|||
|
|
levelLoaded.PCall();
|
|||
|
|
levelLoaded.EndPCall();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (luaState != null)
|
|||
|
|
{
|
|||
|
|
luaState.RefreshDelegateMap();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if UNITY_5_4_OR_NEWER
|
|||
|
|
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|||
|
|
{
|
|||
|
|
OnLevelLoaded(scene.buildIndex);
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
protected void OnLevelWasLoaded(int level)
|
|||
|
|
{
|
|||
|
|
OnLevelLoaded(level);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
public virtual void Destroy()
|
|||
|
|
{
|
|||
|
|
if (luaState != null)
|
|||
|
|
{
|
|||
|
|
#if UNITY_5_4_OR_NEWER
|
|||
|
|
SceneManager.sceneLoaded -= OnSceneLoaded;
|
|||
|
|
#endif
|
|||
|
|
luaState.Call("OnApplicationQuit", false);
|
|||
|
|
DetachProfiler();
|
|||
|
|
LuaState state = luaState;
|
|||
|
|
luaState = null;
|
|||
|
|
|
|||
|
|
if (levelLoaded != null)
|
|||
|
|
{
|
|||
|
|
levelLoaded.Dispose();
|
|||
|
|
levelLoaded = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (loop != null)
|
|||
|
|
{
|
|||
|
|
loop.Destroy();
|
|||
|
|
loop = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
state.Dispose();
|
|||
|
|
Instance = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void OnDestroy()
|
|||
|
|
{
|
|||
|
|
Destroy();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void OnApplicationQuit()
|
|||
|
|
{
|
|||
|
|
Destroy();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static LuaState GetMainState()
|
|||
|
|
{
|
|||
|
|
return Instance.luaState;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public LuaLooper GetLooper()
|
|||
|
|
{
|
|||
|
|
return loop;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|