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);
            }
    }
}
相关推荐
SmalBox19 小时前
【光照】[自发光Emission]以UnityURP为例
unity·渲染
SmalBox2 天前
【光照】Unity中的[经验模型]
unity·渲染
萘柰奈2 天前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
Yasin Chen2 天前
Unity UI坐标说明
ui·unity
应用市场2 天前
无人机姿态控制系统详解与实现
游戏引擎·cocos2d
陈言必行2 天前
Unity 性能优化 之 编辑器创建资源优化( 工作流 | 场景 | 预制体)
unity·编辑器·游戏引擎
1uther3 天前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
死也不注释3 天前
【Unity UGUI 交互组件——Slider(7)】
unity·游戏引擎·交互
程序猿多布3 天前
XLua教程之热补丁技术
unity·c#·lua·xlua
SmalBox3 天前
【光照】Unity中的[光照模型]概念辨析
unity·渲染