当前位置:网站首页>Unity修仙手游 | lua动态滑动功能(3种源码具体实现)
Unity修仙手游 | lua动态滑动功能(3种源码具体实现)
2022-07-04 22:17:00 【米莱虾】
在 Unity 中,有很多的 UI 参考,具体可以参照下方的官方手册
https://docs.unity3d.com/cn/current/Manual/script-ScrollRect.html
此次了解的是滑动列表的制作,我们在 UI-Window 下新建一个 sv 挂上 滚动矩形 (Scroll Rect),再挂上我们的 content 即可,蓝色框表示滚动方式,按照一般标准的手机分辨率,我们只勾选垂直(Vertical)方式。
在 sv 下的 Viewport上,挂载上我们的 mask,确保我们鼠标点击/移动的区域
最后在我们的 content 上挂载自动布局方式:垂直布局组 (Vertical Layout Group)
test_item的inspector面板(Unity3D属性监视面板 (Inspector) Unity3D属性监视面板中的属性允许用户在代码外部改变脚本及组件的初始值。)
为了加快熟悉业务程序 UI 的设计,简单实现了一下 lua 滑动列表的实现。实现的效果如下:
点击我们的 btn_add 按钮可以生成可供滑动的列表元素,这些元素的属性和数据可以通过 local datas = { } 来获取,我们可以在里面给每个小的横向列表附值,并且通过 function( ) .. end, 反馈 btn_add 按钮的点击事件。这是比较好的一种方法,就是将我们的 local datas = { } 写进我们的 on_clicked_btn_add(btn) 来一键生成多个列表元素。Lua 代码示例如下:
-- 这里面的功能主要是实现点击btn_add按钮一键生成items,其余稍后改动
--(3)在datas中一键生成滑动列表元素
function TestWindow1:on_clicked_btn_add(btn)
local datas = {
{
text = "number:1",
function()
print("生成的第1个列表元素")
end,
},
{
text = "number:2",
function()
print("生成的第2个列表元素")
end,
},
{
text = "number:3",
function()
print("生成的第3个列表元素")
end,
},
{
text = "number:4",
function()
print("生成的第4个列表元素")
end,
},
}
item.text_name.text = TT("test!!!!!")
item.go:SetActive(true)
for idx, data in ipairs(datas) do
local item = self:get_or_init_test_item(idx)
item.text_name.text = data.name
item.text_name.text = TT(data.text)
item.go:SetActive(true)
end
end
function TestWindow1:on_clicked_btn_minus(btn)
local item = self.test_items[1]
if item then
table.remove(self.test_items, 1)
GameObject.Destroy(item.gameObject) --一定要用item.gameObject,保证unity对应unity
end
end
其他两种方法分别如下:
-- TestWindow1.lua
--Lua 中的变量全是全局变量,无论语句块或是函数里,除非用 local 显式声明为局部变量,变量默认值均为nil
local TestWindow1 = class('TestWindow1', 'UIWindow') --定义一个函数内的局部变量
--Inspector下TestWindow1下点击生成lua自动生成
function TestWindow1:__awake(name)
self:load('TestWindow1')
self.btn_add = self:fcc('btn_add', UT_BTN)
self:listen_button_clicked(self.btn_add, function(btn) self:on_clicked_btn_add(btn) end)
self.btn_minus = self:fcc('btn_minus', UT_BTN)
self:listen_button_clicked(self.btn_minus, function(btn) self:on_clicked_btn_minus(btn) end)
self.test_item = self:fco('test_item')
self.content = self:fcc('sv/Viewport/content', UT_Rect)
self.btn_bcak = self:fcc('btn_bcak', UT_BTN)
self:listen_button_clicked(self.btn_bcak, function(btn) self:on_clicked_btn_bcak(btn) end)
if self.awake then self:awake() end
end
function TestWindow1:on_clicked_btn_bcak(btn)
self:hide()
end
-------------------------------------------------------------------------------------------------------------------------
--(1)最简单的方法添加items--一个个加
function TestWindow1:on_clicked_btn_add(btn)
local item = GameObject.Instantiate(self.test_item, self.content)
item:SetActive(true)
table.insert(self.test_items, item)
end
-------------------------------------------------------------------------------------------------------------------------
--(2)for循环生成滑动列表元素
--[[
function TestWindow1:on_clicked_btn_add(btn)
item.text_name.text = TT("test!!!!!")
item.go:SetActive(true)
for i=1 , 5 do
local item = self:get_or_init_test_item(i)
item.text_name.text = TT(i)
item.go:SetActive(true)
end
end
]]--
-------------------------------------------------------------------------------------------------------------------------
function TestWindow1:on_clicked_btn_minus(btn)
local item = self.test_items[1]
if item then
table.remove(self.test_items, 1)
GameObject.Destroy(item.gameObject)
end
end
local test_icon_path = "UI/SkillIcon/5123.png"
function TestWindow1:build_test_data() --构建显示数据
local datas = {
{
text = "number:1",
function()
print("生成的第1个列表元素")
end,
},
{
text = "number:2",
function()
print("生成的第2个列表元素")
end,
},
{
text = "number:3",
function()
print("生成的第3个列表元素")
end,
},
{
text = "number:4",
function()
print("生成的第4个列表元素")
end,
},
}
return datas
end
function TestWindow1:get_or_init_test_item(idx) --获取和初始化item元素
local item = self.test_items[idx]
if not item then
local go = GameObject.Instantiate(self.test_item, self.content)
item = {
go = go,
text_name = fcc(go, "text_name", UT_TMP),
img_icon = fcc(go, "img_icon", UT_IMAGE),
btn_go = fco(go, "btn_go"),
text_btn = fco(go, "btn_go/text_btn"),
}
self.test_items[idx] = item
end
return item
end
function TestWindow1:awake()
self.test_items = {}
end
function TestWindow1:refresh()
self.datas = self:build_test_data()
log_warn("test window refresh datas: %s", pts(self.datas))
for idx, data in ipairs(self.datas or {}) do
log_warn(" refresh item: %s", pts(data))
local item = self:get_or_init_test_item(idx) --初始化item
--赋值item
item.text_name.text = data.text
item.img_icon.sprite = self:load_sprite(string.format(test_icon_path, data.icon))
local show_btn = data.btn_text ~= nil or data.btn_text ~= ""
item.btn_go.gameObject:SetActive(show_btn)
if show_btn then
self:listen_button_clicked(
item.btn_go,
function(btn)
data[1]()
end
)
end
item.go:SetActive(true)
end
end
function TestWindow1:on_show()
log_warn("test window on show")
self:refresh()
end
function TestWindow1:on_hide()
USER:unlisten_field_changed(self)
end
function TestWindow1:dispose()
end
边栏推荐
- LOGO特訓營 第三節 首字母創意手法
- 微服务--开篇
- La prospérité est épuisée, les choses sont bonnes et mauvaises: Où puis - je aller pour un chef de station personnel?
- LOGO特训营 第三节 首字母创意手法
- Close system call analysis - Performance Optimization
- Prosperity is exhausted, things are right and people are wrong: where should personal webmasters go
- leetcode 72. Edit Distance 编辑距离(中等)
- LOGO特训营 第二节 文字与图形的搭配关系
- Use blocconsumer to build responsive components and monitor status at the same time
- 复数在数论、几何中的用途 - 曹则贤
猜你喜欢
How to transfer to software testing, one of the high paying jobs in the Internet? (software testing learning roadmap attached)
Common open source codeless testing tools
Energy momentum: how to achieve carbon neutralization in the power industry?
LOGO特訓營 第一節 鑒別Logo與Logo設計思路
LOGO特训营 第二节 文字与图形的搭配关系
Visual task scheduling & drag and drop | scalph data integration based on Apache seatunnel
PMO: compare the sample efficiency of 25 molecular optimization methods
Machine learning notes mutual information
【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用
LOGO特訓營 第三節 首字母創意手法
随机推荐
Prosperity is exhausted, things are right and people are wrong: where should personal webmasters go
30余家机构联合发起数字藏品行业倡议,未来会如何前进?
质量体系建设之路的分分合合
PostgreSQL JOIN实践及原理
高中物理:直线运动
国产数据库乱象
Why is Dameng data called the "first share" of domestic databases?
Play with grpc - go deep into concepts and principles
我在linux里面 通过调用odspcmd 查询数据库信息 怎么静默输出 就是只输出值 不要这个
Common shortcut keys for hbuilder x
Google Earth Engine(GEE)——Tasks升级,实现RUN ALL可以一键下载任务类型中的所有影像
短视频系统源码,点击屏幕空白处键盘不自动收起
md5工具类
好用app推荐:扫描二维码、扫描条形码并查看历史
将QA引入软件开发生命周期是工程师要遵循的最佳实践
Concurrent network modular reading notes transfer
sqlserver对数据进行加密、解密
# 2156. Find the substring of the given hash value - post order traversal
面试必备 LeetCode 链表算法题汇总,全程干货!
LOGO特训营 第三节 首字母创意手法