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);
            }
    }
}
相关推荐
心前阳光31 分钟前
Unity之语音提问,语音答复
unity·游戏引擎
mxwin2 小时前
Unity Shader UV 坐标与纹理平铺Tiling & Offset 深度解析
unity·游戏引擎·shader·uv
chao1898443 小时前
基于STM32F1的声源定位系统设计与实现
stm32·嵌入式硬件·unity
七夜zippoe13 小时前
OpenClaw 内置工具详解
unity·ai·游戏引擎·openclaw·内置工具
mxwin18 小时前
Unity Shader 细节贴图技术在不增加显存开销的前提下,有效提升近距离纹理细节的渲染质量
unity·游戏引擎·贴图
魔士于安19 小时前
unity 低多边形 动物 带场景 有氛围感
游戏·unity·游戏引擎·贴图
小贺儿开发20 小时前
Unity3D 摩斯与中文电码转换工具
科技·unity·人机交互·工具·实践·实用·科普应用
魔士于安21 小时前
unity 动物包 大象 鹿 狐狸
游戏·unity·游戏引擎·贴图·模型
mxwin1 天前
Unity URP 中 Mipmap 纹理多级渐远技术 解决远处纹理闪烁(摩尔纹)与性能优化的完整指南
unity·游戏引擎
mxwin1 天前
Unity Shader Blinn-Phong vs PBR传统经验模型与现代物理基础渲染
unity·游戏引擎·shader