先看效果
这里是Scroll View的设置:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Panel_MyScroll : MonoBehaviour
{
public Transform s_content;
private List<GameObject> s_card;
Vector3 endCard_pos;//最后一个的位置
Vector3 startCard_pos;//第一个的位置
float cardWidth;
float inputDown_x;
float inputUp_x;
int gap = 50;
void Start()
{
s_card = new List<GameObject>();
for (int i = 0; i < s_content.childCount; i++)
{
s_card.Add(s_content.GetChild(i).gameObject);
}
cardWidth = s_content.GetChild(0).GetComponent<RectTransform>().sizeDelta.x;
CardRot();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
inputDown_x = s_content.localPosition.x;
}
if (Input.GetMouseButtonUp(0))
{
inputUp_x = s_content.localPosition.x;
int dis =(int)( Mathf.Abs(inputDown_x - inputUp_x) / (gap + cardWidth) )+ 1;
if ((inputDown_x - inputUp_x) > 0)
{
if (Mathf.Abs(inputDown_x - inputUp_x) < cardWidth / 2)
{
s_content.localPosition = new Vector3(inputDown_x, s_content.localPosition.y, s_content.localPosition.z);
return;
}
else
{
s_content.localPosition = new Vector3(inputDown_x - (gap + cardWidth) * dis, s_content.localPosition.y, s_content.localPosition.z);
}
}
else
{
if (Mathf.Abs(inputDown_x - inputUp_x) < cardWidth / 2)
{
s_content.localPosition = new Vector3(inputDown_x, s_content.localPosition.y, s_content.localPosition.z);
return;
}
else
{
s_content.localPosition = new Vector3(inputDown_x + (gap+cardWidth)* dis, s_content.localPosition.y, s_content.localPosition.z);
}
}
CardRot();
}
//左滑超出边界
if (s_card[0].transform.position.x < 200)
{
endCard_pos = s_card[s_content.childCount - 1].transform.position;
endCard_pos.x = s_card[s_content.childCount - 1].transform.position.x + gap + cardWidth;
//更改位置
s_card[0].transform.position = endCard_pos;
//更改循序
s_card[0].transform.SetSiblingIndex(s_content.childCount);
//清除List
s_card.Clear();
//重新记录List
for (int i = 0; i < s_content.childCount; i++)
{
s_card.Add(s_content.GetChild(i).gameObject);
}
}
//右滑超出边界
if (s_card[s_content.childCount - 1].transform.position.x > 1750)
{
startCard_pos = s_card[0].transform.position;
startCard_pos.x = s_card[0].transform.position.x - gap - cardWidth;
s_card[s_content.childCount - 1].transform.position = startCard_pos;
s_card[s_content.childCount - 1].transform.SetSiblingIndex(0);
s_card.Clear();
for (int i = 0; i < s_content.childCount; i++)
{
s_card.Add(s_content.GetChild(i).gameObject);
}
}
}
//这里是一些效果的代码,不重要,可根据自己的需求修改。
void CardRot()
{
for (int i = 0; i < s_content.childCount; i++)
{
s_card.Add(s_content.GetChild(i).gameObject);
if (s_content.GetChild(i).transform.position.x < 960)
{
s_content.GetChild(i).transform.position = new Vector3(s_content.GetChild(i).transform.position.x,
588,
s_content.GetChild(i).transform.position.z
);
s_content.GetChild(i).GetComponent<Image>().color = new Color32(255, 255, 255, 100);
s_content.GetChild(i).transform.rotation = Quaternion.Euler(new Vector3(-8, 50, 0));
}
else if (s_content.GetChild(i).transform.position.x > 960)
{
s_content.GetChild(i).transform.position = new Vector3(s_content.GetChild(i).transform.position.x,
588,
s_content.GetChild(i).transform.position.z
);
s_content.GetChild(i).GetComponent<Image>().color = new Color32(255, 255, 255, 100);
s_content.GetChild(i).transform.rotation = Quaternion.Euler(new Vector3(8, 50, 0));
}
else
{
s_content.GetChild(i).transform.position = new Vector3(s_content.GetChild(i).transform.position.x,
548f,
s_content.GetChild(i).transform.position.z
);
s_content.GetChild(i).GetComponent<Image>().color = new Color32(255, 255, 255, 255);
s_content.GetChild(i).transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
}
}
}
}