当前位置:网站首页>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
边栏推荐
- Force buckle 2_ 1480. Dynamic sum of one-dimensional array
- leetcode 72. Edit Distance 编辑距离(中等)
- idea中pom.xml依赖无法导入
- PostgreSQLSQL高级技巧透视表
- PostgreSQL server programming aggregation and grouping
- How to reset the password of MySQL root account
- TLA+ 入门教程(1):形式化方法简介
- Practice and principle of PostgreSQL join
- Logo special training camp Section V font structure and common design techniques
- 常用的开源无代码测试工具
猜你喜欢
LOGO特训营 第五节 字体结构与设计常用技法
2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条
Challenges faced by virtual human industry
Introduction and application of bigfilter global transaction anti duplication component
Play with grpc - go deep into concepts and principles
【OpenGL】笔记二十九、抗锯齿(MSAA)
UML diagram memory skills
[the 2023 autumn recruitment of MIHA tour] open [the only exclusive internal push code of school recruitment eytuc]
LOGO特训营 第一节 鉴别Logo与Logo设计思路
随机推荐
高中物理:直线运动
leetcode 72. Edit Distance 编辑距离(中等)
Apachecn translation, proofreading, note sorting activity progress announcement 2022.7
10 schemes to ensure interface data security
华泰证券是国家认可的券商吗?开户安不安全?
Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei
Energy momentum: how to achieve carbon neutralization in the power industry?
Locust performance test - environment construction and use
2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
High school physics: linear motion
Test will: bug classification and promotion solution
Li Kou 98: verify binary search tree
微服务--开篇
Microservices -- Opening
力扣3_383. 赎金信
面试必备 LeetCode 链表算法题汇总,全程干货!
Common shortcut keys for hbuilder x
傳智教育|如何轉行互聯網高薪崗比特之一的軟件測試?(附軟件測試學習路線圖)
Concurrent optimization summary
蓝队攻防演练中的三段作战