之前做项目就想写一篇关于UI无限循环的总结,但一直没写过,一是自己也没理解清楚,二是项目忙,也没时间。现在由于在等待新项目的启动,终于有时间去总结一下UI方面的相关知识。
无限循环:主要应用在游戏排行榜,邮件,国家成员等需要大量创建Gameobj的场景,因为如果每多一条数据,就创建一个Gameobj去显示的话,那么游戏当中会存在大量的Obj,消耗性能,造成卡帧的现象,影响玩家游戏体验。这时候,就需要无限循环的功能了,因为游戏视窗大小是固定的,只显示一定数量的UI,这样,就可以用一定数量的UI去模拟所有数据的显示。
UIWrapContent就是NGUI封装好,用来实现这套功能的脚本。
接下来,就来详解这个脚本。
protected virtual void Start ()
{
SortBasedOnScrollMovement();
WrapContent(); //核心函数
if (mScroll != null) mScroll.GetComponent<UIPanel>().onClipMove = OnMove; //由UIPanel的驱动,来更新对应的数据
mFirstTime = false;
}
public void SortBasedOnScrollMovement () //这段函数主要用来将他的子物体排序,代替了UIGrid的功能
{
if (!CacheScrollView()) return;
// Cache all children and place them in order
mChildren.Clear();
for (int i = 0; i < mTrans.childCount; ++i)
mChildren.Add(mTrans.GetChild(i));
// Sort the list of children so that they are in order
if (mHorizontal) mChildren.Sort(UIGrid.SortHorizontal);
else mChildren.Sort(UIGrid.SortVertical);
ResetChildPositions();
}
//上图对wrapcontent的实现,大致画了一下,以便于理解
public void WrapContent () //这个函数,是核心函数,用来实现无限循环的功能
{
float extents = itemSize * mChildren.Count * 0.5f; //计算所有的UI距离,并分为一半(后面用来判断用)
Vector3[] corners = mPanel.worldCorners;
for (int i = 0; i < 4; ++i) //将panel的世界坐标转化为本地坐标(具体哪些点,可以参考上图)
{
Vector3 v = corners[i];
v = mTrans.InverseTr