推薦閱讀:
一。使用制作滑動列表:使用UILayout做虛擬列表
ui.list = base:findcom("center/ScrollView/Viewport/Content", "UILayout")
ui.list.onCreate = base.createrender
ui.list.onUpdate = base.updaterender
ui.list.ItemRenderer = Asset:LoadAsset(asseturi.getassetpath(base.module, "manualItem"))
--創建item
function base.createrender(go)
local render = {}
render.lv = utils.findtext(go, "lv")--等級名字
taskitems[go] = render
end
刷新item
function base.updaterender(go, index)
local render = taskitems[go]
local currLv=lv
if lv>index then
--已達到等級
render.lv="已達成"
else
render.lv="未達成"
end
end
需要注意的是:如果滑動過程中,列表中數據出現混亂,可以考慮是列表的item大小的問題。由於大小item差異,導致UILayout腳本里計算出現問題。
二。使用Slider制作進度條
使用Slider做進度條時,如果不想支持觸摸滑動,應將Slider組建下的Interactable取消勾選
三。使用InputField制作輸入框
如果只希望輸入整數,則修改InputField的ContentType為IntergetNumber
ui.manualLv = utils.findinput(go, "InputField")
--實時監聽文本框輸入內容,控制其范圍
utils.addchangeevent(ui.manualLv, base.inputlimit)
function base.inputlimit(_input, _id, _str)
local maxnumber = #ui.proto - commonmodel.activeDatas.manual_syn.level
local temp = tonumber(_str)
if temp then
if temp >= maxnumber then
ui.manualLv = maxnumber
elseif temp <= 0 then
ui.manualLv = 1
else
ui.manualLv = temp
end
end
end
四。使用使用DOTween制作動畫
(1)InsertCallback在給定的時間位置上放置一個回調函數。
local seq = DOTween.Sequence()
seq:InsertCallback(1, function()
labelpopup.show("提示")
end)
代碼功能:延遲一秒顯示一個文本提示
(2)DOScale放大縮小效果
obj.transform.localScale = Vector3.New(0.2,0.2,0.2)
--SetEase()設置動畫曲線
obj.transform:DOScale(Vector3.New(1,1,1), 0.18):SetEase(Ease.OutBack)
(3)Sequence:相當於一個Tweener的鏈表,可以通過執行一個Sequence來執行一串Tweener,使用Sequence類可以方便的組織
local seq = DOTween.Sequence()
--Append:在Sequence的最后添加一個tween。
seq:Append(strans:DOLocalMove(pos, 0.3, false):SetEase(Ease.OutExpo))
seq:Append(strans:DOLocalMove(target1, 0.3, false):SetEase(Ease.InBack))
seq:Append(strans:DOLocalMove(pos, 0.2, false))
--AppendInterval:在Sequence的最后添加一段時間間隔。
seq:AppendInterval(0.05)
seq:Append(mtrans:DOLocalMove(target2, 0.3, false):SetEase(Ease.InBack))
seq:Append(mtrans:DOLocalMove(mpos, 0.2, false))
seq:AppendInterval(0.05)
seq:Append(strans:DOLocalMove(target1, 0.3, false):SetEase(Ease.InBack))
seq:Append(strans:DOLocalMove(pos, 0.2, false))
seq:AppendInterval(0.1)
seq:Append(strans:DOLocalMove(spos, 0.3, false):SetEase(Ease.OutExpo))
seq:Play()
seq:InsertCallback(0.3, function()
end)
seq:InsertCallback(0.6, function()
end)
seq:OnComplete(function()
end)
五。判斷Table表是否為空
確定表是否為空的最有效方式(即,當前不包含數組樣式值或字典樣式值)
方法一:
if not next(myTable) then
-- Table is empty
end
注意:這里的#操作符不夠用,因為它只對表中的數組樣式值進行操作 - 因此#{test=2}無法區分,#{}因為兩者都返回0.還要注意檢查表變量是否nil不夠,因為我不尋找零值,而是具有0個條目(即{})的表格。
方法二:
if next(myTable) == nil then
-- myTable is empty
end
測試:
local myTable={[false]=0}
if not next(myTable) then
printlog("空表","shirln**********")
else
printlog("非空","shirln&&&&&&&&&&&")
end
if next(myTable) == nil then
printlog("空表","shirln!!!!!!!!")
else
printlog("非空","shirln@@@@@@@@@@@")
end
輸出:
printlog("空表","shirln**********")
printlog("非空","shirln@@@@@@@@@@@")
可見,方法二比方法一更有效一些
六。賦值與復制
賦值:引用變量的地址
復制:復制變量的值
在Lua中,使用賦值運算符"="進行淺拷貝的時候,分兩種情況:
(1)拷貝對象的類型是string、number、boolean這些基本類型的時候,會進行復制,創建一個新的對象,拷貝出來的對象和原來的對象互不影響,所以修改拷貝出來的對象的值不會影響到原來的對象的值!
(2)拷貝對象的類型是table的時候,則是直接進行引用,拷貝出來的對象和原來的對象實際上是同一個對象,所以修改拷貝出來的對象中的元素的值也會使原來的對象中元素的值發生改變!
測試:
(1)number
local test=10
local test1=test
test1=5
printlog(test,"shirln^^^^^^^^^^^^^1")
printlog(test1,"shirln^^^^^^^^^^^^^1")
(2)表
local data={}
data.sid=101
data.quality=4
data.pos=1
local copyData=data
copyData.pos=5
printlog(data,"shirln*********1")
printlog(copyData,"shirln*********2")
七。Time.timeScale
Time.timeScale = 0 可以暫停游戲,Time.timeScale = 1 恢復正常,但這是作用於整個游戲的設置,不單單是當前場景,記得在需要的時候重置回Time.timeScale = 1。當然也可以使用Time.timeScale來做游戲的1倍、2倍整體加速。
八。lua I/O從本地存取信息
-- 序列化數據
local function encodechatdata(data)
local result = {}
result[1] = data.tm
result[2] = data.info
return table.concat(result, "|")
end
--存信息
local data = encodechatdata(v)
-- local data = table.concat(data, "\n")
local path=""--存儲的文件位置
local path = getlocalfilepath(path)
local file = io.open(path, "w")
if file then
file:write(data)
file:flush()
file:close()
end
-- 反序列化數據
local function decodechatdata(data)
local args = utils.split(data, "|")
local result = {}
result.tm = args[1]
result.info = args[2]
return result
end
--獲取本地信息
local path = getlocalfilepath(uid)
local file = io.open(path, "r")
if not file then
return {}
end
local data = {}
pcall(function() --pcall防止讀取錯誤數據
for line in file:lines() do
local data = decodechatdata(line)
table.insert(data, data)
end
end)
file:close()
return data
end
九。滑動列表頂部底部判斷
判斷滑動列表是否滑倒底部或頂部
this.gameObject:GetComponent("ScrollRect").verticalNormalizedPosition=1頂部
this.gameObject:GetComponent("ScrollRect").verticalNormalizedPosition=0底部