Lua热更新

news2024/11/26 9:31:25

Lua热更新解决方案

文章目录

  • Lua热更新解决方案
    • 1.AB包
      • 1.1 AB包概述
    • 1. 从0开始的Lua语法
      • 1.1 HelloWorld
      • 1.2 数据类型
      • 1.3 字符串
      • 1.4 运算符
      • 1.5 条件语句
      • 1.6 循环语句
      • 1.7 函数
      • 1.8 数组
      • 1.9 迭代器
      • 1.10 字典,类,对象
      • 1.11 多脚本执行
      • 1.12 特殊语法
      • 1.13 协程
      • 1.14 元表
      • 1.15 面向对象
      • 1.16 库函数

1.AB包

1.1 AB包概述

AB包:特定于平台的资产压缩包,类似压缩文件,资产包括 模型,贴图,预设体,音效,材质球等。

Resources和AB包的区别
Resources打包时为只读,无法修改。
AB包存储位置和压缩方式可自定义,后期可以动态更新。
AB包可以减小包体大小,并且实现资源或者脚本的热更新。

热更新的基本规则
请添加图片描述
Tip:C#脚本无法打成AB包,这也是我们学习Lua的原因。请添加图片描述

ABBrowser参数相关 : build页面:

在这里插入图片描述

1. 从0开始的Lua语法

1.1 HelloWorld

--单行注释内容
--Lua语句可以省略分号
--[[多行注释1]]
--[[多行注释2]]--
print("Hello World")
print("你好 Lua")

1.2 数据类型

--lua变量声明不需要声明类型
a = nil;
print(a);
--nil也是一种数据类型
--所有的数字类型都是number
a = 1
print(a)
a = 1.2
print(a)
--单引号或双引号都是字符串string
a = "123456"
print(a)

a = true
print(a)

--查看类型(type本身返回值是string)
print(type(a)) --boolean
--常见的四种类型:number,string,boolean,nil
--复杂的四种变量类型:function,table,userdata,thread

1.3 字符串

str = "slkajdd哈哈"

--字符串的长度
--中文字符在Lua中占三个长度
print(#str);

--转义字符
print("123\n123")

--多行打印字符串
s = [[我是
哈哈
嘿嘿]]

--字符串(不仅限于字符串)拼接
print("123" .. "456")

--替换符
print(string.format("我今年 %d 岁了",18))

s = "abca"

--其他类型转换为字符串
print(tostring(s))

--小写转大写
print(string.upper(str));
--大写转小写
print(string.lower(str));
--反转字符串
print(string.reverse(s))
--字符串查找索引
print(string.find(s,"a")) -- 1 1(双返回值)
--字符串截取
print(string.sub(s,2,3)) -- bc
--字符串修改
print(string.gsub(s,"a","b")) -- bbcb 2(双返回值)
--字符转ASCII
print(string.byte("Lua",1)) --(L)76
print(string.byte("A",1)) --(A)65
--ASCII转为字符
print(string.char(65)) --A

1.4 运算符

-- +-*/%都一样,但没有 += /= ++ --等等
--与C#不同的一点
print("123.4" + 1) --124.4
--幂运算 ^
print(2^10)
--不等号
print(8 ~= 7)  
-- 与 或 非
print(true and false)
print(false or 1 == 1)
print(not (8 == 9))

--支持短路
print(true and print(123))

1.5 条件语句

a = 9
if a > 5 then
	print(123)
elseif a < 3 then
	print(321)
else
	print("哈哈哈")
end

1.6 循环语句

num = 0

--while语句
while num < 5 do
	print(num)
	num = num + 1
end

print("----------------")

--do while语句
num = 0
repeat
	print(num)
	num = num + 1
until num > 5 --满足条件跳出


print("----------------")

--for 循环
num = 0
for i = 1,5 do --i会默认的递增
	print(i)
end

print("----------------")

--自定义i递增幅度
for i = 1,10,2 do
	print(i)
end

1.7 函数

--函数的第一种写法
function f1()
	
end

--第二种写法
f2 = function ()
	
end

-- 有参数的函数
function f2( a )
	print(a)
end

f2("hhh")
f2("saklj",1,3)
f2()

-- 有返回值函数(多返回值)
function f4( a )
	return a,"123",true
end
t1,t2,t3 = f4("asldkj")
print(t1)
print(t2)
print(t3)

--函数的类型
f4 = function (  )
	
end
print(type(f4))

--函数重载:不支持重载,会调用最后声明的函数
function f5(  )
	print("无参")
end
function f5( str )
	print(str)
end
f5()

--变长参数
function f6( ... )
	arg = {...}
	for i = 1,#arg do
		print(arg[i])
	end
end
f6(1,"hh",true,'h',nil)

--函数嵌套
function f7(  )
	f8 = function(  )
		print("函数嵌套")
	end
	return f8
end

f9 = f7()
f9()
f7()()

-- 函数闭包
function f11( x )
	return function( y )
		return x + y
	end
end

res = f11(10)(5)
print(res)

1.8 数组

print("---------数组----------")
--所有负载类型都是table
a = {1,"hh",true,nil,5,6,7}
-- lua的数组下标从1开始!!!
print(a[4])
--获取数组长度
print(#a)

print("---------数组遍历----------")
for i=1,#a do
	print(a[i])
end

print("---------二维数组----------")
a = {{1,2,3},{4,5,6}}
print(a[1][1])

print("---------二维数组遍历----------")
for i=1,#a do
	b = a[i]
	for j=1,#b do
		print(a[i][j])
	end
end

print("---------自定义索引----------")
aa = {[0] = 1,[-1] = 2,3}
print(aa[-1])
print(aa[1])

--跳过一个索引,会默认为空
bb = {[1] = 1,[2] = 2,[4] = 4,[6] = 6}
print(#bb)

--跳过两个索引,就会停止遍历
bb = {[1] = 1,[4] = 4}
print(#bb)

1.9 迭代器

print("---------迭代器遍历----------")
a = {[0] = 1,2,[-1] = 3,4,5}

-- ipairs:只能从1开始找到连续索引的键,如果中间断续了,后续无法遍历
-- 通过索引遍历
for i,k in ipairs(a) do
	print("ipairsb遍历键值"..i.."_"..k)
end

-- pairs迭代器:找到所有值
-- 遍历所有值
for i,j in pairs(a) do
	print("pairs遍历键值"..i.."_"..j)
end

1.10 字典,类,对象

print("---------字典----------")
a = {["name"] = "shawn",["age"] = 14}
print(a["name"])
print(a.age)
a.age = 18
print(a["age"])
a.sex = false
print(a.sex)
a.sex = nil
print(a["sex"])

print("---------类和结构体----------")
-- lua中没有面向对象,需要自己前去实现
Student = {
	age = 19,
	sex = true,
	Up = function (  )
		Student.age = Student.age + 1
		print("我成长了")
	end,

	Learn = function ( t )
		print(t.sex)
		print("好好学习")
	end
}
Student.name = "shawn"
Student.Speak = function (  )
	print("肖恩说话")
end

function Student.Haha(  )
	print("haha")
end

print(Student.age)
Student.Up()
Student.Speak()
Student.Haha()
print(Student.age)
print(Student["name"])

--Lua中.和:的区别
Student.Learn(Student)
Student:Learn()

print("---------表的公共操作----------")
t1 = {{age = 1,name = "123"},
	  {age = 2,name = "345"}}

t2 = {name = "Shawn",sex = true}

-- 表的插入
print(#t1) -- 2
table.insert(t1,t2)
print(#t1) -- 3
print(t1[3].name) -- Shawn

-- 删除指定元素
table.remove(t1)
print(t1[1].name) --123,移除最后一个元素

table.remove(t1,1) 
print(t1[1].name) --456,移除指定索引内容

-- 列表排序
print("升序排列")
t2 = {5,2,4,7,9}
table.sort(t2)
for i,v in pairs(t2) do
	print(i .. "_" .. v) --升序排列
end
--自定义排序
print("自定义排序")
table.sort(t2,function ( a,b )
	if a > b then
		return true
	end
end)
for i,v in pairs(t2) do
	print(i .. "_" .. v) --升序排列
end

--拼接
print("拼接")
tb = {"123","456","789"}
str = table.concat(tb,"_") --123_456_789
print(str)

1.11 多脚本执行

print("----多脚本执行----")

print("----全局变量与局部变量----")
--全局变量
--平时的的定义基本都是全局变量
--局部变量(尽量多使用local,否则浪费内存)
 for i = 1,2 do
 	local d = "唐老师"
 end
print(d)
print("----多脚本执行----")
--require关键字,使用其他脚本中的字段
require("Test")
print(A)
print(B) --因为是局部变量,没获取到

require("Test") --如果已经加载过,不会再执行

print("----脚本卸载----")
--package关键字
z = package.loaded["Test"] --得到是否被加载过
print(z)
package.loaded["Test"] = nil --卸载脚本
print(package.loaded["Test"])

print("----大G表----")
--_G是一个总表(table),他存储着我们申明的所有全局变量。
  for k,v in pairs(_G) do
 	print(k , v)
 end--
 --将局部变量通过return返回出去,可以在外部访问变量
 package.loaded["Test"] = nil
 local locolB = require("Test")
 print(localB)

1.12 特殊语法

-- and 和 or逻辑
--不仅可以连接boolean,任何东西都可以连接。
--在lua中,只有nil和false被认为是假
print(1 and 2) --2
print(0 and 1) --1
print(nil and 1) -- nil
print(false and 2) -- false
print(true and 3) --3

print(true or 1) --true
print(false or 2) --2
print(nil or 3) -- 3

1.13 协程

print("协程的创建")
--coroutine.create()
fun = function ( )
	print(123)
end
co = coroutine.create(fun)
print(co) --thread...协程本质是线程对象

--coroutine.wrap()
co2 = coroutine.wrap(fun)
print(co2) --返回一个函数function

print("协程的运行")
--第一种
coroutine.resume(co)
--第二种
co2()

print("协程的挂起")
func2 = function (  )
	local i = 1
	while true do
		print(i)
		i = i + 1
		--协程的挂起
		coroutine.yield()
	end
end
--1
co3 = coroutine.create(func2)
coroutine.resume(co3)
coroutine.resume(co3)
coroutine.resume(co3) 
--默认第一个参数是有无启动成功,第二参数是真返回值
--2
co4 = coroutine.wrap(func2)
co4()
co4()
co4()
--没有默认第一个是否执行成功的返回值

print("协程的状态")
--coroutine.status(协程对象)
print(coroutine.status(co3)) --暂停
print(coroutine.status(co))

1.14 元表

print("-------元表概念------")
--任何表变量都可以作为其他的元表
--在对子表中进行一些特定操作时,会执行元表的内容
print("-------元表设置------")
meta = {}
myTable = {}
--Param:子表,元表
setmetatable(myTable,meta)


print("-------特定操作tostring------")
meta2 = {
	__tostring = function ( t )
		return t.name
	end,
	--当子表被当作一个函数来使用时,会默认调用call
	--当希望传参数时,默认第一个参数是调用者自己
	__call = function ( a,b )
		print(a ," " , b)
	end
}
mytable2 = {
	name = "Shawnlove"
}
setmetatable(mytable2,meta2);
print(mytable2) --Shawn(获得了元表中的函数数据)
--当子表被当作一个函数来使用时,会默认调用call
mytable2(100) --Shawnlove 100


print("-------特定操作call------")
meta4 = {
	__add = function ( t1,t2 )
		return t1.age + t2.age
	end
	--sub,mul,div,mod,pow,eq,lt,le,concat
}
mytable4 = {age = 1}
mytable5 = {age = 20}
setmetatable(mytable4,meta4)
print(mytable4 + mytable5) -- 21


print("-------特定操作 运算符重载------")

print("-------特定操作 index和newIndex------")
meta6 = {age = 1}
meta6.__index = meta6 --__index写在外面取赋值
mytable6 = {}
setmetatable(mytable6,meta6)
--当子表中找不到某个属性时,会到元表中__index指向的索引
print(mytable6.age);

--newIndex
meta7 = {}
meta7.__newIndex = {}
mytable7 = {}
setmetatable(mytable7,meta7)
mytable7.age = 100
print(mytable7.age)

1.15 面向对象

print("封装")
Object = {}
Object.id = 99

function Object:new()
	local obj = {}
	self.__index = self --当找自己找不到时,会顺着元表中index指向的内容
	setmetatable(obj,self)
	return obj
end

function Object:Test(  )
	print(self.id)
end

local myObj = Object:new()
print(myObj)
print(myObj.id) --1
myObj:Test()

--修改id仅修改了当前对象的id
myObj.id = 2
myObj:Test() --2

print("继承")
--C#: class 类名 : 父类
--写一个用于继承的函数
function Object:subClass( className )
	--_G:本质是一个总表,所有声明的全局变量都存在其中
	_G[className] = {}
	--元表
	local obj = _G[className]
	self.__index = self
	obj.base = self
	setmetatable(obj,self)
end

Object:subClass("Person")
print(Person.id)

print("多态")
--相同方法,不同具体表现,就是多态
Object:subClass("GameObject")
GameObject.x = 0
GameObject.y = 0
function GameObject:Move(  )
	self.x = self.x + 1
	self.y = self.y + 1
	print(self.x)
	print(self.y)
end

GameObject:subClass("Player")
function Player:Move(  )
	self.base.Move(self)
end

local p1 = Player:new()
p1:Move()
p1:Move()

local p2 = Player:new()
p2:Move()

1.16 库函数

--时间相关
print("---时间相关")
--系统时间
print(os.time())
print(os.time({year = 2022,month = 12,day = 19}))
local nowTime = os.date("*t")
for k,v in pairs(nowTime) do
	print(k,v)
end
print(nowTime.sec)


print("---数学运算")
print(math.abs(-11))
print(math.deg(math.pi))
print(math.cos(math.pi))

print(math.floor(2.6))
print(math.ceil(5.2))

print(math.max(1,2))
print(math.min(4,5))

print(math.modf(1.2))
print(math.pow(2,5))

math.randomseed(os.time())
print(math.random(100))
print(math.random(100))

print("---路径")
--加载路径
print(package.path)

--垃圾回收关键字
test = {id = 1,name = "haha"}
--获取当前lua占用内存数K字节,用返回值*1024就可以得到具体内存占用字节数
print(collectgarbage("count"))
test = nil
collectgarbage("collect")
print(collectgarbage("count"))
--Unity中尽量手动进行垃圾回收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hive时间和字符串互转,时间函数

hive里经常需要将字符串转化为date或timestamp 或者转化为日期格式的string 先说一个简单的 cast(xx as date/string/timestamp) 这个大多情况都可以用 1.to_date to_date只保留年月日,参数必须是string类型的yyyy-MM-dd HH:mm:ss或者date或timestamp类型,返回值是date类型,…

尚太科技开启招股:预计募资总额22亿元,业绩增长迅猛

12月19日&#xff0c;石家庄尚太科技股份有限公司&#xff08;下称“尚太科技”&#xff0c;SZ:001301&#xff09;开启招股&#xff0c;将在深圳证券交易所主板上市。本次冲刺上市&#xff0c;尚太科技的发行价格为33.88元/股&#xff0c;发行数量为6494.37万股&#xff0c;募…

MySQL Binlog温故知新

目录 一、什么是Binlog 二、Binlog文件记录模式 三、Binlog 日志内容 四、常用的binlog日志操作命令 五、binlog日志中间件 一、什么是Binlog Binlog &#xff08;Binary log&#xff09;是MySQL的二进制日志&#xff0c;以二进制的形式记录了对于数据库的变更&#xff0…

Tesseract-OCR 和cnocr/cnstd

Tesseract-OCR学习系列 Tesseract-OCR学习系列&#xff08;四&#xff09;API - 简书 参考文档&#xff1a;https://github.com/tesseract-ocr/tesseract/wiki/APIExample 这篇文章介绍了GetComponentImages等基础api的用法 Python 自动识别图片文字—保姆级OCR实战教程 Py…

使用界面配置静态路由(保姆级教程)

啰嗦几句 因为写的很详细&#xff0c;保姆级别的&#xff0c;所以看起来内容很多&#xff0c;但是东西就那一点&#xff0c;你自己配个2、3遍就会了。期末考试也不用担心这个实验了。 使用Cisco Packet Tracer这个软件。 原文件下载 补充&#xff1a;下载后使用Cisco Packet T…

有源电力滤波器——低压配电系统

安科瑞 华楠 一、谐波的危害 ● 使公用电网中的设备产生附加谐波损耗&#xff0c;降低电网、输电及用电设备的使用效率。 ● 在三相四线制系统中&#xff0c;由于零线流过大量的3n次谐波电流&#xff0c;造成零线过热。 ● 谐波会产生额外的热效应&#xff0c;引起用电设备…

GitLab创建新分支并同步其它分支的内容(IDEA)

拉取项目到本地 选择对应项目并复制clone地址 打开IDEA&#xff0c;选择File–》New–》Project from Version Control 在弹出的对话框中粘贴刚才复制的地址 完成后项目就被拉取到本地对应目录中了 创建新分支 这里以master分支为例&#xff0c;其它分支同理 首先在GitL…

Linux Red Hat 8.0 find命令练习

find&#xff1a;主要用来查找字符串 常用参数&#xff1a; -name 搜索文件名 -iname 搜索文件名时大小写不敏感 -type d 目录、 f 普通文件、 l 符号链接 -size 指定搜索文件大小 -perm 按执行权限来查找 -user 按…

在线考试网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;老师模块、班级模块、学生模块、课程模块、试题模块、试卷模块、 组卷模块、考试模块、答题模块 …

什么是项目风险管理?要如何执行风险管理?

项目风险管理是项目管理中重要组成部分之一&#xff0c;其影响着项目是否能成功最终交付的关键。虽然项目经理都无法准确地预测未来项目结果&#xff0c;但可以应用一种精简的风险管理流程来预测项目管理中的不确定性&#xff0c;并将这些不确定因素的影响降到最低。因此如何执…

基于Python+Django+Vue+MYSQL的邯郸地标美食导游平台

项目介绍 我的家乡是邯郸市。邯郸市我国为数不多的3000年没有改变过名字城市。我的家乡就是邯郸。在我的家乡有非常多的旅游景点和美食。为了让更多的人了解到邯郸的旅游景点和好吃的美食信息&#xff0c;我通过pythonvueelementui开发了本次的邯郸家乡网红旅游景点美食导游平…

CSS高级 DAY2

目录 选择器进阶 复合选择器 后代选择器 子代选择器 并集选择器 交集选择器 hover伪类选择器&#xff08;就是鼠标悬停选择器&#xff09; 背景有关属性 背景颜色 背景图片 背景平铺 背景位置 背景的复合属性 元素显示模式 块级元素 行内元素 行内块元素 元素显示…

SimpleDateFormat线程不安全解析以及解决方案

我们都知道SimpleDateFormat是Java中用来日期格式化的一个类&#xff0c;可以将特定格式的字符转转化成日期&#xff0c;也可将日期转化成特定格式的字符串。比如 将特定的字符串转换成日期 public static void main(String[] args) throws ParseException {SimpleDateFormat…

windows11打开隐藏的gpedit.msc本地组策略编辑器以及禁止自动更新系统

目录打开隐藏的gpedit.msc本地组策略编辑器windows11禁止自动更新系统打开隐藏的gpedit.msc本地组策略编辑器 1.新建.txt文本文件&#xff0c;输入如下代码 echo off pushd “%~dp0” dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtension…

a股行情接口功能特点

a股行情接口功能特点&#xff0c;如下&#xff1a; 1、支持A股历史交易查询&#xff1b; 2、包括股票数据&#xff1b; 3、每日A股收盘后更新当日交易数据&#xff0c;停牌不更新&#xff1b; 4、支持多股历史数据一次查询&#xff1b; 5、支持任何时间段查询&#xff1b;…

Linux进程概念(二)

Linux进程概念进程状态普通操作系统层面理解运行与阻塞挂起与阻塞Linux是怎么做的孤儿进程进程优先级什么是优先级如何改变优先级其他概念进程状态 进程状态分有&#xff1a; 运行 新建 就绪 挂起 阻塞 等待 停止 挂机 死亡… 状态其实就是返回的整形&#xff0c;就像某个数字…

【毕业设计_课程设计】基于 SVM 分类器的动作识别系统(源码+论文)

文章目录0 项目说明1 研究目的2 研究方法2.1 动作采集2.2 动作识别2.3 智能家居模拟3 论文目录4 项目工程0 项目说明 基于 SVM 分类器的动作识别系统 提示&#xff1a;适合用于课程设计或毕业设计&#xff0c;工作量达标&#xff0c;源码开放 1 研究目的 本项目对经典 SVM 二…

从企业关心的重点,带你了解商业智能BI

企业进行信息化建设&#xff0c;能通过业务信息系统以及规范化、标准化的业务流程存储高质量的业务数据&#xff0c;而这些数据则是数字化转型成功的重要条件。只有信息化和数字化共同发展&#xff0c;企业才能成功完成数字化转型&#xff0c;构建全新的商业模式&#xff0c;完…

kafka的客户端限流(资源配额)

前言 本文说明的是Kafka的客户端&#xff08;生产者、消费者&#xff09;与broker之前的限流&#xff0c;不是kafka的broker间topic副本同步的限流。 客户端限流 在kafka的官方文档&#xff0c;不叫限流&#xff0c;叫做资源配额&#xff1a;通过对客户端请求进行配额&#…

细节决定成败:探究Mybatis中javaType和ofType的区别

一. 背景描述 今天&#xff0c;给学生讲解了Mybatis框架&#xff0c;学习了基础的ORM框架操作及多对一的查询。在练习的时候&#xff0c;小张同学突然举手求助&#xff0c;说在做预习作业使用一对多查询时&#xff0c;遇到了ReflectionException 异常 。 二. 情景再现 1. 实…