stonstad 发表于 2022-10-21 07:13

Unity tolua 常用方法

1.Json操作
local cjson = require "cjson"

//解析json
local sampleJson = '{"name":"abc","age":"23","obj":{"array":}}';
local data = cjson.decode(sampleJson);
print('name=' .. data["name"]);
print('array=' .. data["obj"]["array"]);

//创建json
local tjson = {};
tjson["abc"] = 1;
print("jsondata:" .. cjson.encode(tjson));2.字符串操作
-- 字符串分割
-- 参数str是你的字符串,比如"a|b|c"
-- 参数sep是分隔符,比如"|"
-- 返回值为["a","b","c"]
function SplitString(str, sep)
    local sep = sep or " "
    local result = {};
    local pattern = string.format("([^%s]+)", sep)
    local rs = string.gsub(str, pattern, function(c) result[#result + 1] = c end);
    return result
end

--字符串替换操作
> string.gsub("aaaa","a","z",3);
zzza    3

-- 等等其他用法3.table操作
序号方法 & 用途1table.concat (table [, sep [, start [, end]]]):concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
2table.insert (table, value):在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
3table.maxn (table)指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)
4table.remove (table [, pos])返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
5table.sort (table [, comp])对给定的table进行升序排序。
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))

-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))

-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))


连接后的字符串   bananaorangeapple
连接后的字符串   banana, orange, apple
连接后的字符串   orange, apple


-- table最大值
function table_maxn(t)
local mn=nil;
for k, v in pairs(t) do
    if(mn==nil) then
      mn=v
    end
    if mn < v then
      mn = v
    end
end
return mn
end
tbl = { = 2, = 6, = 34, =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)
-- 结果
tbl 最大值:    34
tbl 长度   3

--当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。

--可以使用以下方法来代替:
function table_leng(t)
local leng=0
for k, v in pairs(t) do
    leng=leng+1
end
return leng;
end4.创建lua类
__newindex 元方法用来对表更新,__index则用来对表访问 。
--声明,这里声明了类名还有属性,并且给出了属性的初始值。
LuaClass = {x = 0, y = 0}

--这句是重定义元表的索引,就是说有了这句,这个才是一个类。
LuaClass.__index = LuaClass

--构造体,构造体的名字是随便起的,习惯性改为New()
function LuaClass:New(x, y)
    local self = {};    --初始化self,如果没有这句,那么类所建立的对象改变,其他对象都会改变
    setmetatable(self, LuaClass);--将self的元表设定为Class
    self.x = x;
    self.y = y;
    return self;    --返回自身
end

--测试打印方法--
function LuaClass:test()
    logWarn("x:>" .. self.x .. " y:>" .. self.y);
end--创建LuaClass 对象
local lc1 = LuaClass:New(1, 2);
lc1:test();
local lc2 = LuaClass:New(3, 4);
lc2:test();__newindex元方法:
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })

print(mytable.key1)

mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)

mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)

--以上实例执行输出结果为:
value1
nil    新值2
新值1    nil5.lua中.和:的区别
--冒号:在定义时省略了self
--点号:在定义时不省略self

Class = {}
Class.__index = Class
   
function Class.new(x,y)
    local cls = {}
    setmetatable(cls, Class)
    cls.x = x
    cls.y = y
    return cls
end

-- 实例方法

function Class:test()
    print(self.x,self.y)
end
-- 等价于
function Class.test(self)
    print(self.x,self.y)
end

function Class.testStatic() --类似于静态方法
    print('abc')--(self无法识别:静态方法里不是访问非静态)
end

object = Class.new(10,20)

object:test()
-- 等价于
object.test(object)
页: [1]
查看完整版本: Unity tolua 常用方法