Lua热更新学习

在游戏开发中,常采用Lua进行热更新,本文主要记录lua学习过程中的知识点
Lua框架选择腾讯维护的xLua进行学习

lua语法

Lua中文文档

常用tips

// 无需结尾;分号
// nil 表示回收内存
// type() 获取类型
// 单行注释 --
// 多行注释 --[[]]--
// 字符串连接 ..
// 求字符串长度 #str 字节数
// tonumber() tostring()
// lua没有整数类型
// lua没有++ --
// lua的不等于~=
// lua的power()可以直接用^
// 与and 或or 非not
// lua默认为全局变量 如需声明局部写local
// 基本类型 nil boolean string number table function 
// 字符串定义 '' "" [[]]
// lua内置关键字arg 代替{...}
// 当可变参数含有nil时需要用select,select('#', ...) 与arg冲突   可变参数的长度 select(i, ...) 从i到末尾的所有元素

判断与循环

// 判断语句
if() then
elseif() then
else
end
// while循环
while() do
end
// repeat循环
repeat
until()
// for循环 数值
for i = 1, 10, 2 do // 1-10 step=2
end
// for循环 泛型
// ipairs()数组集合,遇到nil不再输出  pairs()键值集合,可输出nil及其后面的元素
for k, v in ipairs() do
end

函数定义

// 函数 无需返回,无需参数类型,支持多返回值
function funName(num1, num2)
end
// 匿名函数 无需函数名,但需赋值
funName = function(num1)
end
// return funName() 尾调用不占用堆栈空间,不会栈溢出
// 函数本质与普通类型相同,可以存储在变量或者表中
// 函数只有一个实例 闭包可以拥有多个实例
// 定义模块不能加local

// 标记视频 16 14 19

字符串操作

string.len() string.upper() string.lower()
string.find()
string.sub() string.gsub() // 字符串截取 字符串替换
string.reverse() // 反转
string.format("%d%d", num1, num2) // 格式化

table

// * lua下标从1开始
// table.getn() 不可获得键值集合的长度
// table.concat() 合并
// table.insert() 插入
// table.remove() 移除
// table.sort() 排序 可按ascii排字符串

面向对象编程

// 声明空表
Person = {}
// 定义字段
Person.Name = ""
// 定义方法
function Person.Run()
end
person.Run = function()
end
// 定义局部表引用变量,降低耦合性
local this = Person
// 使用self需要改成Persion:Run()

标准库函数

math.abs() math.max() math.min() math.sin() math.cos() math.sqrt()
math.randomseed() math.random() math.floor()
os.data() os.time()
// 自定义随机生成 os.time() reverse sub(1, 6)

内置IDE sciTE
VS环境 babelua插件

热更方案

xLua项目地址

三种C#读取Lua文件的方法

using XLua;
public class FirstLua:MonoBehaviour {
	LuaEnv env = null;
	void Start() {
		env = new LuaEnv();
		// --------------------1. 简单使用----------------------
		env = DoString("print('Hello World')"); // 使用Lua脚本
		env = DoString("CS.UnityEngine.Debug.Log('Hello World')"); // Lua调用C#系统类
		// --------------------2. 使用TextAsset方式加载----------------------
		TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");
		env.DoString(ta.ToString());
		// --------------------3. 使用require加载文件----------------------
		// 需要保证文件位于Resource文件夹下,且以.txt后缀结尾
		env.DoString("require 'HelloWorld'"); // 不用加后缀
		
		// --------------------自定义文件路径----------------------
		// 文件位置随意,也不需要.txt结尾
		env.AddLoader(CustomMyLoader);
		// 修改默认路径
		private byte[] CustomMyLoader(ref string fileName) {
			// 定义lua路径
			string luaPath = Application.dataPath + '/Scripts/LuaScripts' + fileName + '.lua';
			// 读取指定路径下的文件内容,需引入using System.IO
			string strLuaContent = File.ReadAllText(luaPath);
			// 数据类型转换
			byte[] byArrayReturn = System.Text.Encoding.UTF8.GetBytes(strLuaContent);
			return byArrayReturn;
		}
	}
	void OnDestroy() {
		env.Dispose();
	}
}

获取全局基本数据类型

env.Global.Get<Int>("a");

AssetBundle

你可能感兴趣的:(unity)