unity和lua開發游戲常備技能


推薦閱讀:

一。使用制作滑動列表:使用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底部


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM