Unity Xlua 初探

19 篇文章 0 订阅

  1. 首先在项目导入Xlua,只需要下载得Xlua包里面得Assets 文件夹下得内容拷贝到自己的项目中即可。 在里面有xlua的各种功能的范例。 

2.现在开始xlua的第一步, 

加入宏定义

3. 每次当c#代码改变的时候需要执行以下操作

  第一个重新生成代码,第二步是注入热更。

4. 运行范例里面的HotfixTest场景,点击按钮,Debug会提示Lua调用,表示热更更新成功,环境已经OK。 如果有提示报错,就是没有导入工具。 从下载的Xlua的Tools文件夹也拷贝到自己的项目的相同目录下即可

5. 然后开始自己的代码测试。创建新场景,创景脚本HotfixLuaScripts.CS  作为Lua调用的总入口。通常对于Lua的调用都在一个统一的脚本中,既方便了管理,也降低了内存的占用。

代码如下:

  

using UnityEngine;
using XLua;
using System.IO;
public class HotfixLuaScripts : MonoBehaviour
{

    private LuaEnv LuaEnv;
    private void Awake()
    {
        LuaEnv = new LuaEnv();
        LuaEnv.AddLoader(MyLoader);
        LuaEnv.DoString(@"require 'test'");
    }

    public byte[] MyLoader(ref string filePath)
    {
        string luaPath = Path.Combine(Application.dataPath, "Scripts/Lua/", filePath+".lua.txt");
      
        Debug.Log(luaPath);
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(luaPath));
    }
    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnDisable()
    {
        LuaEnv.DoString(@"require 'LuaDispose'");
    }

    private void OnDestroy()
    {
        LuaEnv.Dispose();
    }
}

总共使用了两个Lua脚本。 

Test为测试,LuaDispose为释放在热更过程中,lua引用过的C#的热更内容。如果不进行释放,会出现报错. AddLoader 为自己定义加载的lua基本,可以选择自己想要存放的目录

搭建简单的场景来演示。 放一个Cube,创建如下脚本

using UnityEngine;
using XLua;
[Hotfix]
public class CubeController : MonoBehaviour
{
    private new Rigidbody rigidbody;
    // Start is called before the first frame update
    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
    }
    [LuaCallCSharp]
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            rigidbody.AddForce(Vector3.up*500);
        }
    }
}

需要热更的类要加 [Hotfix]    热更的方法需要加   [LuaCallCSharp]   [LuaCallCSharp]

我在Test.lua.txt中进行热更的代码,如下

local UnityEngine=CS.UnityEngine
xlua.hotfix(CS.CubeController,'Update',function(self)
      if(UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode.S)) then
        self.rigidbody:AddForce(UnityEngine.Vector3.up*500);
      end
end)

6. 然后运行就会发现,代码会调用Test.lua.txt的内容,而CubeController 的Update方法不会被调用。   热更实现。

注意事项: lua的脚本需要保存UTF-8格式,后缀要改成".lua.txt "  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值