using UnityEngine;

using UnityEngine.Events;

using UnityEngine.EventSystems;

using UnityEngine.UI;

namespace Assets._Scripts.UI

{

public class Roll : MonoBehaviour, IDragHandler, IEndDragHandler, IPointerClickHandler

{

public float moveTime = 0.2f;

private RectTransform curSelectItem;

private float center = 700f, interval = 300f;

private bool autoMove;

private float moveSpeed = 5f, curMoveTime;

public event UnityAction OnSelect;

public event UnityAction OnMove;

void Start()

{

Application.targetFrameRate = 60;

Input.multiTouchEnabled = false;

center = GetComponent().sizeDelta.x / 2f;

interval = transform.GetChild(1).GetComponent().anchoredPosition.x - transform.GetChild(0).GetComponent().anchoredPosition.x;

curSelectItem = null;

for (var i = 0; i < transform.childCount; i++)

{

var rectTransform = transform.GetChild(i).GetComponent();

var value = GetResult(rectTransform.anchoredPosition.x / center);

rectTransform.localScale = new Vector2(value, value);

rectTransform.GetComponent().color = new Color(1, 1, 1, value);

}

}

void IPointerClickHandler.OnPointerClick(PointerEventData eventData)

{

var click = eventData.pointerPressRaycast.gameObject.GetComponent();

if (click.IsChildOf(transform) && click != transform && click != curSelectItem)

{

AutoMoveSelectToCenter(click);

}

}

void IDragHandler.OnDrag(PointerEventData eventData)

{

if (autoMove) return;

Move(eventData.delta.y); // 横向滚动改为 x

}

void IEndDragHandler.OnEndDrag(PointerEventData eventData)

{

var centerItem = transform.GetChild(2).GetComponent(); // getchild 中间位

AutoMoveSelectToCenter(centerItem);

}

private void Move(float moveDis)

{

for (var i = 0; i < transform.childCount; i++)

{

var rectTransform = transform.GetChild(i).GetComponent();

var curPos = rectTransform.anchoredPosition;

rectTransform.anchoredPosition = new Vector2(curPos.x += moveDis, curPos.y);

var value = GetResult(rectTransform.anchoredPosition.x / center);

rectTransform.localScale = new Vector2(value, value);

rectTransform.GetComponent().color = new Color(1, 1, 1, value);

}

if (moveDis > 0)

{

if (transform.GetChild(transform.childCount - 1).GetComponent().localScale.x <= 0)

{

transform.GetChild(transform.childCount - 1).GetComponent().anchoredPosition = transform.GetChild(0).GetComponent().anchoredPosition - new Vector2(interval, 0);

transform.GetChild(transform.childCount - 1).SetAsFirstSibling();

}

}

else if (moveDis < 0)

{

if (transform.GetChild(0).GetComponent().localScale.x <= 0)

{

transform.GetChild(0).GetComponent().anchoredPosition = transform.GetChild(transform.childCount - 1).GetComponent().anchoredPosition + new Vector2(interval, 0);

transform.GetChild(0).SetAsLastSibling();

}

}

OnMove?.Invoke();

}

private static float GetResult(float x)

{

return -Mathf.Pow(x, 2) + 2 * x;

}

private void AutoMoveSelectToCenter(RectTransform rectTransform)

{

if (!Equals(curSelectItem, rectTransform))

{

curSelectItem = rectTransform;

}

if (curSelectItem.anchoredPosition.x != center)

{

var dis = center - curSelectItem.anchoredPosition.x;

moveSpeed = dis / moveTime;

curMoveTime = 0;

autoMove = true;

}

else

{

OnSelect?.Invoke(curSelectItem);

}

}

void Update()

{

if (autoMove)

{

curMoveTime += Time.deltaTime;

Move(moveSpeed * Time.deltaTime);

if (curMoveTime >= moveTime)

{

var offest = center - curSelectItem.anchoredPosition.x;

Move(offest);

autoMove = false;

OnSelect?.Invoke(curSelectItem);

}

}

}

}

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐