今天在做UGUI的ScrollView的无限滚动效果,一开始想错了逻辑,不过误打误撞实现了一种小效果(虽然目前还不知道用在哪儿。。。)。这种效果类似于咬尾蛇的那种,每个元素的移动都会引起链式效应,使得其他元素一起移动。具体效果如下:
可以看到,00~04的cell乡下移动时,最末尾的016~019的cell补位到原先00~04的位置,而05~015则顺次向下移动。
在做这个效果的时候,就是想着用数据结构来模拟的。其实cell反映的就是数据的移动方式。一开始用Queue来模拟的。可是发现Queue能做的仅仅是对头移动到对尾,中间的数据不能联动。后来就干脆自己写了个链表来模拟。由于既能向下移动,也能向上移动,就构造了一个双向循环链表结构。参考的是这篇:https://www.cnblogs.com/Yellowshorts/p/3522901.html。在这篇文章的基础上,增加了闭环的方法CloseLoop()和数据整体移动的方法RunLoopNextStep(),RunLoopPreviousStep()。节点的类的创建上采用的泛型类,以为要用于存储Vector2和GameObject。关于泛型类的构造方法的问题,这里有一篇文章: https://www.cnblogs.com/indream/p/3667279.html。
下面的图解释了cell移动的原理(纯手绘,嘿嘿)。
在初始化的时候,ListNote<GameObject>和ListNote<Vector2>分别存储对象和位置,不过一个正向存储(位置),一个反向存储(对象)。每次匹配Head元素的值(对象移动到指定位置),然后两个链表分别反向整体移动(其实就是更改了Head元素指定的值)。
完整代码如下。可以重点看看移动部分两个函数的实现,和ListNote的构建部分。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class cellNote<T>
{
public T value;
public cellNote<T> next;
public cellNote<T> previous;
p