unity和lua开发游戏常备技能

举报
爱上游戏开发 发表于 2022/07/02 00:07:06 2022/07/02
【摘要】 推荐阅读:  我的CSDN 我的博客园 QQ群:704621321 我的个人博客 一。使用制作滑动列表:使用UILayout做虚拟列表...

推荐阅读:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

需要注意的是:如果滑动过程中,列表中数据出现混乱,可以考虑是列表的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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四。使用使用DOTween制作动画

(1)InsertCallback在给定的时间位置上放置一个回调函数。

local seq = DOTween.Sequence()
seq:InsertCallback(1, function()
    labelpopup.show("提示")
end)

  
 
  • 1
  • 2
  • 3
  • 4

代码功能:延迟一秒显示一个文本提示
(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)

  
 
  • 1
  • 2
  • 3

(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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

五。判断Table表是否为空

确定表是否为空的最有效方式(即,当前不包含数组样式值或字典样式值)
方法一:

if not next(myTable) then
    -- Table is empty
end

  
 
  • 1
  • 2
  • 3

注意:这里的#操作符不够用,因为它只对表中的数组样式值进行操作 - 因此#{test=2}无法区分,#{}因为两者都返回0.还要注意检查表变量是否nil不够,因为我不寻找零值,而是具有0个条目(即{})的表格。
方法二:

if next(myTable) == nil then
    -- myTable is empty
 end

  
 
  • 1
  • 2
  • 3

测试:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出:

printlog("空表","shirln**********")
printlog("非空","shirln@@@@@@@@@@@")

  
 
  • 1
  • 2

可见,方法二比方法一更有效一些

六。赋值与复制

赋值:引用变量的地址
复制:复制变量的值
在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")

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

(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")

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

七。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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

九。滑动列表顶部底部判断

判断滑动列表是否滑倒底部或顶部

this.gameObject:GetComponent("ScrollRect").verticalNormalizedPosition=1顶部

  
 
  • 1
this.gameObject:GetComponent("ScrollRect").verticalNormalizedPosition=0底部

  
 
  • 1

文章来源: unity3d.blog.csdn.net,作者:爱上游戏开发,版权归原作者所有,如需转载,请联系作者。

原文链接:unity3d.blog.csdn.net/article/details/103281915

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。