IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity插件-OSA(Optimized ScrollView Adapter) -> 正文阅读

[游戏开发]Unity插件-OSA(Optimized ScrollView Adapter)

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

介绍

在设备上通过列表、网格或表格有效地显示大量数据!通常我们在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. 脑海中预演搬迁插件需要处理的代码和项目中该如何使用的流程。
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:06:31  更:2021-08-02 11:06:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 3:38:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码