unity | 动画模块之循环滚动选项框

一、作者的话

评论区有人问,有没有竖排循环轮播选项框,我就写了一个

二、效果动画

如果不是你们想要的,就省的你们继续往下看了

三、制作思路

把移动分成里面的方块,还有背景(父物体),方块自己移动,背景(父物体)控制方块在触碰到边界的时候移动位置,保证循环。

五、所有物体总览

脚本说明:

图片循环轮播物体上,挂有ControlMoveItem脚本

其他0-7物体上,均挂有MoveItem脚本

四、小方块(有数字的部分)制作思路

当点击到小方块时,所有小方块根据鼠标拖动的距离进行移动。

1.在小方块上加入EventSystems,用来识别小方块是否被按到。

在这里告诉父物体是否有人被按下,是为了方便其他小方块知道,是不是有物体被按下了

cs 复制代码
public class MoveItem : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
    //声明父物体身上的脚本
    ControlMoveItem controlMoveItem;

    void Start()
    {
        //获取到父物体的身上的脚本
        controlMoveItem = transform.parent.GetComponent<ControlMoveItem>();
        
    }
    
    //当自己被按下时,告诉父物体,自己被按下了
    public void OnPointerDown(PointerEventData eventData)
    {
        controlMoveItem.isButtonDown = true;
    }
    
    //当鼠标抬起时,告诉父物体,没有被按了
    public void OnPointerUp(PointerEventData eventData)
    {
        controlMoveItem.isButtonDown = false;
    }
}

2.当物体被按下时,每个小方块,都挪动和鼠标相同的位置

cs 复制代码
 void Update()
    {
        bool isButtonDown = controlMoveItem.isButtonDown;
        if (isButtonDown == true)
        {
            if (mouthPosition == Vector3.zero)
            {
                mouthPosition = Input.mousePosition;
            }
            else
            {
                Vector3 del = Input.mousePosition - mouthPosition;
                transform.position += new Vector3(0, del.y, 0);
                mouthPosition = Input.mousePosition;
            }
        }
        else {
            mouthPosition = Vector3.zero;
        }
    }

3.总代码

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class MoveItem : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
    ControlMoveItem controlMoveItem;
    Vector3 mouthPosition = new Vector3();

    public void OnPointerDown(PointerEventData eventData)
    {
        controlMoveItem.isButtonDown = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        controlMoveItem.isButtonDown = false;
    }

    void Start()
    {
        controlMoveItem = transform.parent.GetComponent<ControlMoveItem>();
    }

    void Update()
    {
        bool isButtonDown = controlMoveItem.isButtonDown;
        if (isButtonDown == true)
        {
            if (mouthPosition == Vector3.zero)
            {
                mouthPosition = Input.mousePosition;
            }
            else
            {
                Vector3 del = Input.mousePosition - mouthPosition;
                if (controlMoveItem.dir == Dir.Vertical)
                {
                    transform.position += new Vector3(0, del.y, 0);
                }
                mouthPosition = Input.mousePosition;
            }
        }
        else {
            mouthPosition = Vector3.zero;
        }
    }
}
四、大方块(父物体)制作思路

1.读取显示的第一个物体和最后一个物体的位置

这样当超过这个位置的时候,我就知道,要移动别的方块了

cs 复制代码
    public bool isButtonDown = false;
    public int lastIndex = 5;

    Vector3 firstPosition;
    Vector3 lastPosition;

    void Start()
    {
        firstPosition = transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition;
        lastPosition = transform.GetChild(lastIndex).GetComponent<RectTransform>().anchoredPosition;
    }

2.读取第一个小方块和第二个小方块之间的距离

这样当设置新移动过来的位置的时候,我知道把方块放到哪里

cs 复制代码
    public bool isButtonDown = false;
    public int lastIndex = 5;

    float d;
    Vector3 firstPosition;
    Vector3 lastPosition;

    void Start()
    {
            d = Mathf.Abs(transform.GetChild(0).localPosition.y - transform.GetChild(1).localPosition.y);

        firstPosition = transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition;
        lastPosition = transform.GetChild(lastIndex).GetComponent<RectTransform>().anchoredPosition;
    }

3.如果向上滑动,第一个物体已经超过上方的线了,就要在队尾补物体了,

反之,如果向下滑动,最后一个物体如果已经超过最下方的线了,就要在上方补物体了

补的物体就是现在队头(或队尾)的现在的位置,加上(或减去)两个小方块的距离

cs 复制代码
    void Update()
    {
            if (transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition.y < firstPosition.y)
            {
                Transform changeT = transform.GetChild(transform.childCount - 1);
                changeT.localPosition = transform.GetChild(0).localPosition + new Vector3(0, d, 0);
                changeT.SetSiblingIndex(0);
            }
            else if (transform.GetChild(transform.childCount - 1).GetComponent<RectTransform>().anchoredPosition.y > lastPosition.y)
            {
                Transform changeT = transform.GetChild(0);
                changeT.localPosition = transform.GetChild(transform.childCount - 1).localPosition - new Vector3(0, d, 0);
                changeT.SetSiblingIndex(transform.childCount - 1);
            }
    }

4.全部代码

cs 复制代码
using UnityEngine;

public class ControlMoveItem : MonoBehaviour
{
    public bool isButtonDown = false;
    public int lastIndex = 5;

    float d;
    Vector3 firstPosition;
    Vector3 lastPosition;

    void Start()
    {
            d = Mathf.Abs(transform.GetChild(0).localPosition.y - transform.GetChild(1).localPosition.y);

        firstPosition = transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition;
        lastPosition = transform.GetChild(lastIndex).GetComponent<RectTransform>().anchoredPosition;
    }

    void Update()
    {
            if (transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition.y < firstPosition.y)
            {
                Transform changeT = transform.GetChild(transform.childCount - 1);
                changeT.localPosition = transform.GetChild(0).localPosition + new Vector3(0, d, 0);
                changeT.SetSiblingIndex(0);
            }
            else if (transform.GetChild(transform.childCount - 1).GetComponent<RectTransform>().anchoredPosition.y > lastPosition.y)
            {
                Transform changeT = transform.GetChild(0);
                changeT.localPosition = transform.GetChild(transform.childCount - 1).localPosition - new Vector3(0, d, 0);
                changeT.SetSiblingIndex(transform.childCount - 1);
            }
    }
}
相关推荐
千年奇葩5 小时前
Unity性能优化之:利用CUDA加速Unity实现大规模并行计算。从环境搭建到实战案例
c++·人工智能·unity·游戏引擎·cuda
AA陈超5 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-25 属性信息数据资产
c++·游戏·ue5·游戏引擎·虚幻
17岁的勇气8 小时前
Unity Shader unity文档学习笔记(二十二):雪地几种实现方式(1. 2D贴花式 2.3D曲面细分并且实现顶点偏移)
笔记·学习·unity·shader
科技快报18 小时前
引入实时 3D 渲染技术,地平线与 Unity 开启车载交互空间化时代
3d·unity·交互
爱吃小胖橘21 小时前
高效对象池设计:提升Unity性能的关键
开发语言·unity·c#·游戏引擎
沉默的记录者21 小时前
unity 2021反向遮罩的毛边
unity·游戏引擎
沧海归城21 小时前
Unity_Canvas_Canvas Scaler画布缩放器。
unity·游戏引擎
一只一只2 天前
Unity 3D笔记(进阶部分)——《B站阿发你好》
笔记·3d·unity·游戏引擎
yi碗汤园2 天前
【一文了解】八大排序-冒泡排序、选择排序
开发语言·前端·算法·unity·c#·1024程序员节
qq_205279052 天前
unity PS 给图片换透明底图,去除白色底图
unity