----------------------------------------------
------------------简单模型-----------------
--读
local file1=io.input("1.txt") --当前目录"1.txt"要存在,不然出错
local str=io.read("*a")
print(str)
--写
local file2=io.output("2.txt") --当前目录"2.txt"不需要存在
io.write(str)
io.flush()
io.close()
------------------完整模型-----------------
local f=io.open("3.txt","a+")
f:write("Happy New Year!")
f:flush()
f:seek("end",-1) --定位到文件末尾前一个字节
local str=f:read(1) --读取一个字符
print(str) --输出"!"
f:close()
-----------------------------------------------
lua 中 . 和 : 的区别
首先在lua中使用“:”定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而“.”定义的函数中没有self。
function class:func2( ) end
function class.func1(self) end
--这时候这两个函数等价
function MainScene:ctor()
self:ceshi(1,2,3)
end
function MainScene:ceshi(a,b,c)
print(a,b,c)
end
--输出:1 2 3
分析:默认传self,默认接受self。
function MainScene:ctor()
self:ceshi(1,2,3)
end
function MainScene.ceshi(a,b,c) --注意是.
print(a,b,c)
end
--输出:userdata 1 2
分析:调用ceshi函数用的:默认传递self为第一个参数,但函数声明时候用的 . 所以不会有默认隐藏的self去接收,此时传递参数为 self 1 2 3 但是ceshi函数只接收3个参数所以3被抛弃。
function MainScene:ctor()
self.ceshi(1,2,3) --注意是.
end
function MainScene.ceshi(a,b,c) --注意是.
print(a,b,c)
end
--输出:1 2 3
分析:默认不传递self,默认不接受self
function MainScene:ctor()
self.ceshi(1,2,3) --注意是.
end
function MainScene:ceshi(a,b,c)
print(self)
print(a,b,c)
end
--输出:1
-- 2 3 nil
分析:函数调用时用的 . 不会传递self 只传递1 2 3,而ceshi函数声明时用的 : 默认有一个self在第一位去接收,ceshi函数能接收4个参数,即 self a b c ,所以c没有接收参数为nil。
-------------------------------------------------
如果需要存储同一个键的多个值,可以采用以下方式:
1. 使用嵌套的 table
存储多个值
通过将键对应的值设置为一个嵌套的 table
,可以存储多个值。
示例代码:
local t = {} -- 为同一个键 "key1" 添加多个值 t["key1"] = { "value1", "value2", "value3" } -- 遍历并打印该键的所有值 for _, v in ipairs(t["key1"]) do print(v) end
输出:
value1 value2 value3
说明:
t["key1"]
是一个嵌套table
,用来存储多个值。- 遍历时使用
ipairs
获取每个值。
2. 使用数字索引存储多个值
可以用 table
的数字索引来存储多个相同键的值。
示例代码:
local t = {}
-- 为键 "key1" 添加多个值
t["key1"] = {}
table.insert(t["key1"], "value1")
table.insert(t["key1"], "value2")
table.insert(t["key1"], "value3")
-- 遍历并打印该键的所有值
for _, v in ipairs(t["key1"]) do
print(v)
end
输出:
value1
value2
value3
说明:
table.insert
是 Lua 的内置函数,用于向表中插入值。t["key1"]
是一个列表(数组形式),用来存储多个值。
3. 使用多层次键结构
如果需要针对同一个键存储与不同条件相关的多个值,可以使用多层次键(例如子键)。
示例代码:
local t = {}
-- 为键 "key1" 添加多个条件对应的值
t["key1"] = {}
t["key1"]["condition1"] = "value1"
t["key1"]["condition2"] = "value2"
t["key1"]["condition3"] = "value3"
-- 打印不同条件下的值
print(t["key1"]["condition1"]) -- 输出 value1
print(t["key1"]["condition2"]) -- 输出 value2
print(t["key1"]["condition3"]) -- 输出 value3
输出:
value1
value2
value3
说明:
- 在
t["key1"]
的基础上,再嵌套一层子键condition1
、condition2
等,用于区分不同的值。
4. 使用 table
序号区分
可以通过设置键的值为多个表项(包含键和对应的值),实现存储同一个键的多个值。
示例代码:
local t = {}
-- 使用多个表项存储键值对
t[1] = { key = "key1", value = "value1" }
t[2] = { key = "key1", value = "value2" }
t[3] = { key = "key1", value = "value3" }
-- 遍历并打印所有值
for _, pair in ipairs(t) do
if pair.key == "key1" then
print(pair.value)
end
end
输出:
value1
value2
value3
说明:
- 每个表项都是一个
table
,包含key
和value
字段。 - 可以使用循环遍历表并按键名查找值。
5. 自定义存储方式
如果需要对键值的存储有特殊需求,例如多种关联结构,可以设计自定义的存储逻辑。例如:
示例代码:
local t = {}
-- 自定义插入函数
function addValue(table, key, value)
if not table[key] then
table[key] = {}
end
table.insert(table[key], value)
end
-- 自定义获取函数
function getValues(table, key)
return table[key] or {}
end
-- 添加多个值
addValue(t, "key1", "value1")
addValue(t, "key1", "value2")
addValue(t, "key1", "value3")
-- 获取并打印
local values = getValues(t, "key1")
for _, v in ipairs(values) do
print(v)
end
输出:
value1
value2
value3
总结
在 Lua 中实现存储同一个键的多个值时,可以选择以下方式:
- 嵌套表存储: 使用嵌套的
table
存储多个值(推荐)。 - 数字索引存储: 为键关联一个数组,用数字索引存储多个值。
- 多层次键结构: 将值与特定条件关联,通过多层次键存储。
- 序号区分: 将键值对存储为一个列表的多个表项。
- 自定义逻辑: 使用函数封装插入和读取操作,适合复杂需求。
local t = {}
-- 自定义插入函数
function addValue(table, key, value)
if not table[key] then
table[key] = {}
end
table.insert(table[key], value)
end
-- 自定义获取函数
function getValues(table, key)
return table[key] or {}
end
-- 添加多个值
addValue(t, "key1", "value1")
addValue(t, "key1", "value2")
addValue(t, "key1", "value3")
addValue(t, "key2", "valueA")
addValue(t, "key2", "valueB")
-- 获取并打印所有键值对
for key, values in pairs(t) do
for _, v in ipairs(values) do
print("Key: " .. key .. ", Value: " .. v)
end
end
-------------------------------------------------
支持动态颜色和复杂消息格式
-- 引入Unity的Debug模块
local Debug = CS.UnityEngine.Debug
-- 定义一个函数,支持预设颜色名和自定义RGB颜色值的日志输出
function logColorMessage(colorInput, customMessage)
-- 如果没有提供日志内容,设置默认值
customMessage = customMessage or "Default Log Message"
-- 定义预设颜色名的映射表
local colorMap = {
red = "#FF0000",
green = "#00FF00",
blue = "#0000FF",
white = "#FFFFFF" -- 默认颜色
}
-- 判断输入的颜色是预设颜色名还是自定义RGB值
local customColor = colorMap[colorInput] or colorInput -- 如果是预设颜色名,则使用映射值;否则直接使用自定义值
-- 如果没有颜色输入或输入无效,使用白色
if not customColor or customColor == "" then
customColor = "#FFFFFF"
end
-- 输出日志,支持动态颜色
Debug.Log("<color=" .. customColor .. ">" .. customMessage .. "</color>")
end
-- 示例调用
logColorMessage("red", "This is a predefined red log!") -- 输出预设红色日志
logColorMessage("green", "This is a predefined green log!") -- 输出预设绿色日志
logColorMessage("blue", "This is a predefined blue log!") -- 输出预设蓝色日志
logColorMessage("#FFA500", "This is a custom orange log!") -- 输出自定义橙色日志
logColorMessage("#0000FF", "This is a custom blue log!") -- 输出自定义蓝色日志
logColorMessage(nil, "This is a default log!") -- 输出默认白色日志
logColorMessage("yellow", "This is an unknown color log!") -- 输出白色日志(默认颜色)
-- 定义预设颜色名的映射表
local colorMap = {
red = "#FF0000", -- 红色
green = "#00FF00", -- 绿色
blue = "#0000FF", -- 蓝色
yellow = "#FFFF00", -- 黄色
purple = "#800080", -- 紫色
orange = "#FFA500", -- 橙色
pink = "#FFC0CB", -- 粉红色
brown = "#A52A2A", -- 棕色
cyan = "#00FFFF", -- 青色
gray = "#808080", -- 灰色
white = "#FFFFFF" -- 默认颜色
}
-------------------------------------------------
-------------------------------------------------
-------------------------------------------------
-------------------------------------------------