上一篇是实现了按钮可拖拽并自动吸附在屏幕两侧,接着呈半圆分布。之前是道具按钮比较少的情况,道具按钮一多,屏幕空间又局促的情况下,按钮就要适当隐藏了,所以做成一个可以滑动的列表。滑动的轨迹是一个圆形。这个需求还挺有意思的,记录一下代码:
using DG.Tweening;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
namespace ArrowLegend
{
/// <summary>
/// 按钮自动吸附和呈半圆分布
/// </summary>
public class AutoAdsorptiontoEdge : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private RectTransform rectTransform;
public RectTransform SlidingZone;//旋转滑动区域
public RectTransform Mask;//遮罩区域
public RectTransform RightMask;//右遮罩区域
public RectTransform LeftMask;//左遮罩区域
//public RectTransform RightSlidingZone;//右滑动区域
//public RectTransform LeftSlidingZone;//左滑动区域
private CircleSliding circleSliding;
private Button[] propButtons;
private Button CenterBtn;
private bool isRight;
private float LeftAdsorptiontoX;//吸附到的位置,根据屏幕判断
private float RightAdsorptiontoX;
private float UpAdsorptiontoY;//上下位置判断,防止出现按钮到屏幕外的情况
private float DownAdsorptionY;
//private List<Button> currentPropBtnList = new List<Button> ();//当前正在展示的按钮
private int showNum = 4;//展示个数
void Start()
{
rectTransform = GetComponent<RectTransform>();
circleSliding = SlidingZone.GetComponent<CircleSliding>();
propButtons = circleSliding.PropBtns;
CenterBtn = circleSliding.CenterPos.GetComponent<Button>();
}
public void OnBeginDrag(PointerEventData data)
{
if (!new Rect(0, 0, Screen.width, Screen.height).Contains(Input.mousePosition)) return;
for (int i = 0; i < propButtons.Length; i++)
{
propButtons[i].gameObject.SetActive(false);
}
Vector3 leftPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, new Vector2(Screen.width/15f, Screen.height/15f), data.enterEventCamera, out leftPos);
LeftAdsorptiontoX = leftPos.x;
DownAdsorptionY = leftPos.y;
Vector3 rightPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, new Vector2(Screen.width/15f*14, Screen.height/15f*14), data.enterEventCamera, out rightPos);
RightAdsorptiontoX = rightPos.x;
UpAdsorptiontoY = rightPos.y;
}
public void OnDrag(PointerEventData data)
{
Vector3 pos;
//限定在屏幕内操作
if (!new Rect(0, 0, Screen.width, Screen.height).Contains(Input.mousePosition)) return;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, data.position, data.enterEventCamera, out pos))
{
rectTransform.position = pos;
//for (int i = 0; i < PropButtons.Length; i++)
//{
//