推荐阅读:

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

unity和lua开发游戏常备技能的更多相关文章

  1. 使用 Unity 3D 开发游戏的架构设计难点

    Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛.但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D ...

  2. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    ---------------------------------------------------------------------------------------------------- ...

  3. Hands-On Unity 2018 x 移动游戏开发教程

    Hands-On Unity 2018 x Game Development for Mobile 使用Unity 2018.2创建具有出色游戏功能的精彩游戏   想学习在Unity制作游戏,但不知道 ...

  4. 【远程文件浏览器】Unity+Lua开发调试利器

    Remote File Explorer是一个跨平台的远程文件浏览器,用户通过Unity Editor就能操作运行在手机上的游戏或是应用的的目录文件.比如当项目打包运行到设备上时,可通过Remote ...

  5. 独立开发游戏越来越容易:Unity 发布旗下的最新游戏引擎 Unity 5,依然有免费版(转)

    独立开发者开发游戏正变得越来越容易,因为在游戏设计中很多吃力不讨好的工作可以直接采用像 Epic Games 或 Unity Technologies 这样的游戏引擎来解决.而这几天,游戏引擎商们先后 ...

  6. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)

    ---------------------------------------------------------------------------------------------------- ...

  7. Unity 开发游戏编写代码的技巧

    在平时开发游戏过程中,遇到一些编写代码很繁琐的问题. 我发现我团队中每个人都会遇到,就算打写出来分享下经验. 条件断点 利用IDE提供的工具, 右键断点的时候 输入条件, 当条件达成的时候,断点才能命 ...

  8. GJM : 各大开发游戏引擎

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL

    内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...

随机推荐

  1. UML学习笔记:类图

    UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...

  2. nodejs中利用expresss脚手架和bootstrap,数据库mongodb搭建的留言板案例

    ## 1. 先打开编辑器,创建一个项目 ## 2. 再打开cmd命令提示符下载express脚手架 express   项目名   --view=ejs 或express   -e    项目名 ## ...

  3. 【GStreamer开发】GStreamer基础教程01——Hello World

    目标 对于一个软件库来说,没有比在屏幕上打印出Hello World更近直观的第一印象了.因为我们是在和一个多媒体的framework打交道,所以我们准备播放一段视频来代替Hello World.不要 ...

  4. 【转帖】【PCI-E通道是个什么东西?他是干啥的?】

    [PCI-E通道是个什么东西?他是干啥的?] https://zhuanlan.zhihu.com/p/62426408 前言: 经常接触台式机的同学肯定绕不开PCI-E这个名词,因为这是台式机里最重 ...

  5. css特效实现透明渐变

    知乎发现栏目上的标题图一般都是以下图方式展现的,很显然它是利用渐变去实现的.思路很有意思,主要是要有两方面的认知: 这张图其实可以分成两部分,右边控制图形和渐变,左边就是一张纯色背景,和渐变无关 透明 ...

  6. ~postman使用Runner

    1.准备参数的.text文件. postman支持三种参数的方式,分别为.text文件,.csv文件,json文件.此处使用.text文件.编码格式使用utf-8 2.替换请求参数 3.设置Runne ...

  7. Ubuntu 利用 mtd-utils 制作ubifs.img

    确保已经安装了有关的工具 sudo apt-get install mtd-utils mkfs.ubifs -d fs -m -o rootfslink.ubiimg -e -c -F -v syn ...

  8. 整合MyBatis

    配置数据源相关属性(见前一章节 DataSource配置) 引入依赖 <dependency> <groupId>org.mybatis.spring.boot</gro ...

  9. django类视图as_view()方法解析

    使用视图函数时,django完成URL解析之后,会直接把request对象以及URL解析器捕获的参数(比如re_path中正则表达捕获的位置参数或关键字参数)丢给视图函数,但是在类视图中,这些参数不能 ...

  10. 用ASP.NET Web API技术开发HTTP接口(二)

    在第一部分,我们创建了一个基本的ASP.NET Web API项目,新建成功了数据表,然后添加了一些测试数据,最后创建了API控制器,用json格式把数据表里面的内容成功输出到浏览器上.接下来我们将继 ...