循环链表的小效果

本文介绍如何利用循环链表实现UGUI ScrollView的无限滚动效果,通过双向循环链表模拟数据移动,实现类似咬尾蛇的效果,每个元素移动会引发连锁反应。文章提到了使用Queue的局限性,并提供了泛型链表节点类的设计,以及闭环和数据移动的方法。
摘要由CSDN通过智能技术生成

        今天在做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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值