Unity Lua

本文介绍了Lua语言的基础知识,包括变量的声明与赋值,如nil和number类型。详细讲解了字符串的操作,如长度、拼接和格式化。还涵盖了运算符的使用,如逻辑运算和幂运算。此外,文章讨论了表作为Lua的核心数据结构,以及如何进行迭代遍历、面向对象编程和垃圾回收机制。
摘要由CSDN通过智能技术生成

数值

--lua变量
--nil num
 ber string boolean
--lua所有变量不需要声名变量类型,且可以随便赋值
a=nil--类似null空
--number所有的数值都是number

字符串

--string 字符串,单引号双引号都可以
--获取字符串长度:  #str  汉字占三个长度
--支持转义字符:\n换行 [[多行打印字符串]]
--字符串拼接:"123".."456"   不同类型可拼接,皆为字符串
--string.format("测试%d程序",20) %d数字拼接,%a任何字符,%s字符配对
--转字符串:tostring(a)
--小写转大写:string.upper(str)
--大写转小写:string.lower(str)不会改变原字符串
--翻转:string.reverse(str)
--查找:string.find(str,"cc")字符串索引从1开始
--截取字符串:string.sub(str,3)第三位开始截,前两位不要
--字符串修改:string.gsub(str,"cs","**")//替换
--字符串转ASCII码:string.byte("Lua",1)
--string.char(a)

运算符

--Lua运算没有自增自减和复合运算
--print("123"+1) -->124字符串满足条件变成number 除法乘法自动有小数
--幂运算:2^3=8
--不等于:~=(不是!=)
--逻辑与:and 逻辑或:or 逻辑非:not 支持逻辑短路
--Lua不支持位运算,不支持三目运算符

条件分支语句

--if 条件 tnen..else..end
--多分支:if条件tnen elseif条件 then...end
--Lua没有Switch

循环

--while 满足条件 do..执行..end
--do while:
--repeat 执行 until 结束条件
--for i=1,5 do...执行...end (默认递增i+1)
--for i=1,5,2 do...执行...end(递增i+2)

函数

--function 函数名()...内容...end//无参数
--a=function()...内容...end
--function 函数名(a)...内容...end//有参数,不传参默认为nil,多传丢弃
--function 函数名(a)return a,123 end//有返回值,多返回值前面声名多个变量接取
--函数不支持重载
--function 函数(...)//变长参数,传表

--数组:所有复杂类型都是表(table)
--#是通用获取长度方式,空被忽略,空在中间后面会忽略
--二维数组:a={{12,3},{2,2,1}}  a[2][1] 
--自定义索引:a={[0]=1,2,3,[-1]=4}  [0],[-1]不计长度

迭代器遍历

--迭代器遍历表,#不准确
a={[0]=1,1,[-1]=3,4,5}
for i,k in ipairs(a) do
print("ipairs遍历键值"..i.."_"..k);
end
--ipairs遍历键值1_1//ipairs遍历键值2_4//ipairs遍历键值3_5
for i,v in pairs(a) do
print("pairs遍历键值"..i.."_"..v);
end
--pairs遍历键值找到所有

复杂数据类型

-字典声名,键值对 a.name(字典.键,键不能是数字)
--字典新增,直接赋值 a["name"]="123"
--删除nil
--Lua默认没有面向对象,需要自己实现
--:Lua 冒号调用方法会默认把调用者作为参数传入 Student:Learn()//Student.Learn(Student)
--Lua关键字self表示默认传入的第一个参数,在:传入时作为传参
--表插入: table.insert(t1,t2)//t2插入t1
--表删除:table.remove(t1)//移除最后索引元素
--table.remove(t1,1)//移除指定索引元素
--table.sort(t1)//升序排列 
--table.sort(t1,function(a,b) if a>b them return true end//降序
--拼接:table.concat(t1,";")//使用;连接表中元素,返回值是字符串

多Lua脚本执行

--本地变量 关键字 loacl a=1
--多脚本执行 关键字 require("脚本名")//跨脚本调用
--如果是require加载执行的脚本,加载一次后不会再被执行
--package.load["脚本名"]//返回值布尔,该脚本是否被执行
--package.load["脚本名"]=nil//卸载脚本
--_G:大G表,存储声名的所有全局变量
--最后一句 return a 可以把本地变量返回出去 require时可以获取到

特殊用法

--多变量赋值 如果后面值不够自动补空,多余省去
--多返回值时,用几个变量接就有几个值,不同为空
--and or 不仅可以连接bool,任何都能连接
--在Lua中 只有nil和false才为假(0真)  1 and 2 =>2 短路
--Lua三目运算: a=(x>y) and x or y

协程

--创建:co=coroutine.create(fun)//线程类型  co2=coroutine.wrap(fun)//函数类型
--运行:coroutine.resume(co)    co2()  
--挂起:coroutine.yield()   
--yield(i)返回值第二个coroutine.resume(co)=i,第一个返回值为协程是否启动成功bool co2无第一个返回值
--状态:coroutine.status(协程对象co)
--dead结束,suspended暂停/挂起,running进行中(内部得到)   
--coroutine.running()//得到当前正在运行线程号(内部)

元表

任何表变量都可以作为另一个表变量的元表
任何表变量都可以有自己的元表
当表变量进行特定操作时会执行元表中的内容
--meta={__tostring=function() return a end}//当子表作为字符串使用时,会默认调用元表的tostring方法
--myTable={}
--设置元表函数:setmetatable(myTable,meta)//子表,元表
--__call=function() print(a) end//当子表作为函数使用时,默认调用__call内容
--把子表当作函数使用,默认调用元表方法 :myTable(1)
--meta={__add=function(t1,t2) return t1.value+t2.value end}//当子表使用+运算时,调用该方法
--//如果要用条件运算比较,元表一定要一致
--__index 当子表找不到某一属性时,会到元表__index指定表去找属性
--__index赋值写在表外来初始化
--newndex 当赋值时,如果赋值一个不存在的索引,会把这个值赋到newindex所指表中,不会修该自己
--mata.newindex={} 
--得到元表方法 getmetatable(myTable)//得到myTable元表
--rawget(myTable,"age")//先找自己变量,不管元表
--rawset(myTable,"age",2)//忽略newindex设置,只修改自己变量

面向对象

--封装:基于table来实现//Object={}  Object.id=1
function Object:new()--冒号表示自动调用这个函数的对象,作为第一个参数传入的写法
-- self表示默认传入的第一个参数
self.__index=self
setmetatable(obj,self)
local obj={}
return Obj
end
local myObj=Object:new()
print(myObj)
print(myObj.id)
--继承:写一个用于继承的方法
function Object:subClass(className)
--_G总表 所有声名的全局变量
_G[className]={}
local obj=_G[className]
self.__index=self
setmetatable(obj,self)
end
Object:subClass("Person")--继承Object,调用
local p1=Person:new()
print(p1.id)
--多态:相同方法不同执行逻辑
Object:subClass("GameObject")
GameObject.posX=0;
function GameObject:Move()
self.posX=self.posX+1
print(self.posX)
end
GameObject:subClass("Player")
function Player:Move()--重写//保留父类方法base
--self.base:Move()
--这种方式调用相当于把基类表作为第一个参数传入方法
--避免把基类表传入方法中,不用冒号传入
self.base.Move(self)
--如果要执行父类逻辑,需要.调用
end
local p1=Player:new()--不同对象使用成员变量相同
p1.Move()

自带库

--时间:
os.time()--系统时间
--os.time({yesr=2023,month=2,day=14})--传参
local nowTime= os.date("*t")--当前时间表,nowTime.hour
--数学运算
math.abs(a)--绝对值
math.deg(math.pi)--弧度转角度
math.cos(math.pi)--三角函数 传弧度
math.floor(2.3)--2
math.ceil(3.4)--4 向下向上取整
math.max(2,5)
math.min(2,4)--最大最小值
math.modf(1.2)--小数整数分离,返回两个参数
math.pow(2,4)--幂 指数
math.randomseed(os.time)--先设置随机数种子
math.random(100)--随机数
math.sqrt(4)--开方
--路径
package.path--lua脚本加载路径,可修改

垃圾回收

--垃圾回收关键字:collectgarbage
collectgarbage("count")--获取当前lua占用内存数 K字节 用返回值*1024得到具体占用字节数
collectgarbage("collect")--进行垃圾回收,GC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上桑AGO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值