XLua案例学习

下载 xlua 之后把 asset 文件中的全部文件粘贴到项目文件Asset文件下,将tool粘贴到 asset 同级目录下

然后把 HOTFIX_ENABLE 宏打开 之后 编辑 lua 脚本

更改源代码之后先 Generate Code 然后 HotFix inject in Editor

开发过程:

首先开发业务代码->在所有可能出现问题的类上打上hotfix的标签,在所有lua调用CSharp的方法上打上LuaCallCSharp,在所有CSharp调用Lua的方法上打上CSharpCallLua->打包发布->修改bug时只需要更新Lua文件,修改资源时(声音,模型,贴图,图片,UI)只需要更新ab包。用户只需要去下载lua文件跟ab包。

Lua访问C#中的私有变量方法

在lua文件中这么写:

xlua.private_accessable(CS.Gun)

执行完C#中原本的方法之后执行Lua中写的

复制代码
local util = require 'util'
xlua.private_accessible(CS.Boss)
util.hotfix_ex(CS.Boss,'Start',function(self)
    self.start(self)
    self.m_reduceGold = m_reduceGold - 20
end)

引入 util 这个 util.lua.txt 文件需要放在该lua脚本的平级目录中,在xlua_master 文件中寻找

注意用法

Xlua使用案例:

更改生成的钻石金币奖励之间的空隙

注意:local UnityEngine=CS.UnityEngine 下面代码中的CS.UnityEngine 全部显示为 Unity Engine 省事

源代码:

cs 复制代码
[LuaCallCSharp]
    private void CreatePrize()
    {
        for (int i = 0; i < 5; i++)
        {
            GameObject go = Instantiate(gold, transform.position + new Vector3(-10f + i * 30, 0, 0), transform.rotation);
            go.transform.SetParent(cavas);
            GameObject go1 = Instantiate(diamands, transform.position + new Vector3(0, 30, 0) + new Vector3(-10f + i * 30, 0, 0), transform.rotation);
            go1.transform.SetParent(cavas);
        }
    }

lua脚本:

Lua 复制代码
local UnityEngine=CS.UnityEngine
xlua.hotfix(CS.Treasour,'CreatePrize',function(self)
	for i=0,4,1 do
		local go=UnityEngine.GameObject.Instantiate(self.gold,self.transform.position+UnityEngine.Vector3(-10+i*40,0,0),self.transform.rotation)
		go.transform.SetParent(go.transform,self.cavas)
		local go1=UnityEngine.GameObject.Instantiate(self.diamands,self.transform.position+UnityEngine.Vector3(0,40,0)+UnityEngine.Vector3(-10+i*40,0,0),self.transform.rotation)
		go1.transform.SetParent(go1.transform,self.cavas)
	end
end)

如果有在 lua 中办不到的事情,可以提前在C#中写好,方便lua调用

下面这个获取资源的方法是C#中提前定义好的,方便Lua获取资源

Lua 复制代码
if changeMapTimeval >=50 then
			go=CS.HotFixScript.GetGameObject('SeaWave')
			UnityEngine.GameObject.Instantiate(go)
			canCreateNewFish=false
			changeMapTimeval=0
		else
			changeMapTimeval=changeMapTimeval+UnityEngine.Time.deltaTime
		end

随机数的坑

因为lua中没有 int float之分,而C#中 random函数有int float 为区分的重载,所以容易引起错误

用C#中的函数将得到的随机数向下取整

Lua 复制代码
self.num =UnityEngine.Mathf.Floor(UnityEngine.Random.Range(0, 4)

有时还会专门留下一个空的C#脚本给Lua调用,留几个空方法

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

[Hotfix]
public class HotFixEmpty : MonoBehaviour
{
    [LuaCallCSharp]
    void Start()
    {
        
    }

    [LuaCallCSharp]
    void Update()
    {
        
    }

    [LuaCallCSharp]
    private void OnTriggerEnter(Collider other)
    {
        
    }

    [LuaCallCSharp]
    private void BehaviourMethod()
    {

    }

lua 脚本

Lua 复制代码
xlua.private_accessible(CS.HotFixEmpty)
xlua.hotfix(CS.HotFixEmpty,'Start',function(self)
	self:Invoke("BehaviourMethod",8)
end)

xlua.hotfix(CS.HotFixEmpty,'Update',function(self)
	self.transform:Translate(-self.transform.right*4*UnityEngine.Time.deltaTime,UnityEngine.Space.World)
end)


xlua.hotfix(CS.HotFixEmpty,'OnTriggerEnter',function(self,other)
	if other.tag~="Untagged" and other.tag~="Wall" then
		UnityEngine.Object.Destroy(other.gameObject)
	end
end)

xlua.hotfix(CS.HotFixEmpty,'BehaviourMethod',function(self)
	CS.Gun.Instance.level=CS.Gun.Instance.level+1
	if CS.Gun.Instance.level==4 then
		CS.Gun.Instance.level=1
	end
	canCreateNewFish=true
	CS.Gun.Instance.changeAudio=true
	UnityEngine.Object.Destroy(self.gameObject)

end)

Lua中没有泛型

Lua 复制代码
itemGo:GetComponent('Gold').bossPrize = true

--有一说一,用text 文本编辑器写代码真的是一种折磨

相关推荐
韩仔搭建8 小时前
美乐迪电玩大厅加载机制与 RoomList 配置结构分析
游戏·小程序·开源·lua
老狼孩111221 天前
2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发
android·机器人·自动化·lua·脚本开发·懒人精灵·免root开发
珠峰下的沙砾2 天前
如何在 Postman 中,自动获取 Token 并将其赋值到环境变量
测试工具·lua·postman
时光话2 天前
Lua 第9部分 闭包
开发语言·lua
时光话2 天前
Lua 第7部分 输入输出
开发语言·lua
Hy行者勇哥4 天前
使用Postman调测“获取IAM用户Token”接口实际操作
测试工具·lua·postman
加油,旭杏6 天前
【Lua语言】Lua语言快速入门
开发语言·lua
徐同保6 天前
fetch使用put请求提交文件,postman使用put请求提交文件
测试工具·lua·postman
码到成功>_<9 天前
postman使用技巧
测试工具·lua·postman
King.62410 天前
SQL2API 核心理念:如何重构数据服务交付范式
大数据·开发语言·数据库·人工智能·sql·lua