Unity插件-OSA(Optimized ScrollView Adapter)_unity osa-程序员宅基地

技术标签: 多元素列表  Unity  Unity插件  OSA  无限列表  

效果展示在这里插入图片描述

介绍

在设备上通过列表、网格或表格有效地显示大量数据!通常我们在unity中使用UGUI自带的ScrollView,小量的元素显示是没问题的,但是量级一旦太大,ScrolView就会很卡。这个插件就是解决元素太多的列表问题。

使用方法

1.官方下载地址

2. 下载好之后是一个unity的扩展包 在这里插入图片描述

直接将资源包拖入unity项目中即可。

3.你会看到大量案例

在这里插入图片描述

4.multiple_prefabs 案例

1.以multiple_prefabs 这个案例为例,最核心的就是 主功能区的MultiplePrefabsExample脚本

在这里插入图片描述

2.脚本核心代码

在这里插入图片描述

3.使用该插件的几大核心点。

1.插件中最核心的脚本你是OSA,所有的无限列表的脚本都是继承自OSA,然后把脚本挂载到主功能对象上。
2.实现不同的附属功能需要自己重写OSA中的虚方法或抽象方法。
3.底层的基本思路是,用数据list装载数据,实体对象的状态显示样式是OSA底层逻辑判断的,会在滑动的时候自动回调回实体对象的函数中,并执行回调中接收到的数据并显示。这样就实现了少量实体对象展示大量的数据。

4.重要的脚本

1.MyParams 装载预制体的脚本,有几个就装几个预制体
2.BaseVH 这个是预制体视图层组件的展示区
3.SimpleDataHelper 数据操作层的脚本,包含各种数据操作

  • Models
    • BaseModel
    • BidirectionalModel
    • ExpandableModel
  • ViewHolders
    • BaseVH
    • BidirectionalVH
    • ExpandableVH
  • MultiplePrefabsExample
  • MultiplePrefabsSceneEntry
  • SliderItemBehaviour
5.创建过程
  1. 创建你自己的 BaseItemViewHolder 可以起名叫MyItemViewsHolder(基本项目视图持有人)
  2. 创建你自己的 BaseParams 可以起名叫 MyParams (基本参数)
  3. 创建你自己的 OSA 传入泛型实现 MyParams 和 MyItemViewsHolder 可以起名叫MyScrollViewAdapter(优化的滚动视图适配器)
  4. 实例化 MyScrollViewAdapter
  5. 被调用一次 MyScrollViewAdapter.ResetItems(int),当你的数据集发生改变 ,除此之外还会发生以下其它变化(重置元素)
    5.1 CollectItemsSizes(ItemCountChangeMode, int, int, ItemsDescriptor)和CollectItemsSizes(ItemCountChangeMode, int, int, ItemsDescriptor) 会被调用
    5.2 CreateViewsHolder(int) 将调用足够的条目来填充视口。一旦viewholder被创建,它将在关闭viewport时被重用。newOrRecycledViewsHolder.root会是空的,所以你需要实例化你的预制体分配它并调用newOrRecycledViewsHolder.CollectViews(). 或者你也可以调用AbstractViewsHolder.Init(GameObject, RectTransform, int, bool, bool),主要实例化预制体。在创建 之后只有UpdateViewsHolder(TItemViewsHolder) 会被调用,表示元素的改变,
    5.3 在项目要显示或仅仅需要更新时调用UpdateViewsHolder(TItemViewsHolder),使用AbstractViewsHolder.ItemIndex,为了获得项目索引,您可以从数据集中检索其关联的模型(最常见的做法是将数据列表存储在Params实现中),AbstractViewsHolder.root这里不是空(给定视图holder是在createviewholder(…)中正确创建的)。它被分配了一个有效的对象,它的UI元素只需要改变它们的值(通常的做法是在视图holder中实现辅助方法,接受模型并更新视图本身),ResetItems(int, bool, bool)也会在视口大小改变时调用(比如移动设备上的方向改变或sandalone平台上的窗口大小调整)
    提示:内容面板上不允许有LayoutGroup(垂直/水平/网格),因为所有的布局都委托给了这个适配器
6.运行流程
SimpleSceneEntry.OnItemCountChangeRequested(SimpleExample,int)//请求更改项目计数
SimpleSceneEntry/_Adapters[0].Data.ResetItems()//收到新数据进行复位
SimpleDataHelper.ResetItems(IList<T>)//重置添加数据,先清除再添加
OSA.ResetItems()
OSA.ChangeItemsCount(ItemCountChangeMode)
SimpleExample.ChangeItemsCount(ItemCountChangeMode)//改变元素数量
OSA.ChangeItemsCount(ItemCountChangeMode)
OSA.ChangeItemsCountInternal(ItemCountChangeMode)
OSA.ComputeVisibilityForCurrentPositionRawParams()//计算当前位置原始参数的可见性
ComputeVisibilityManager.ComputeVisibility(abstractDelta)//计算核心
OSA.ExtractRecyclableViewsHolderOrCreateNew(int)//提取可回收视图持有人或创建新的
SimpleExample.CreateViewsHolder(int)//让元素初始化
AbstractViewsHolder.Init(RectTransform)//真正的创建出元素
7.核心方法
	_Adapters[0].Data.ResetItems(newModels, _Drawer.freezeContentEndEdgeToggle.isOn);//创建重置元素
	 protected override BaseVH CreateViewsHolder(int itemIndex);//创建实体对象
	 protected override void UpdateViewsHolder(BaseVH newOrRecycled);//实体对象根据数据做刷新

8.MultiplePrefabsExample
  1. 继承OSA,确认两个泛型,一个是基本参数,比如需要展示的图片集合,预制体元素,还一个是元素持有器做所有元素的父类抽象。
  2. 继承滚轴动画变化器接口ISizeChangesHandler,动画运行时处理大小变化
  3. 声明一个数据助手,这就是这个滚轴视图的总数据管理器SimpleDataHelper Data
  4. 一个滚轴视图中只可展开一个子元素_IndexOfCurrentlyExpandedItem,展开的元素索引值
  5. 来一个缓冲池存放一些图片资源
  6. 初始化数据和滚轴视图,初始化缓冲池
  7. 构建好一系列的方法,
  8. ChangeItemsCount(ItemCountChangeMode),
  9. CreateViewsHolder() 创建一个元素持有器BidirectionalVH或者ExpandableVH,根据索引数据的类型来生成实例
  10. UpdateViewsHolder()更新展示
  11. OnItemIndexChangedDueInsertOrRemove()这只是为了在插入/删除的情况下,条目的标题将被更新,以反映它的新索引,因为索引没有存储在模型中
  12. IsRecyclable()覆盖始终返回true的基实现。在这种情况下,一个视图持有人只有当它在索引处的模型返回true时才是可回收的
  13. 处理动画处理大小的更改请求HandleSizeChangeRequest,OnExpandedStateChanged 展开状态的改变
  14. 重写一下销毁函数,销毁缓冲池,销毁自身
  15. 图像销毁器ImageDestroyer(object)
  16. 预写参数MyParams,放入需要展示的元素。

外界调用的核心方法:
ScenEntry.OnAddItemRequested(adapter,index)
ScenEntry.OnRemoveItemRequested(adapter,index)
ScenEntry.OnItemCountChangeRequested(adapter,count)

是否使用插件的思考

自学插件的心得和方法:
一定一定要少用插件,能自己搞一份代码,读懂的都行,能不用插件就不用。不得不用的情况下,一定要用成熟的人气足的插件,不然有问题问都没地方问。

  1. 先浏览一遍整体的展示,看看这个插件都能做些什么demo,看的时候预先在脑海里想象它可能编写的逻辑,着重关注我如果要学会这一份demo的功能我需要自己编写哪部分的代码,心里先有个底。
  2. 阅读介绍文档,整体通读一遍,尽可能翻译理解清除文档要表达的意思,如果有操作指南,跟着操一遍。
  3. 回头对应最迫切要掌握的功能demo,对照文档进一步理解,调用使用操作功能的代码模块。
  4. 使用debug在最高层脚本的每一个方法里写debug,看看执行流程,比起断点来,会便捷直观一些.
  5. 尝试用自定义的脚本来达成demo中操作使用的那些功能,需要掌握的内容全部尝试一下。
  6. 脑海中预演搬迁插件需要处理的代码和项目中该如何使用的流程。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44186849/article/details/113999540

智能推荐

hdu 1229 还是A+B(水)-程序员宅基地

文章浏览阅读122次。还是A+BTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24568Accepted Submission(s): 11729Problem Description读入两个小于10000的正整数A和B,计算A+B。...

http客户端Feign——日志配置_feign 日志设置-程序员宅基地

文章浏览阅读419次。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。NONE:不记录任何日志信息,这是默认值。配置Feign日志有两种方式;方式二:java代码实现。注解中声明则代表某服务。方式一:配置文件方式。_feign 日志设置

[转载]将容器管理的持久性 Bean 用于面向服务的体系结构-程序员宅基地

文章浏览阅读155次。将容器管理的持久性 Bean 用于面向服务的体系结构本文将介绍如何使用 IBM WebSphere Process Server 对容器管理的持久性 (CMP) Bean的连接和持久性逻辑加以控制,使其可以存储在非关系数据库..._javax.ejb.objectnotfoundexception: no such entity!

基础java练习题(递归)_java 递归例题-程序员宅基地

文章浏览阅读1.5k次。基础java练习题一、递归实现跳台阶从第一级跳到第n级,有多少种跳法一次可跳一级,也可跳两级。还能跳三级import java.math.BigDecimal;import java.util.Scanner;public class Main{ public static void main(String[]args){ Scanner reader=new Scanner(System.in); while(reader.hasNext()){ _java 递归例题

面向对象程序设计(荣誉)实验一 String_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏6次。目录1.串应用- 计算一个串的最长的真前后缀题目描述输入输出样例输入样例输出题解2.字符串替换(string)题目描述输入输出样例输入样例输出题解3.可重叠子串 (Ver. I)题目描述输入输出样例输入样例输出题解4.字符串操作(string)题目描述输入输出样例输入样例输出题解1.串应用- 计算一个串的最长的真前后缀题目描述给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。

算法设计与问题求解/西安交通大学本科课程MOOC/C_算法设计与问题求解西安交通大学-程序员宅基地

文章浏览阅读68次。西安交通大学/算法设计与问题求解/树与二叉树/MOOC_算法设计与问题求解西安交通大学

随便推点

[Vue warn]: Computed property “totalPrice“ was assigned to but it has no setter._computed property "totalprice" was assigned to but-程序员宅基地

文章浏览阅读1.6k次。问题:在Vue项目中出现如下错误提示:[Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>)代码:<input v-model="totalPrice"/>原因:v-model命令,因Vue 的双向数据绑定原理 , 会自动操作 totalPrice, 对其进行set 操作而 totalPrice 作为计..._computed property "totalprice" was assigned to but it has no setter.

basic1003-我要通过!13行搞定:也许是全网最奇葩解法_basic 1003 case 1-程序员宅基地

文章浏览阅读60次。十分暴力而简洁的解决方式:读取P和T的位置并自动生成唯一正确答案,将题给测点与之对比,不一样就给我爬!_basic 1003 case 1

服务器浏览war文件,详解将Web项目War包部署到Tomcat服务器基本步骤-程序员宅基地

文章浏览阅读422次。原标题:详解将Web项目War包部署到Tomcat服务器基本步骤详解将Web项目War包部署到Tomcat服务器基本步骤1 War包War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成Wa..._/opt/bosssoft/war/medical-web.war/web-inf/web.xml of module medical-web.war.

python组成三位无重复数字_python组合无重复三位数的实例-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏13次。# -*- coding: utf-8 -*-# 简述:这里有四个数字,分别是:1、2、3、4#提问:能组成多少个互不相同且无重复数字的三位数?各是多少?def f(n):list=[]count=0for i in range(1,n+1):for j in range(1, n+1):for k in range(1, n+1):if i!=j and j!=k and i!=k:list.a..._python求从0到9任意组合成三位数数字不能重复并输出

ElementUl中的el-table怎样吧0和1改变为男和女_elementui table 性别-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。<el-table-column prop="studentSex" label="性别" :formatter="sex"></el-table-column>然后就在vue的methods中写方法就OK了methods: { sex(row,index){ if(row.studentSex == 1){ return '男'; }else{ return '女'; }..._elementui table 性别

java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下-程序员宅基地

文章浏览阅读1.1k次。java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下

推荐文章

热门文章

相关标签