Dictionary<string, string> dic = env.Global.Get<Dictionary<string, string>>("g_dic"); foreach (var child in dic) { print(string.Format("Key is {0}, Value is {1}", child.Key, child.Value)); }
List<int> list = env.Global.Get<List<int>>("g_list"); foreach (var v in list) { print(v); }
映射到LuaTable
这种方法比较慢,而且没有类型检查,不推荐使用。
1 2 3 4 5 6 7 8
LuaTable tab = env.Global.Get<LuaTable>("g_tbl"); string name = tab.Get<string>("name"); int age = tab.Get<int>("age"); print(string.Format("Name is {0}, age is {1}", name, age)); foreach (string key in tab.GetKeys()) { print(tab.Get<object>(key)); }
a = true b = (a and {false} or {true})[1] if b then print("true") else print("false") end
自定义迭代器
自定义迭代器的格式:
1 2 3
for 变量列表 in 迭代函数, 状态变量, 控制变量 do -- 循环体 end
自定义无状态迭代器
1 2 3 4 5 6 7 8 9 10 11
functionsquare(iteratorMaxCount, currentNumber) if currentNumber < iteratorMaxCount then currentNumber = currentNumber + 1 return currentNumber, currentNumber * currentNumber end end
for i, n in square, 3, 0 do print(i, n) end
多状态迭代器: 多个状态可以存放在table,因此只需要一个参数即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
array = {"Google", "Runoob"}
functionelementIterator(collection) local index = 0 local count = #collection -- 闭包函数 returnfunction() index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end
for element in elementIterator(array) do print(element) end
循环时的goto语句
可以使用goto语句来实现continue:
1 2 3 4 5 6 7 8 9
for i=1, 3do if i <= 2then print(i, "yes continue") goto continue end print(i, " no continue") ::continue:: print([[i'm end]]) end
t_table = setmetatable({1, 2, 3}, {__add = function(t_table, data) t_table[#t_table + 1] = data return t_table end, __tostring = function(t_table) local res = "" for _, v inpairs(t_table) do res = res .. v end return res end }) print(t_table) print(t_table + 4) --[[ 输出: 123 1234 --]]
a_metatable = { __unm = function(a_table) local _temp_table = {} for i = #a_table, 1, -1do _temp_table[#a_table + 1 - i] = a_table[i] end return _temp_table end } p_metatable = { __tostring = function(a_table) local res = "" for _, v inpairs(a_table) do res = res .. v end return res end } a_table = setmetatable({1, 2, 3}, a_metatable) b_table = setmetatable(-a_table, p_metatable) print(b_table)
作用就是Alpha混合。公式:最终颜色 = 源颜色 x 源透明值 + 目标颜色 x(1 - 源透明值)
alpha test在何时使用?能达到什么效果
Alpha Test ,中文就是透明度测试。简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。AlphaTest语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
碰撞器是触发器的载体,触发器是碰撞器的属性 Is Trigger=false,碰撞器根据物理引擎引发碰撞,产生碰撞的效果 此时调用OnCollisionEnter/Stay/Exit函数 Is Trigger=true,碰撞器被物理引擎所忽略,没有碰撞效果 此时调用OnTriggerEnter/Stay/Exit函数