前言
ScrollCircleMaker v1.0是博主近期开发的循环复用的插件,使用它可以很快速的为游戏添加上滑动功能,并且跳出物品数量的约束,比如游戏背包可能存在上千上万的道具,聊天模块的滑动等等,它可以解决一切滑动需求,有单行不规则长度辅助器、多行规则长度辅助器、自定义位置辅助器的存在,只需仅仅几行代码即可,接下来就阐述插件使用教程和注意事项。
1. 如何快速上手?
ScrollCircleMaker v1.0只需要关心数据装载和单个物品的更新逻辑,并且为了尽可能简化插件的使用过程,博主附带写了滑动解决方案脚本生成器,首先需要在ScrollView的Content下挂载上循环滑动组件ScrollCircleComponent,然后使用滑动解决方案脚本生成器选择需要的辅助器输入对应的参数生成滑动解决方案(挂载脚本可能存在问题,建议下图所示生成ScrollCircleView)。
之后ScrollCircleComponent组件的ScrollMaker选项就会出现刚刚生成的解决方案,然后选定这个滑动解决方案即可,把制作好的Item拖动到组件的BaseItem选项上,到这里就离成功还差10%了,大家可能会听的云里雾里的,所以请看下面截图:
可能各位会说是不是吹牛呢?啥也没有做就好了?这个博主是不是傻逼,咱们散了吧!嗯...这个当然是不可能就好了的,还需要写一点点代码,先来看看生成的滑动解决方案基本样子,MakerName填的是Demo,ItemName填的是Demo,TypeName填的是int,选择的CircleHelper是MultipleRectCircleHelper,然后生成的脚本如下所示:
//------------------------------------------------------------
// ScrollCircleMaker v1.0
// Copyright © 2020 DaveAnt. All rights reserved.
// Homepage: https://daveant.gitee.io/
// Github: https://github.com/DaveAnt/ScollCircleMaker
//------------------------------------------------------------
using UnityEngine;
using UnityEngine.UI;
namespace UIPlugs.ScrollCircleMaker
{
[MakerHandle(MakerHandle.MultipleRectCircleHelper)]
public class DemoMaker : BaseDirectMaker<int>
{
public override void OnStart(Transform transform)
{
baseHelper = new MultipleRectCircleHelper<int>(transform,()=> {
return new DemoItem();
});
//How to load data?
}
}
//How to update item?
public class DemoItem : BaseItem<int>
{
public override void InitComponents()
{
}
public override void InitEvents()
{
}
public override void OnDestroy()
{
}
public override void UpdateView(int data, int globalSeat)
{
base.UpdateView(data, globalSeat);
}
}
}
上面展示的代码就是解决方案生成器生成的,TypeName正常来说应该填写的是结构体,这里写的是int方便测试,接下来需要添加模拟的数据,然后再把辅助器启动,可以通过调用AddItem接口,也可以直接在OnStart时传入数据列表,具体代码如下:
for (int i = 0; i < 1000; ++i)
baseHelper.AddItem(i);
baseHelper.OnStart();
数据填充完毕以后,需要具体完善DemoItem类的更新逻辑,上面可以看到有四个函数等待被完善,下面给出表格来说明,每个函数应该完成的任务。
函数名 | 函数作用 |
InitComponents | 找到对应孩子组件 |
InitEvents | 注册按钮事件 |
OnDestroy | 销毁函数 |
UpdateView | 刷新物品样式 |
OnUpdate | 持续更新物品样式 |
InitComponents、InitEvents在实例化时会调用一次,UpdateView是每次开始循环复用时调用,所以不要在UpdateView里找对应孩子组件或注册按钮事件,让函数各司其职保存良好的代码习惯。接下来展示完善的Item代码:
public class DemoItem : BaseItem<int>
{
Text text;
public override void InitComponents()
{
text = _transform.Find("Text").GetComponent<Text>();
}
public override void InitEvents()
{
}
public override void OnDestroy()
{
}
public override void UpdateView(int data, int globalSeat)
{
text.text = data.ToString();
}
}
到这里就完成了所有的步骤,至于上下左右间距和Item之间的间距,是否支持循环成圈等等,只需要在ScrollCircleComponent可视面板下简单设置即可。
2.插件接口、属性说明
插件接口说明:
函数名 | 函数作用 | 参数说明 |
OnStart | 启动插件 | 物品数据列表 |
OnDestroy | 释放插件 | 无 |
ResetItems | 重置插件 | 无 |
OnSlideLockout | 锁定滑动 | 是否滑动 |
DelItem | 移除物品数据 | 物品索引 |
DelItem | 移除物品数据 | 匹配物品函数,移除物品数据 |
AddItem | 添加物品数据 | 物品数据,物品索引 |
UpdateItem | 更新物品样式 | 物品数据,物品索引 |
SwapItem | 交换物品位置 | 被交换物品索引,交换物品索引 |
SwapItem | 交换物品位置 | 匹配物品函数,被交换物品数据,交换物品数据 |
ToLocation | 真实位置定位 | 真实位置值,是否存在定位动画过程 |
ToLocation | 数据索引定位 | 数据索引,是否存在定位动画过程 |
ToLocation | 数据匹配定位 | 匹配物品函数,是否存在定位动画过程 |
ToTop | 置顶定位 | 是否存在定位动画过程 |
ToBottom | 置底定位 | 是否存在定位动画过程 |
插件属性说明:
属性名 | 属性含义 |
toLocationEvent | 定位动画结束回调 |
sProperty | 插件的设置参数 |
itemCore | 物品中心索引 |
viewCore | 视图中心索引 |
dataCount | 物品数据数量 |
itemCount | 物品实例数量 |
以上是插件所有公开接口、属性,使用插件出现问题希望可以联系到博主,在插件工程里存在9大Demo场景,可以完美说明插件可实现出的滚动效果(并不是局限于这些Demo)。
Demo名字 | Demo的作用 |
01-Loadrunner-Demo | 性能测试场景 |
02-Simple-Demo | 简单的使用场景 |
03-Click-Demo | 按钮点击场景 |
04-IsCircleAndUpdate-Demo | 循环成圈并且每帧更新Item样式场景 |
05-CenterMin-Demo | 中间物品最小场景 |
06-CURD-Demo | 运行时增删改换场景 |
07-PageSlide-Demo | 翻页式滑动场景 |
08-Chat-Demo | 不规则长度聊天模块场景 |
09-Custom-Demo | 自定义位置场景 |
3.使用注意事项
因为是循环复用Item,还是存在很多限制的,接下来讲述下博主可以预见到的问题和如何避免比较坑爹的地方:
- 不存在很多Item,不建议使用此插件,因为完全没有必要,插件会按照视图情况和参数设置最优实例化出所需Item数量。
- 使用循环成圈时(勾选了IsCircleEnable)小心使用删除接口,可能会出现问题。
- 使用自定义位置辅助器时,尽量合理设置,用最少的ItemPos来表现出想要的排版。
- 使用自定义位置时,Item位置不能横纵重叠,这样刷新的时候会出现异常表现,具体查看demo-09.
- 单行不规则长度辅助器的BaseItem必须是最小高宽,什么意思呢?就是在UpdateView改变高宽时只能比它大,不能比它小,而且辅助器只判断根节点的高宽,UpdateView修改子组件高宽是无法识别的,具体查看demo-08。
- 目前插件不支持滑动条,存在滑动条时插件会启动异常的。(可以自行实现滑动条,按照content高宽和位置)。
将工程导入后可能会因为Unity版本号不一样,会存在某些依插件包会报错(TextMeshPro报错,在下见过很多次了),基本上升级或移除相关插件包即可,实在不知道如何解决的小白,可以尝试将工程下的Packages文件夹下所有.json文件删除。