unity 可滚动文本_Unity 循环滚动
using UnityEngine;using UnityEngine.Events;using UnityEngine.EventSystems;using UnityEngine.UI;namespace Assets._Scripts.UI{public class Roll : MonoBehaviour, IDragHandler, IEndDragHandler, IPointerCl
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);
}
}
}
}
}
更多推荐


所有评论(0)