网站建设需要学些什么,动漫制作专业学校前十名,东莞市住房和城乡建设网官网,wordpress禁用自定义最近在做一个ui循环滚动的功能#xff0c;网上找了半天脚本感觉都和我实际需求不太符合#xff0c;自己花费一些时间完成了这个功能记录一下。下面开始正题 #xff0c;我是采用unity自带组件Scroll View来完成#xff0c;首先设置Scroll View如下图 面板层级结构如下 然…最近在做一个ui循环滚动的功能网上找了半天脚本感觉都和我实际需求不太符合自己花费一些时间完成了这个功能记录一下。下面开始正题 我是采用unity自带组件Scroll View来完成首先设置Scroll View如下图 面板层级结构如下 然后创建一个预制体预制体需要锚点到左侧中心点设置为起始点设置完成后把这个图片随便放个层级不要在本层级不要影响后面生成。 然后开始编写代码我就直接贴了不懂可以看一下注释因为我是水平所以判断用的都是x轴如果你是垂直你改成y稍微修改一下代码就可以了差别应该不大。
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class LoopScroll : MonoBehaviour,IBeginDragHandler
{public ListSprite photographList;[Header(中心点)]public Transform Centre;private Vector3 startPos, endPos;[Header(预制体)]public GameObject item;[Header(预制体父级)]public Transform Content;[HideInInspector]public ListTransform itemList;bool isDrag false, isAdsorption;float MaxDis, MinDis;[Header(间隔距离)]public float SpacingDistance 100;[Header(缩放倍数)]public float Scale 1;Transform tempCentre; public Text tempCentreName;private void Awake(){instantiationItem();}void Start(){ isDrag true;//设置第一个坐标与最后一个坐标位置startPos itemList[0].position;endPos itemList[itemList.Count - 1].position;startPos.x - itemList[0].GetComponentRectTransform().rect.width /2;endPos.x itemList[0].GetComponentRectTransform().rect.width / 2;//求出最远距离for (int i 0; i itemList.Count; i){var dis Vector3.Distance(itemList[i].position, Centre.position);if (dis MaxDis){MaxDis dis;MinDis dis;}}}void instantiationItem()//生成预制体设置初始坐标{for (int i 0; i photographList.Count; i){var t Instantiate(item, Content);t.GetComponentImage().sprite photographList[i];t.name photographList[i].name;var pos new Vector3((t.GetComponentRectTransform().rect.width SpacingDistance) * (i), 0, 0);pos.x t.GetComponentRectTransform().rect.width;t.GetComponentRectTransform().anchoredPosition pos;itemList.Add(t.transform);}}void Islimit() //设置坐标切换与列表内元素与面板层级切换 保证层级与列表内数据同步{if (isDrag){for (int i 0; i itemList.Count; i){if (itemList[i].position.x startPos.x){itemList[i].position itemList[itemList.Count - 1].position new Vector3(SpacingDistance itemList[0].GetComponentRectTransform().rect.width, 0, 0);var temp itemList[i];itemList.Remove(itemList[i]);itemList.Add(temp);temp.SetSiblingIndex(itemList.Count - 1);}if (itemList[i].position.x endPos.x){itemList[i].position itemList[0].position - new Vector3(SpacingDistance itemList[0].GetComponentRectTransform().rect.width, 0, 0);var temp itemList[i];itemList.Remove(itemList[i]);itemList.Insert(0, temp);temp.SetSiblingIndex(0);}}}}void ScaleDistance()//根据百分比设置缩放动画{for (int i 0; i itemList.Count; i){double dis Vector3.Distance(itemList[i].position, Centre.position) / MaxDis;if (!double.IsInfinity(dis)){if (dis 0){if (dis0.05f){itemList[i].localScale Vector3.one * ((1f - (float)dis) * Scale) ;}else{itemList[i].localScale Vector3.one * ((1f - (float)dis) * Scale) * 0.8f;}}}} }Tween tw;void Adsorption() //停止滑动进行吸附{for (int i 0; i itemList.Count; i)//找出距离中心点最近的{float dis Vector3.Distance(itemList[i].position, Centre.position);if (dis MinDis){tempCentre itemList[i];tempCentreName.text itemList[i].name;}MinDis dis;}if (GetComponentScrollRect().velocity.x0 isAdsorption false)//判断当前滑动结束{//计算当前距离中心差多远后 进行吸附if (tempCentre){var dis Centre.position - tempCentre.position;tw Content.DOMoveX(Content.position.x dis.x, 0.5f);tempCentre null;isAdsorption true;}else{isAdsorption false;}}else if (GetComponentScrollRect().velocity.x!0)//如果在吸附过程中点击拖拽强制结束吸附动画{isAdsorption false;tw.Kill();}}// Update is called once per frame void Update(){Islimit();ScaleDistance();Adsorption();}public void OnBeginDrag(PointerEventData eventData){tw.Kill();}
}
下面这个是脚本设置主要关注的就是公开的变量我都有注释结合上面的面板图很轻易就能看出来第一个就是循环图片间隔距离是两个图片之间的距离缩放倍数是中间最大是多少倍根据你工程设置默认设置1就可以了最后面的text是显示居中ui的名字名字的设置是根据图片名称来的。 运行后这三个内容层级都会同步可以进行一些你想要的操作
最后说下使用了Dotween插件吸附居中功能我是感觉有点延迟但是还没找到更好的方法如果大家有更好的方法欢迎大佬留言完成上面的设置就可以畅快玩耍了~~