unity实现无限列表功能

 更新时间:2020年6月25日 10:34  点击:1886

本文实例为大家分享了unity实现无限列表功能的具体代码,供大家参考,具体内容如下

public static class RectTransformExtensions
 {
  public static bool Overlaps(this RectTransform a, RectTransform b)
  {
   return a.WorldRect().Overlaps(b.WorldRect());
  }
  public static bool Overlaps(this RectTransform a, RectTransform b, bool allowInverse)
  {
   return a.WorldRect().Overlaps(b.WorldRect(), allowInverse);
  }
 
  public static Rect WorldRect(this RectTransform rectTransform)
  {
   Vector2 sizeDelta = rectTransform.sizeDelta;
   float rectTransformWidth = sizeDelta.x * rectTransform.lossyScale.x;
   float rectTransformHeight = sizeDelta.y * rectTransform.lossyScale.y;
 
   Vector3 position = rectTransform.position;
 
   return new Rect(
    position.x - rectTransformWidth * rectTransform.pivot.x,
    position.y - rectTransformHeight * rectTransform.pivot.y,
    rectTransformWidth,
    rectTransformHeight);
  }
  /// <summary>
  /// 
  /// </summary>
  /// <param name="rectTransform"></param>
  /// <param name="pos">世界坐标的position</param>
  /// <returns></returns>
  public static Rect WorldRect2(this RectTransform rectTransform, Vector3 pos)
  {
   Rect rect = new Rect();
   Vector2 sizeDelta = rectTransform.sizeDelta;
   float rectTransformWidth = sizeDelta.x * rectTransform.lossyScale.x;
   float rectTransformHeight = sizeDelta.y * rectTransform.lossyScale.y;
 
   Vector3 position = pos;
 
   rect.x = position.x - rectTransformWidth * rectTransform.pivot.x;
   rect.y = position.y - rectTransformHeight * rectTransform.pivot.y;
   rect.width = rectTransformWidth;
   rect.height = rectTransformHeight;
 
   return rect;
  }
 }

以上拓展方法是判断两个Recttransform类型的物体是否相交。

然后ScrollRec的滑动回调方法中更新UI位置,代码如下

private void OnScrollRectValueChanged(Vector2 arg0)
  {
   Dictionary<int, DynamicRect> inOverlaps = new Dictionary<int, DynamicRect>();
 
   mRectMask = 遮罩物体的RectTransform.WorldRect();
   //m_DynamicRectDic这个字典保存的是你所有UI需要放置的位置数据,
   //判断所有UI哪个是可见哪个不可见 ,保存起来
   foreach (DynamicRect dR in m_DynamicRectDic.Values)
   {
    tmpTra.localPosition = dR.localPos;
    //获取每个位置UI的世界坐标Rect
    Rect rect = m_LevelItemPrefabRT.WorldRect2(tmpTra.position);
    if (rect.Overlaps(mRectMask))
    {
     inOverlaps.Add(dR.Index, dR);
    }
   }
   //m_LevelItemList是保存你实例化后的UI列表,比如你这个遮罩页面最多显示3个UI,你需要实例化4个UI,然后动态修改gameobject的显示与隐藏
   int len = m_LevelItemList.Count;
   for (int i = 0; i < len; ++i)
   {
    //LevelItem是UI上挂载的脚本,用于更新UI界面的显示和数据存储的
    LevelItem item = m_LevelItemList[i];
    if (item.DRect != null && !inOverlaps.ContainsKey(item.DRect.Index))
    {
     //item的DRect为null时,隐藏物体,否则显示物体
     item.DRect = null;
    }
   }
   //判断哪些可以重复利用的UI,然后赋予新的数据与位置
   foreach (DynamicRect dR in inOverlaps.Values)
   {
    if (GetDynmicItem(dR) == null)
    {
     LevelItem item = GetNullDynmicItem();
 
     if (item == null) continue;
 
     item.DRect = dR;
     //更新UI的位置和显示(自己计算,每种显示不一样)
     _UpdateChildTransformPos(item.gameObject, dR.Index);
    }
   }
  }
 
  /// <summary>
  /// 通过动态格子获得动态渲染器
  /// </summary>
  /// <param name="rect"></param>
  /// <returns></returns>
  private LevelItem GetDynmicItem(DynamicRect rect)
  {
   int len = m_LevelItemList.Count;
   for (int i = 0; i < len; ++i)
   {
    LevelItem item = m_LevelItemList[i];
    if (item.DRect == null)
     continue;
    if (rect.Index == item.DRect.Index)
     return item;
   }
   return null;
  }
  /// <summary>
  /// 获得待渲染的渲染器
  /// </summary>
  /// <returns></returns>
  private LevelItem GetNullDynmicItem()
  {
   int len = m_LevelItemList.Count;
   for (int i = 0; i < len; ++i)
   {
    LevelItem item = m_LevelItemList[i];
    if (item.DRect == null)
     return item;
   }
 
   return null;
  }
 
 public class DynamicRect
 {
  /// <summary>
  /// 本地坐标
  /// </summary>
  public Vector3 localPos;
  /// <summary>
  /// 格子索引
  /// </summary>
  public int Index;
 
  public DynamicRect(int index, Vector3 localPos)
  {
   this.Index = index;
   this.localPos = localPos;
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • js实现列表按字母排序

    这篇文章主要为大家详细介绍了js实现列表按字母排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-11
  • javaScript年份下拉列表框内容为当前年份及前后50年

    javascript下拉列表框,内容为当前年份及前后50年,默认选择为当前年份 复制代码 代码如下: <script language="javascript" type="text/javascript"> window.onload=function(){ //设置年份的选择 var myDate= new Date(...2014-05-31
  • easyUI下拉列表点击事件使用方法

    这篇文章主要为大家详细介绍了easyUI下拉列表点击事件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-05-22
  • Python 列表(List)的底层实现原理分析

    这篇文章主要介绍了Python 列表(List)的底层实现原理分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • JavaScript实现网页下拉列表的省市联动

    这篇文章主要为大家详细介绍了JavaScript实现网页下拉列表的省市联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-07
  • Unity时间戳的使用方法

    这篇文章主要为大家详细介绍了Unity时间戳的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C# 列表List的常用属性和方法介绍

    这篇文章主要介绍了C# 列表List的常用属性和方法介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • AngularJS使用ngOption实现下拉列表的实例代码

    这篇文章主要介绍了AngularJS使用ngOption实现下拉列表的实例代码的相关资料,需要的朋友可以参考下...2016-01-25
  • 微信小程序虚拟列表的实现示例

    大部分小程序都会有这样的需求,页面有长列表,需要下拉到底时请求后台数据,一直渲染数据,当数据列表长时,会发现明显的卡顿,页面白屏闪顿现象,那么如何实现小程序虚拟列表,感兴趣的可以了解一下...2021-07-16
  • Unity中 ShaderGraph 实现旋涡传送门效果入门级教程(推荐)

    通过Twirl 旋转节点对Gradient Noise 梯度噪声节点进行操作,就可得到一个旋转的旋涡效果。具体实现代码跟随小编一起通过本文学习下吧...2021-07-11
  • Unity延时执行的多种方法小结

    本文主要介绍了4种延时执行的方法,主要包括Update计时器,Invoke,协程,DoTween,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-07
  • Unity shader实现遮罩效果

    这篇文章主要为大家详细介绍了Unity shader实现遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • unity 如何判断鼠标是否在哪个UI上(两种方法)

    这篇文章主要介绍了unity 判断鼠标是否在哪个UI上的两种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
  • php有序列表或数组中删除指定的值的实现代码

    这篇文章主要介绍了php有序列表或数组中删除指定的值的实现代码,删除给定的值之后,得到一个新的有序列表,长度-1,下面是具体的实现方法...2021-08-22
  • 利用unity代码C#封装为dll的步骤分享

    这篇文章主要给大家介绍了关于利用unity代码C#封装为dll的相关资料,文中通过图文将实现的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • Unity实现换装系统

    这篇文章主要为大家详细介绍了Unity实现换装系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-11
  • Unity Shader实现径向模糊效果

    这篇文章主要为大家详细介绍了Unity Shader实现径向模糊效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-09
  • unity 实现摄像机绕某点旋转一周

    这篇文章主要介绍了unity 实现摄像机绕某点旋转一周,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • Unity实现截图功能

    这篇文章主要为大家详细介绍了Unity实现截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • JS动态的把左边列表添加到右边的实现代码(可上下移动)

    在javascript前端开发过程中经常见到动态的把左边列表添加到右边,基于js代码怎么实现的呢?今天小编通过本文给大家介绍下js 左边列表添加到右边的实现方法,感兴趣的朋友一起看看吧...2016-11-22