推荐阅读:

  • 我的CSDN
  • 我的博客园
  • QQ群:704621321
  • 我的个人博客

前言

首先,小编在这里给大家道个歉。由于最近被生活折磨得不成人形,在文章输出方面明显能感觉到水的成分,虽然也在持续输出,但是大部分都是转载。
“盼来盼去盼不尽 天涯何处是归鸿”,终于有时间写文章了,来之不易的空闲时间,打算来介绍一下最近做的功能,先来看看成品吧!

功能简介

元朝圣殿,说白了就是一个类爬塔功能。根据星期开启对应类型的爬塔,爬塔按照一层一层的通关要求进行挑战。不可挑战已挑战的,不可跨层挑战。
首先看看主界面:包含帮助按钮,排行榜按钮和中间的5个圣殿。

创建对象,拼接界面如下:

可以发现,main下面的5个对象颜色与其他对象颜色不同,这就是传说中的预制体。

什么是预制体?

简单来说,预制体就是一个模板,你可以使用这个模板来快速生成一个相同的游戏对象,包括游戏对象的所有组件以及其下的所有子游戏对象。像上图中主界面场景那样,
这个预置体包括背景,名字,倒计时。他们长相一样却又有差异,就像双胞胎一样,名字不同,衣服(背景)不同,喜好(倒计时)不同一样。那么,怎么修改他们之间的区别呢?这时候我们
有两种解决办法:
1.直接在功能中替换名字背景
2.代码动态修改
由于策划的需求变幻莫测,推荐大家代码可以控制的表现,都用代码实现,手动在工程中修改真的很辛苦~
那么,接下来介绍一下如何代码动态修改。
首先创建一个table来存储这5个对象的信息:名字,背景,倒计时等

ui.relicsAdven = {}
ui.relicsAdven.Item = {}--RelicsAdvenItem
ui.relicsAdven.ItemTxt = {}--名字
ui.relicsAdven.ItemBg = {}--背景
ui.relicsAdven.openTm = {}--倒计时
ui.isOpen = {}--标识该神殿是否开启
for i = 1 , 6 doui.relicsAdven.Item[i] = base:findobj("Main/RelicsAdvenItem"..i)ui.relicsAdven.ItemTxt[i] = utils.findtext(ui.relicsAdven.Item[i],"relicsName/Text")ui.relicsAdven.ItemBg[i] = utils.findimage(ui.relicsAdven.Item[i],"bg")ui.relicsAdven.openTm[i] = utils.findtext(ui.relicsAdven.Item[i],"openTm")utils.addclickevent(ui.relicsAdven.Item[i],base.ClickPoint,i)ui.isOpen[i] = false
end

接下来便是数据填充阶段了

local testData = {[1] = {name = "光之圣殿",bgImg = "1",openTime = {1,}},[2] = {name = "暗之圣殿",bgImg = "2",openTime = {2,}},[3] = {name = "水之圣殿",bgImg = "3",openTime = {3,}},[4] = {name = "火之圣殿",bgImg = "4",openTime = {4,}},[5] = {name = "风之圣殿",bgImg = "5",openTime = {5,}},
}
local function InitData()local tm = os.time()GetWeek(tm)for i,v in ipairs(testData) doui.relicsAdven.ItemTxt[i].text = v.nameui.relicsAdven.ItemBg[i].sprite = utils.loadsprite("relicsadven","relicsadven_00"..v.icon)local temp = ""for a,b in ipairs(v.openTime) doif wday ~= b then--未开启if temp == "" thentemp = belsetemp = string.format("%s,%s",temp,b)endendendif temp == "" then--已经开启,倒计时isOpen[i] = trueui.relicsAdven.ItemBg[i].material = nillocal tm = GetReaminSecondsTo24()if this.coroutine == nil thensettime(tm,i)endelseisOpen[i] = falseui.endTm[i] = nilui.relicsAdven.ItemBg[i].material = Asset:LoadAsset(asseturi.getshaderpath("UIGray_Material"))ui.relicsAdven.openTm[i].text = string.format("<color=#FF0000>周%s开启</color>",temp)endend
end

上述代码中有些功能,接下来做简单介绍:

获取当前星期几

1.通过时间戳获取当前是星期几的方法:

local function GetWeek(tm)local temp = os.date("*t", tm)local wday = temp.wday - 1
end

该方法返回的数据与星期的对应关系如下,因此需要减一:
1:星期天
2:星期一
3:星期二
4:星期三
5:星期四
6:星期五
7:星期六
接下来就是未开启的显示文本处理:
因为测试数据中openTime字段是一个table表,里面可能配有多个星期,需要处理一下数据:
首先创建一个temp变量,用来存储周几开启,如果temp值变了,代表未开启;没变,代表当前已开启
已开启需要显示关闭倒计时:显示倒计时,需要知道剩余时间,剩余时间=结束时间-当前时间。当前时间使用os.time()获取,结束时间为当天晚上13:59:59,那么如何获取当钱距离当天结束的剩余呢?请看下面代码:

距离当前结束倒计时

--获取到当日凌晨的剩余时间 返回秒数
function GetReaminSecondsTo24()local toYear=os.date("*t").yearlocal toMonth=os.date("*t").monthlocal toDay=os.date("*t").daylocal toTime = os.time({year =toYear, month = toMonth, day =toDay, hour =23, min =59, sec = 59})local time=os.time()return toTime-time
end-- 获取到了剩余时时间戳,接下来就是倒计时计时器了,使用协程等待1秒的方式来实现:
local function settime(tm,index) --设置剩余时间this.coroutine = coroutine.start(function ()while true doif this.gameObject == nil thenreturnendif tm < 1 then--结束ui.openTm[index].text = ui.openTxt[k]coroutine.stop(this.coroutine)this.coroutine = nilelsetm = tm - 1local timedata = FormatTime(tm)ui.openTm[index].text = string.format("<color=#00FF00>%s 后关闭</color>",(timedata))endcoroutine.wait(1)end end)
end

说明:当剩余时间<=0时,结束倒计时,协程停止并刷新界面;否则继续倒计时,显示剩余时间。
FormatTime函数:将时间戳转换为xx填xx小时XX分钟XX秒,具体实现如下:

local function second2DHMS(second)if second <= 0 thenreturn 0,0,0,0endlocal d = math.floor(second / 86400)second = second - d * 86400local h = math.floor(second / 3600)second = second - h * 3600local m = math.floor(second / 60)second = second - m * 60local s = secondreturn d, h, m, s
endlocal function FormatTime(_ls)local _d, _h, _m, _s = second2DHMS(_ls)local timedata = ""if _h < 10 then_h = "0".._hendif _m < 10 then_m = "0".._mendif _s < 10 then_s = "0".._sendif _d > 0 thentimedata = _d.."天".._h..":".._m..":".._selsetimedata = _h..":".._m..":".._sendreturn timedata
end

至此,终于把主界面的显示搞定了,讲得有点详细,具体到了每个小功能的实现。
界面显示完成了,不容易啊。接下来就是界面的点击时间,点击神殿跳转到挑战界面。

选择圣殿

function view.ClickPoint(go,index)if not isOpen[index] then--未开启print(“未开启)returnendlocal data = {}data.type = index--当前已经通过的层数,测试数据local currLayer = 0data.layerNum = currLayer + 1--传数据给挑战界面并打开挑战界面relicschallenge:setdata(data)relicschallenge:open(nil,true)
end

说明:这两行代码是传数据并打开挑战界面。具体实现方法是由项目框架决定了,读者可以根据自己的实际项目调用自己的方法哦~

挑战界面

relicschallenge:setdata(data)
relicschallenge:open(nil,true)
挑战界面示意图如下:

功能第一版:使用循环列表来实现滑动列表,首先拼UI如下:

该界面为一个活动界面,显示每层的奖励信息及对应可操作按钮
(1)使用循环列表,需在content添加循环列表的计算脚本。如下图:如需使用循环列表脚本,可加群下载,csdn积分下载或者联系小编下载。
使用步骤如下:
1.创建Scroll View组件,在content上添加对应脚本。上下滑动:添加UILayoutVertical脚本;左右滑动:添加UILayoutHorizontal脚本

2.代码控制

    ui.list = base:findcom("bot/Viewport/Content", "UILayout")ui.list.onCreate = base.createrenderui.list.onUpdate = base.updaterenderui.list.ItemRenderer = Asset:LoadAsset(asseturi.getassetpath(base.module, "Item"))ui.list.DataCount = #data--item总个数ui.list:InvalidateData()--创建item
local itemRender ={}
function base.createrender(go)local render = {}render.num = utils.findtext(go,"num")--层itemRender[go] = render
end--刷新item
function base.updaterender(go, index)local config = data[index] --data中放着每个item的数据local render = itemRender[go]render.num.text = index
end

功能第二版:使用滑动列表
1、创建Scroll View组件,在content上添加对应脚本组件。上下滑动:添加VerticalLayoutGroup脚本;左右滑动:添加HorizontalLayoutGroup脚本
2.代码控制:

ui.content = base:findobj("list/Viewport/Content")
ui.ItemRenderer = Asset:LoadAsset(asseturi.getassetpath(base.module, "Item"))--生成之前先全部清空再生成
Util.DestroyAllChild(ui.content)
for i=1,#data dolocal go = utils.addchild(ui.content, ui.ItemRenderer)local dataInfo = data[i] utils.findtext(go,"num").text = i
end


到此为止,列表滑动已经实现,接下来就是事件的点击了

local function ClickChalleng()-- TODO--打开布阵界面
end
utils.addclickevent(go,ClickChalleng,i)

后面的功能流程就是:点击挑战,打开布阵界面,布阵完毕,挑战结算等。

排行榜

最后来介绍一下主界面的排行榜功能:
首先拼接ui层级如下:两个按钮对应两个界面。第一个界面为排行榜,第二个界面是对应排名的奖励预览。

最终呈现给用户的效果如下:


界面搭建完了,就开始我们的功能开发吧。
由于排行榜数据瞬息万变,我们不能一上游戏或者是进入该系统时获取排行榜数据,而是在需要显示的时候拿去,这样才能保证以最少的获取次数取到最新的数据。
因此,我们在该系统主界面点击排行榜时,向服务器请求数据,拿到数据我们再显示排行榜界面。

network.request("rankData")if 返回成功 then打开排行榜界面
end

打开排行榜时,除了需要传入排行榜数据,还需要传入一个下标index,标志着打开哪一个标签,传1则代表打开排行榜界面,传2代表打开奖励预览界面。

for k,v in ipairs(ui.tabs)doSetActive(ui.pages[k],index == k)SetActive(ui.pages[k],index == k)
end

接下来便是显示对应打开页签的数据了。注意,这里的列表,我是用的是前面介绍的循环列表,用法不再累叙

if index == 1 thenui.rankRoot.DataCount = #base.data.rankListui.rankRoot:InvalidateData()
elseif index == 2 thenui.rewardRoot.DataCount = utils.tablelen(base.data.rewardList)ui.rewardRoot:InvalidateData()
end

Unity实战之类爬塔功能相关推荐

  1. Unity实战之牧师与魔鬼(动作分离版)

    Unity实战之牧师与魔鬼(动作分离版) 项目链接 整体描述 本次项目在第一版牧师与魔鬼的基础上,将动作从场记中分离出来,并设计一个裁判类实时监测游戏进行的情况.这样改进的优点有很多: 降低了不同功能 ...

  2. [Unity实战]一个好用的lua/xlua/tolua/slua调试工具 LuaPerfect 好用到飞起..[Debug][开箱可用]

    [Unity实战]一个好用的lua/xlua/tolua/slua调试工具 LuaPerfect 好用到飞起..[Debug][开箱可用] 什么是LuaPerfect 1.官网地址: 2.如何使用 3 ...

  3. Unity网络多玩家游戏开发教程第1章Unity自带网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说 ...

  4. jQuery框架学习第十天:实战jQueryUI常用功能

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集  jQuery框架学习第四天:使用jQ ...

  5. Unity实战之打靶游戏

    Unity实战之打飞碟游戏 项目源码 整体描述 利用unity实现简单的打飞碟游戏,射中相应的靶即得分.一轮游戏共五发箭. 设计思路 UML图如下 定义组件 弓箭 由两部分组成:箭头和箭身. 箭头是一 ...

  6. ❤️UNITY实战进阶-OBB包围盒详解-6

    ❤️UNITY实战进阶-三维AABB包围盒详解-6_欲望如海水,越喝越渴.-CSDN博客前言 碰撞检测问题在虚拟现实.计算机辅助设计与制造.游戏.机器人等方面都有着广泛的应用,而包围盒算法是进行碰撞检 ...

  7. Tiled结合Unity实现瓦片地图——Unity实战篇

    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75425915 上文说道,Ti ...

  8. Unity实战——模拟太阳系

    unity实战--模拟太阳系 项目源码 最终效果 Unity模拟太阳系效果 搭建简易太阳系 定义九个球体,命名如下: 加上贴图,调整大小: 各种参数设置如下: Object Position Scal ...

  9. icordova拍照_ionic2/3实战-添加拍照功能cordova-plugin-camera

    效果演示 源代码已上传到github 由于ionic版本更新较快,有些写法可能改变来不及更新简书,请以github代码为准 ionic2.0插件的使用方式和ionic3.0已不一样 ionic2实战- ...

最新文章

  1. Golang之var、new与make、简短声明
  2. 请求微信接口,判断用户是否关注公众号
  3. linux 安装 python3
  4. nSamplesPerSec和nAvgBytesPerSec
  5. Mac连接远程Linux管理文件(samba)
  6. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
  7. vue2使用axios post跳坑,封装成模块
  8. select样式的重写
  9. endnote x9使用方法_一文掌握 Endnote 核心功能使用方法
  10. Spring MVC 接收json自动转换JSONObject
  11. Atitit 开发效率补充哦哦那个、、 目录 1. 架构方法上选择快速开发的架构 1 2. 编程方法上选择快速的编程范式和编程方法 1 3. 开发方法论上需要快速的方法 2 1.架构方法上选择快速
  12. 一个模拟抛硬币的游戏
  13. 妙!云服务器远程登录,本地听声音
  14. 墨者学院01 SQL手工注入漏洞测试(MySQL数据库)
  15. K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路
  16. 【模糊综合评价的运用】——《电子舌技术在食用盐模糊感官评价中的应用》论文笔记(内附MATLAB程序)
  17. Java实现指定目录下的文件查找
  18. 西北大学844计算机考研真题,2018年西北大学信息科学与技术学院844软件工程学科专业基础综合之计算机操作系统考研基础五套测试题...
  19. JavaSE中的方法
  20. 微信分享功能填坑过程

热门文章

  1. Python 面试问题总结
  2. Web 3D渲染引擎HOOPS Communicator动画编辑器的使用 | HOOPS教程
  3. Dynamic GCN:Dynamic GCN: Context-enriched Topology Learning for Skeleton-based Action Recognition
  4. 超级电脑可下载人类思想 究竟是福是祸?(
  5. excel文件无法打印提示内存不足_Mac应用程序无法打开提示不明开发者或文件损坏的处理方法
  6. 2021-01-22学习记录 || 通过二维数组初始化窗体并进行代码重构
  7. 鸿蒙基于linux系统,鸿蒙操作系统(HarmonyOS)是基于Linux的吗?尽管已知道它是基于微内核的...
  8. 2022年二级建造师建设工程法规及相关知识精选试题及答案
  9. OSChina 周四乱弹 ——潘金莲告西门庆
  10. 前端开发之字体大小px,em,rem,pt