找回密码
 立即注册
查看: 187|回复: 0

Unity tolua 常用方法

[复制链接]
发表于 2022-10-21 07:13 | 显示全部楼层 |阅读模式
1.Json操作
  1. local cjson = require "cjson"
  2. //解析json
  3. local sampleJson = '{"name":"abc","age":"23","obj":{"array":[1,2,3]}}';
  4. local data = cjson.decode(sampleJson);
  5. print('name=' .. data["name"]);
  6. print('array[1]=' .. data["obj"]["array"][1]);
  7. //创建json
  8. local tjson = {};
  9. tjson["abc"] = 1;
  10. print("jsondata:" .. cjson.encode(tjson));
复制代码

2.字符串操作
  1. -- 字符串分割
  2. -- 参数str是你的字符串,比如"a|b|c"
  3. -- 参数sep是分隔符,比如"|"
  4. -- 返回值为["a","b","c"]
  5. function SplitString(str, sep)
  6.     local sep = sep or " "
  7.     local result = {};
  8.     local pattern = string.format("([^%s]+)", sep)
  9.     local rs = string.gsub(str, pattern, function(c) result[#result + 1] = c end);
  10.     return result
  11. end
  12. --字符串替换操作
  13. > string.gsub("aaaa","a","z",3);
  14. zzza    3
  15. -- 等等其他用法
复制代码

3.table操作
序号方法 & 用途
1table.concat (table [, sep [, start [, end]]]):concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
2table.insert (table, [pos,] 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进行升序排序。
  1. fruits = {"banana","orange","apple"}
  2. -- 返回 table 连接后的字符串
  3. print("连接后的字符串 ",table.concat(fruits))
  4. -- 指定连接字符
  5. print("连接后的字符串 ",table.concat(fruits,", "))
  6. -- 指定索引来连接 table
  7. print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
  8. 连接后的字符串     bananaorangeapple
  9. 连接后的字符串     banana, orange, apple
  10. 连接后的字符串     orange, apple
  11. -- table最大值
  12. function table_maxn(t)
  13.   local mn=nil;
  14.   for k, v in pairs(t) do
  15.     if(mn==nil) then
  16.       mn=v
  17.     end
  18.     if mn < v then
  19.       mn = v
  20.     end
  21.   end
  22.   return mn
  23. end
  24. tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
  25. print("tbl 最大值:", table_maxn(tbl))
  26. print("tbl 长度 ", #tbl)
  27. -- 结果
  28. tbl 最大值:    34
  29. tbl 长度     3
  30. --当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
  31. --可以使用以下方法来代替:
  32. function table_leng(t)
  33.   local leng=0
  34.   for k, v in pairs(t) do
  35.     leng=leng+1
  36.   end
  37.   return leng;
  38. end
复制代码

4.创建lua类
__newindex 元方法用来对表更新,__index则用来对表访问 。
  1. --声明,这里声明了类名还有属性,并且给出了属性的初始值。
  2. LuaClass = {x = 0, y = 0}
  3. --这句是重定义元表的索引,就是说有了这句,这个才是一个类。
  4. LuaClass.__index = LuaClass
  5. --构造体,构造体的名字是随便起的,习惯性改为New()
  6. function LuaClass:New(x, y)
  7.     local self = {};    --初始化self,如果没有这句,那么类所建立的对象改变,其他对象都会改变
  8.     setmetatable(self, LuaClass);  --将self的元表设定为Class
  9.     self.x = x;
  10.     self.y = y;
  11.     return self;    --返回自身
  12. end
  13. --测试打印方法--
  14. function LuaClass:test()
  15.     logWarn("x:>" .. self.x .. " y:>" .. self.y);
  16. end
复制代码
  1. --创建LuaClass 对象
  2. local lc1 = LuaClass:New(1, 2);
  3. lc1:test();
  4. local lc2 = LuaClass:New(3, 4);
  5. lc2:test();
复制代码
__newindex元方法:
  1. mymetatable = {}
  2. mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
  3. print(mytable.key1)
  4. mytable.newkey = "新值2"
  5. print(mytable.newkey,mymetatable.newkey)
  6. mytable.key1 = "新值1"
  7. print(mytable.key1,mymetatable.key1)
  8. --以上实例执行输出结果为:
  9. value1
  10. nil    新值2
  11. 新值1    nil
复制代码
5.lua中.:的区别
  1. --冒号:在定义时省略了self
  2. --点号:在定义时不省略self
  3. Class = {}
  4. Class.__index = Class
  5.    
  6. function Class.new(x,y)
  7.     local cls = {}
  8.     setmetatable(cls, Class)
  9.     cls.x = x
  10.     cls.y = y
  11.     return cls
  12. end
  13. -- 实例方法
  14. function Class:test()
  15.     print(self.x,self.y)
  16. end
  17. -- 等价于
  18. function Class.test(self)
  19.     print(self.x,self.y)
  20. end
  21. function Class.testStatic() --类似于静态方法
  22.     print('abc')--(self无法识别:静态方法里不是访问非静态)
  23. end
  24. object = Class.new(10,20)
  25.   
  26. object:test()
  27. -- 等价于
  28. object.test(object)
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 00:58 , Processed in 0.086497 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表