using System.IO;----------------xlua工具类
using UnityEngine;
using UnityEngine.UIElements;
using XLua;
public class xLuaEnv
{
#region SingleTon
private static xLuaEnv _Instance;
public static xLuaEnv Instance
{
get
{
if (_Instance==null)
{
_Instance=new xLuaEnv();
}
return _Instance;
}
}
#endregion
#region CreateLuaEnv
public LuaEnv _env;
private xLuaEnv()
{
_env=new LuaEnv();
_env.AddLoader(_ProjectLoader);
}
#endregion
#region Loader
private byte[] _ProjectLoader(ref string filepath)
{
string path = Application.dataPath;
path = path.Substring(0, path.Length - 6) +
"DataPath/Lua/" + filepath+".lua";
if (File.Exists(path))
{
return File.ReadAllBytes(path);
}
return null;
}
#endregion
#region FreeLuaEnv
public void Free()
{
_env.Dispose();
_Instance = null;
}
#endregion
#region RunLua
public object[] DoString(string code)
{
return _env.DoString(code);
}
#endregion
//返回Lua环境的全局变量
public LuaTable Global
{
get
{
return _env.Global;
}
}
}
using System;---------------------Lua启动器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
[CSharpCallLua]
//生命周期委托
public delegate void LifeCycle();
[GCOptimize]
public struct LuaBootStrap
{
public LifeCycle Start;
public LifeCycle Update;
public LifeCycle OnDestroy;
}
public class BootStrap : MonoBehaviour
{
//Lua的核心table
private LuaBootStrap _bootStrap;
//调用起Lua代码
private void Start()
{
//防止切换场景时脚本对象丢失
DontDestroyOnLoad(gameObject);
xLuaEnv.Instance.DoString("require('BootStarp')");
//将Lua的核心table导入到c#端
_bootStrap = xLuaEnv.Instance.Global.Get<LuaBootStrap>("BootStrap");
_bootStrap.Start();
}
private void Update()
{
_bootStrap.Update();
}
private void OnDisable()
{
_bootStrap.OnDestroy();
//释放lua环境前需要将导出到C#的Lua的回调函数进行释放
_bootStrap.Start = null;
_bootStrap.Update = null;
_bootStrap.OnDestroy = null;
}
//释放掉Lua的代码
private void OnDestroy()
{
xLuaEnv.Instance.Free();
}
}
-------------Lua核心脚本
BootStrap={}
--核心table,储存所有控制器
BootStrap.Controllers={}
BootStrap.Start=function()
--将所有控制器注册给核心table
BootStrap.LoadPage("MainMenuController")
BootStrap.LoadPage("SignInController")
end
BootStrap.Update=function()
--遍历所有注册给核心的控制脚本
for k, v in pairs(BootStrap.Controllers)
do
--调用控制器的Update
if(v.Update~=nil)
then
v:Update()
end
end
end
BootStrap.OnDestroy=function()
end
--提供一个核心table函数用于加载页面控制器
--参数是脚本的名称
BootStrap.LoadPage=function(name)
--加载Controller目录下对应的脚本
local c = require("Controller/"..name)
--注册给核心的table,这样生命周期函数就会正常调用
BootStrap.Controllers[name]=c
--加载页面时同时运行Start
c.Start()
end
require("Prefabs")
require("Config")
require("ABManager")
LuaJson=require("LuaJson")
--[[print("BootStrap!")
require('Prefabs')
Prefabs:Load("Test")
local json = require('LuaJson')
local data = json.decode('{"Name":"admin","ID","78"}')
print(data.Name)
local datas = json.decode('[true,"abc",3]')
print(datas[1])]]
-------------实例化预制体
Prefabs={}
function Prefabs:Instantiate(prefab)
local go = CS.UnityEngine.Object.Instantiate(prefab)
--改名字
go.name=prefab.name
local canvas = CS.UnityEngine.GameObject.Find('/Canvas').transform
local trs=go.transform
--设置父物体 归一化
trs:SetParent(canvas)
trs.localPosition = CS.UnityEngine.Vector3.zero
trs.localRotation = CS.UnityEngine.Quaternion.zero
trs.localScale=CS.UnityEngine.Vector3.one
trs.offsetMin=CS.UnityEngine.Vector2.zero
trs.offsetMax=CS.UnityEngine.Vector2.zero
return go
end
--------------Lua主场景界面
ocal Controller = {}
Controller.page=nil
function Controller:Start()
--判定json文件是否存在
--json文件存在,读取数据
--json文件不存在,创建
ABManager:LoadFile("mainmenu")
local obj = ABManager.LoadAsset(
"mainmenu",
"MainMenu",
typeof(CS.UnityEngine.Object)
)
--加载预制体
local page= Prefabs:Instantiate(obj)
Controller.page=Page
--读取数据模型
require("DataModel/RoleDataModel")
RoleDataModel:New()
local data = RoleDataModel:ReadAllData()
--修改页面内容
page.transform:Find("HeaderCount/Gold/Count"):GetComponent(typeof(CS.UnityEngine.UI.text)).text=data.Gold
page.transform:Find("HeaderCount/Diamond/Count"):GetComponent(typeof(CS.UnityEngine.UI.text)).text=data.Diamond
page.transform:Find("HeaderCount/Gold/Add"):GetComponent(typeof(CS.UnityEngine.UI.Button)).onClick:AddListener(Controller:AddGold())
end
function Controller:AddGold()
RoleDataModel:AddGold(10)
Controller.page.transform:Find("HeaderCount/Gold/Count"):GetComponent
(typeof(CS.UnityEngine.UI.text)).text=data.Gold
end
return Controller
-------------AB包管理器
ABManager = {}
ABManager.Path = Config.ABPath
--所有被加载过的AB文件
ABManager.Files = {}
-- 总AB包
local master = CS.UnityEngine.AssetBundle.LoadFromFile(ABManager.Path .. "AB");
-- 总AB包的Manifest
ABManager.Manifest = master:LoadAsset("AssetBundleManifest",
typeof(CS.UnityEngine.AssetBundleManifest))
master:Unload(false)
--加载AB文件(加载依赖的AB文件)
function ABManager:LoadFile(name)
if(ABManager.Files[name] ~= nil)
then
return
end
--所有的依赖文件
local dependencies = ABManager.Manifest:GetAllDependencies(name)
for i = 0, dependencies.Length - 1
do
local file = dependencies[i]
--如果依赖的文件没有被加载过,则调用递归的加载
if(ABManager.Files[file] == nil)
then
ABManager:LoadFile(file)
end
end
--将AB包加载,并放入管理器的Files变量下
ABManager.Files[name] = CS.UnityEngine.AssetBundle.LoadFromFile(ABManager.Path .. name);
print(name)
end
--加载资源
--参数1:AB包文件名
--参数2:资源名称
--参数3:资源的类型
function ABManager:LoadAsset(file, name, t)
--判断AB包是否加载过
if(ABManager.Files[file] == nil)
then
--print("5")
return nil
else
--print("6")
return ABManager.Files[file]:LoadAsset(name, t)
end
end
--卸载AB文件
function ABManager:UnloadFile(file)
if(ABManager.Files[file] ~= nil)
then
ABManager.Files[file].Unload(false);
end
end
---例子代码
RoleDataModel={}
RoleDataModel.Path=CS.UnityEngine.Application.persistentDataPath.."/Role.json"
--json赋值
function RoleDataModel:New()
print(RoleDataModel.Path)
if(not CS.System.IO.File.Exists(RoleDataModel.Path))
then
CS.System.IO.File.WriteAllText(RoleDataModel.Path,'{"Gold":99,"Diamond":88}')
end
end
--读取数据
function RoleDataModel:ReadAllData()
if(CS.System.IO.File.Exists(RoleDataModel.Path))
then
return LuaJson.decode(CS.System.IO.File.ReadAllText(RoleDataModel.Path))
else
return nil
end
end
--增加金币方法
function RoleDataModel:AddGold (num)
if(CS.System.IO.File.Exists(RoleDataModel.Path))
then
local data= LuaJson.decode(CS.System.IO.File.ReadAllText(RoleDataModel.Path))
data.Gold=daat.Gold+num
--存json
CS.System.IO.File.WriteAllText(RoleDataModel.Path,LuaJson.encode(data))
return data
end
end