xlua学习1 如何在lua中调用C#

简介

商业游戏离不开热更新。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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值