当前位置:   article > 正文

unity | 动画模块之循环滚动选项框_unity 轮播效果

unity 轮播效果

目录

一、作者的话

二、效果动画

三、制作思路

五、所有物体总览

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

四、大方块(父物体)制作思路


一、作者的话

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

二、效果动画

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

三、制作思路

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

五、所有物体总览

脚本说明:

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

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

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

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

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

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

  1. public class MoveItem : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
  2. {
  3. //声明父物体身上的脚本
  4. ControlMoveItem controlMoveItem;
  5. void Start()
  6. {
  7. //获取到父物体的身上的脚本
  8. controlMoveItem = transform.parent.GetComponent<ControlMoveItem>();
  9. }
  10. //当自己被按下时,告诉父物体,自己被按下了
  11. public void OnPointerDown(PointerEventData eventData)
  12. {
  13. controlMoveItem.isButtonDown = true;
  14. }
  15. //当鼠标抬起时,告诉父物体,没有被按了
  16. public void OnPointerUp(PointerEventData eventData)
  17. {
  18. controlMoveItem.isButtonDown = false;
  19. }
  20. }


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

  1. void Update()
  2. {
  3. bool isButtonDown = controlMoveItem.isButtonDown;
  4. if (isButtonDown == true)
  5. {
  6. if (mouthPosition == Vector3.zero)
  7. {
  8. mouthPosition = Input.mousePosition;
  9. }
  10. else
  11. {
  12. Vector3 del = Input.mousePosition - mouthPosition;
  13. transform.position += new Vector3(0, del.y, 0);
  14. mouthPosition = Input.mousePosition;
  15. }
  16. }
  17. else {
  18. mouthPosition = Vector3.zero;
  19. }
  20. }

3.总代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class MoveItem : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
  6. {
  7. ControlMoveItem controlMoveItem;
  8. Vector3 mouthPosition = new Vector3();
  9. public void OnPointerDown(PointerEventData eventData)
  10. {
  11. controlMoveItem.isButtonDown = true;
  12. }
  13. public void OnPointerUp(PointerEventData eventData)
  14. {
  15. controlMoveItem.isButtonDown = false;
  16. }
  17. void Start()
  18. {
  19. controlMoveItem = transform.parent.GetComponent<ControlMoveItem>();
  20. }
  21. void Update()
  22. {
  23. bool isButtonDown = controlMoveItem.isButtonDown;
  24. if (isButtonDown == true)
  25. {
  26. if (mouthPosition == Vector3.zero)
  27. {
  28. mouthPosition = Input.mousePosition;
  29. }
  30. else
  31. {
  32. Vector3 del = Input.mousePosition - mouthPosition;
  33. if (controlMoveItem.dir == Dir.Vertical)
  34. {
  35. transform.position += new Vector3(0, del.y, 0);
  36. }
  37. mouthPosition = Input.mousePosition;
  38. }
  39. }
  40. else {
  41. mouthPosition = Vector3.zero;
  42. }
  43. }
  44. }
四、大方块(父物体)制作思路

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

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

  1. public bool isButtonDown = false;
  2. public int lastIndex = 5;
  3. Vector3 firstPosition;
  4. Vector3 lastPosition;
  5. void Start()
  6. {
  7. firstPosition = transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition;
  8. lastPosition = transform.GetChild(lastIndex).GetComponent<RectTransform>().anchoredPosition;
  9. }

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

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

  1. public bool isButtonDown = false;
  2. public int lastIndex = 5;
  3. float d;
  4. Vector3 firstPosition;
  5. Vector3 lastPosition;
  6. void Start()
  7. {
  8. d = Mathf.Abs(transform.GetChild(0).localPosition.y - transform.GetChild(1).localPosition.y);
  9. firstPosition = transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition;
  10. lastPosition = transform.GetChild(lastIndex).GetComponent<RectTransform>().anchoredPosition;
  11. }

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

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

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

  1. void Update()
  2. {
  3. if (transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition.y < firstPosition.y)
  4. {
  5. Transform changeT = transform.GetChild(transform.childCount - 1);
  6. changeT.localPosition = transform.GetChild(0).localPosition + new Vector3(0, d, 0);
  7. changeT.SetSiblingIndex(0);
  8. }
  9. else if (transform.GetChild(transform.childCount - 1).GetComponent<RectTransform>().anchoredPosition.y > lastPosition.y)
  10. {
  11. Transform changeT = transform.GetChild(0);
  12. changeT.localPosition = transform.GetChild(transform.childCount - 1).localPosition - new Vector3(0, d, 0);
  13. changeT.SetSiblingIndex(transform.childCount - 1);
  14. }
  15. }

4.全部代码

  1. public enum Dir
  2. {
  3. Horizontal,
  4. Vertical,
  5. }
  6. public class ControlMoveItem : MonoBehaviour
  7. {
  8. public Dir dir = Dir.Vertical;
  9. public bool isButtonDown = false;
  10. public int lastIndex = 5;
  11. float d;
  12. Vector3 firstPosition;
  13. Vector3 lastPosition;
  14. void Start()
  15. {
  16. if (dir == Dir.Vertical)
  17. {
  18. d = Mathf.Abs(transform.GetChild(0).localPosition.y - transform.GetChild(1).localPosition.y);
  19. }
  20. firstPosition = transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition;
  21. lastPosition = transform.GetChild(lastIndex).GetComponent<RectTransform>().anchoredPosition;
  22. }
  23. void Update()
  24. {
  25. if (dir == Dir.Vertical)
  26. {
  27. if (transform.GetChild(0).GetComponent<RectTransform>().anchoredPosition.y < firstPosition.y)
  28. {
  29. Transform changeT = transform.GetChild(transform.childCount - 1);
  30. changeT.localPosition = transform.GetChild(0).localPosition + new Vector3(0, d, 0);
  31. changeT.SetSiblingIndex(0);
  32. }
  33. else if (transform.GetChild(transform.childCount - 1).GetComponent<RectTransform>().anchoredPosition.y > lastPosition.y)
  34. {
  35. Transform changeT = transform.GetChild(0);
  36. changeT.localPosition = transform.GetChild(transform.childCount - 1).localPosition - new Vector3(0, d, 0);
  37. changeT.SetSiblingIndex(transform.childCount - 1);
  38. }
  39. }
  40. }
  41. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/606870
推荐阅读
相关标签
  

闽ICP备14008679号