简介
商业游戏离不开热更新。xlua是腾讯的大佬开发的一个开源热更新框架。大佬的范例已经很明确了,萌新记录下自己的理解,顺便敲敲代码熟悉一下
C#部分的代码
一个单例类记录每次gc回收的时间,用来控制回收内存
public static class LuaEnvExtension
{
public static float lastGCTime;
public static LuaEnv Instance {
get {
return Inner.instance;
}
}
class Inner {
internal readonly static LuaEnv instance = new LuaEnv();
}
}
C#部分的核心代码,读取lua脚本文件中的方法,并设置对应的委托调用这些方法
using System;
using UnityEngine;
using XLua;
/// <summary>
/// 注入到lua中的数据
/// </summary>
[Serializable]
public class Injection
{
public string key;
public GameObject value;
}
[LuaCallCSharp]
public class LuaBehaviourTest : MonoBehaviour
{
private const float gcInterval = 1f;//gc回收间隔 1秒
public TextAsset luaText;//lua脚本
public Injection[] injections;//注入到lua中的参数
private Action onStart;//开始事件
private Action onUpdate;//更新事件
private Action onDestroy;//销毁事件
private Action onAwake;//唤醒事件
private LuaTable scriptEnv;//脚本的lua环境
private void Awake()
{
scriptEnv = LuaEnvExtension.Instance.NewTable();//在主lua环境中创建一个新的表作为当前脚本的环境
LuaTable meta = LuaEnvExtension.Instance.NewTable();//创建一个新的表格存全局变量
meta.Set("__index", LuaEnvExtension.Instance.Global);//获取全局变量作为元方法
scriptEnv.SetMetaTable(meta);//设置meta为当前脚本的元表
meta.Dispose();//回收meta
scriptEnv.Set("self", this);//设置自身
foreach (var item in injections)
{
scriptEnv.Set(item.key, item.value);//向lua中注入数据
}
LuaEnvExtension.Instance.DoString(luaText.text, "LuaBehaviourTest", scriptEnv);//拷贝lua脚本的方法到scriptEnv中
onAwake += scriptEnv.Get<Action>("awake");//注册监听
onStart += scriptEnv.Get<Action>("start");
onUpdate += scriptEnv.Get<Action>("update");
onDestroy += scriptEnv.Get<Action>("onDestroy");
onAwake?.Invoke();//执行唤醒事件
}
private void Start()
{
onStart?.Invoke();
}
private void Update()
{
onUpdate?.Invoke();
//检测是否满足gc回收条件
if (Time.time - LuaEnvExtension.lastGCTime > gcInterval)
{
LuaEnvExtension.Instance.GC();
LuaEnvExtension.lastGCTime = Time.time;
}
}
private void OnDestroy()
{
onDestroy?.Invoke();
//回收内存
onAwake = null;
onStart = null;
onUpdate = null;
onDestroy = null;
injections = null;
scriptEnv.Dispose();
}
}
lua部分的代码
这部分是让物体延y轴移动,顺便旋转+换颜色
local speed = 10;
lightCpnt=nil;
function start()
print("lua start");
lightCpnt= lightObject:GetComponent(typeof(CS.UnityEngine.Light))
end
function update()
self.transform.position = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * 1 + self.transform.position;
local r = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * speed
self.transform:Rotate(r)
lightCpnt.color = CS.UnityEngine.Color(CS.UnityEngine.Mathf.Sin(CS.UnityEngine.Time.time) / 2 + 0.5, 0, 0, 1)
end
function onDestroy()
print("lua destroy");
end