xLua小练习

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值