2025-01-25 04:38:09 +08:00

287 lines
8.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Thousandto.Core.Base;
using Thousandto.Plugins.Common;
using System;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System.Collections;
using PathUtils = UnityEngine.Gonbest.MagicCube.PathUtils;
using CoroutinePool = UnityEngine.Gonbest.MagicCube.CoroutinePool;
using StringUtils = UnityEngine.Gonbest.MagicCube.StringUtils;
using Thousandto.Core.Asset;
namespace Thousandto.Code.Logic
{
public delegate void LuaUpdateDelegate(float deltaTime);
public delegate void LuaUpdatePlussDelegate(float deltaTime, float realtimeSinceStartup, float frameCount);
//Lua系统
public class LuaSystem
{
#region //私有变量
private LuaEnv _luaEnv;
private LuaTable _luaGlobal;
private bool _isLogicInit = false;
private LuaUpdatePlussDelegate updateEvent;
//public List<Action> EvtLuaSystemInitList = new List<Action>();
//public List<Action> EvtLuaSystemDisposeList = new List<Action>();
public LuaEnv LuaEnv { get { return _luaEnv; } }
private LuaAdaptor _adaptor;
public LuaAdaptor Adaptor
{
get
{
if(_adaptor == null)
{
_adaptor = new LuaAdaptor();
}
return _adaptor;
}
}
private LuaSetting _setting;
public LuaSetting Setting
{
get
{
if (_setting == null)
{
_setting = new LuaSetting();
}
return _setting;
}
}
public bool IsInit
{
get { return _isLogicInit; }
}
#if UNITY_EDITOR && !FUNCELL_LAUNCHER
//是否使用Bytes来读取lua
private bool _isUseBytes = false;
#endif
#endregion
#region //函数
public LuaSystem()
{
//PC耗时281ms
_luaEnv = new LuaEnv();
_luaGlobal = _luaEnv.Global;
}
//初始化
public IEnumerator CoreInitialize()
{
Debug.Log("=======【LuaSystem】 CoreInitialize Start========");
//清除读表缓存
CfgBinaryData.RemoveAll();
Debug.LogError("开始初始化PB....");
//ProtoBuffer的加载
LuaProtoBuff.Init();
yield return new WaitUntil(LuaProtoBuff.IsLoaded);
Debug.LogError("初始化PB完毕!!!");
#if !UNITY_EDITOR || FUNCELL_LAUNCHER
//PC耗时38ms
BetterLua.Init();
yield return new WaitUntil(BetterLua.IsLoaded);
#endif
//Thousandto.Code.Logic.RunTimeProfiler2.instance.isRunProfiler = true;
//增加自定义Loader
_luaEnv.AddLoader(LuaLoader);
Setting.Initialize(_luaEnv);
#if UNITY_EDITOR && !FUNCELL_LAUNCHER
_isUseBytes = Setting.Get("UseLuaBytes") > 0;
if (_isUseBytes)
{
//这里可以填写语言,比如:TH,那么他就会读取Config目录下的LuaData_TH.bytes文件.
BetterLua.Init();
yield return new WaitUntil(BetterLua.IsLoaded);
}
#endif
//加载Lua端Main.lua
_luaEnv.DoString("Main = require 'Main'");
_luaEnv.Global.GetInPath<Action<float>>("Main.Start")(Time.realtimeSinceStartup);
//_luaEnv.Global.GetInPath<Action>("Main.Start")();
Adaptor.RequireGlobalCS();
yield return null;
//PC耗时81ms
Adaptor.RequireGlobalLua();
yield return null;
Adaptor.RequireStringDefines();
yield return null;
Adaptor.CoreInitialize();
yield return null;
//LogicInitialize();
//yield return null;
//if (EvtLuaSystemInitList.Count > 0)
//{
// for (int i = 0; i < EvtLuaSystemInitList.Count; i++)
// {
// EvtLuaSystemInitList[i]();
// }
//}
Networker.Instance.ResLuaMessageEvent = Adaptor.GetDoResMessage();
MsgExtend.SharedInstance.ResLuaMsgIDMap = Adaptor.GetResLuaMsgMap();
MsgExtend.SharedInstance.ResLuaExtendMsgIDMap = Adaptor.GetResLuaExtendMsgMap();
FGameObjectAnim.TranslateAnimNameHandle = Adaptor.GetTranslateAnimName();
if (Setting.Get("UseLuaShaderSwitch") > 0)
{
FGameObjectModel.OnShaderSWitchHandler = Adaptor.OnFGameObjectShaderSwitch;
}
else
{
FGameObjectModel.OnShaderSWitchHandler = FGOShaderSwitcher.Process;
}
Debug.Log("=======【LuaSystem】 CoreInitialize End========");
}
public void CoreUnInitialize()
{
Adaptor.CoreUninitialize();
}
public void LogicInitialize(bool clearLoginData)
{
if (!_isLogicInit)
{
Adaptor.LogicInitialize(clearLoginData);
updateEvent = _luaGlobal.GetInPath<LuaUpdatePlussDelegate>("Main.Update");
_isLogicInit = true;
}
}
public void LogicUnInitialize(bool clearLoginData)
{
if (_isLogicInit)
{
updateEvent = null;
Adaptor.LogicUninitialize(clearLoginData);
_isLogicInit = false;
}
}
//Lua文件的加载器
public byte[] LuaLoader(ref string fileName)
{
fileName = fileName.Replace(".", "/");
//删除配置中的缓存数据
if (fileName.StartsWith("Config/Data/Data"))
{
var cfgName = fileName.Replace("Config/Data/Data", "");
CfgBinaryData.Remove(cfgName);
}
fileName = fileName.ToLower();
#if UNITY_EDITOR && !FUNCELL_LAUNCHER
var filepath = PathUtils.GetResourcePath("Lua/" + fileName + ".lua");
//Debug.LogError("LuaSystem:"+ filepath+":::"+_isUseBytes);
//editor目录下的文件,不会去读取bytes中的文件.
if (System.IO.File.Exists(filepath) && (!_isUseBytes || fileName.StartsWith("editor/")))
{
//Debug.Log("LuaCustomLoader:" + filepath);
//适配在Unity上面读取多语言的翻译文件方便调试 丁华强 2020/12/24
string lan = UnityEngine.Gonbest.MagicCube.FLanguage.Default;
if (!string.IsNullOrEmpty(lan) && filepath.IndexOf("stringdefines") > 0)
{
string _lanStringDefinesPath = string.Format("{0}.{1}", filepath, lan);
if (System.IO.File.Exists(_lanStringDefinesPath))
{
return System.IO.File.ReadAllBytes(_lanStringDefinesPath);
}
}
return System.IO.File.ReadAllBytes(filepath);
}
else
{
return BetterLua.BetterLuaLoader(ref fileName);
}
#else
return BetterLua.BetterLuaLoader(ref fileName);
#endif
}
//获取lua全局变量
public T GetGlobal<T>(string str)
{
return _luaGlobal.Get<T>(str);
}
//根据路径获取lua全局变量
public T GetGlobalInPath<T>(string str)
{
return _luaGlobal.GetInPath<T>(str);
}
//执行lua代码
public object[] DoString(string str)
{
return _luaEnv.DoString(str);
}
public void Tick()
{
_luaEnv.Tick();
}
public void Update(float deltaTime)
{
if(null != updateEvent)
{
updateEvent(deltaTime,Time.realtimeSinceStartup,Time.frameCount);
}
}
//public void AddInitListener(Action act)
//{
// EvtLuaSystemInitList.Add(act);
//}
//public void AddDisposetListener(Action act)
//{
// EvtLuaSystemDisposeList.Add(act);
//}
//public void RemoveInitListener(Action act)
//{
// EvtLuaSystemInitList.Remove(act);
//}
//public void RemoveDisposetListener(Action act)
//{
// EvtLuaSystemDisposeList.Remove(act);
//}
public void Dispose()
{
updateEvent = null;
//if (EvtLuaSystemDisposeList.Count > 0)
//{
// for (int i = 0; i < EvtLuaSystemDisposeList.Count; i++)
// {
// EvtLuaSystemDisposeList[i]();
// }
//}
_luaEnv.Dispose();
_luaEnv = null;
Debug.Log("=============================[XLua 已卸载]==============================");
}
//垃圾回收
public void Sweep()
{
_luaEnv.FullGc();
}
#endregion
}
}