最后的两个代码段为最终代码,可直接使用(需导入DoTween)
对数据的设置(参考):
,
先创建物体模板,再创建物体
设置图片的缩放系数和X轴位置,再对其位置信息进行计算:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class RotationDiagram2D : MonoBehaviour
{
public Vector2 ItemSize; //图片大小
public Sprite[] ItemSprites;
public float Offect; //图片间距
public float ScaleTimesMin; //最大缩放系数
public float ScaleTimesMax; //最小缩放系数
private List<RotationDiagramItem> RotationDiagramItemList;
private List<ItemPosData> PosDataList;
void Start()
{
PosDataList = new List<ItemPosData>();
RotationDiagramItemList = new List<RotationDiagramItem>();
CreateItem();
CalculateData();
SetItemPosData();
}
/// <summary>
/// 创建物体模板
/// </summary>
GameObject CreateTemplate()
{
GameObject template = new GameObject();
template.AddComponent<RectTransform>();
template.AddComponent<Image>();
template.AddComponent<RotationDiagramItem>();
return template;
}
//创建UI物体,设置图片和父物体 并 将其放入RotationDiagramItemList中
void CreateItem()
{
GameObject template = CreateTemplate();
RotationDiagramItem item = null;
foreach (Sprite sprite in ItemSprites)
{
item = Instantiate(template).GetComponent<RotationDiagramItem>();
item.SetSprite(sprite);
item.SetParent(transform);
RotationDiagramItemList.Add(item);
}
Destroy(template);
}
//计算位置的方法
private void CalculateData()
{
float length = (ItemSize.x + Offect) * RotationDiagramItemList.Count; // 长度为(图片长度 + 图片间间隔) * 图片数量
float radioOffect = 1 / (float)RotationDiagramItemList.Count; // 每个图片的等距间隔
float radio = 0;
for (int i = 0; i < RotationDiagramItemList.Count; i++)
{
ItemPosData data = new ItemPosData();
data.X = GetX(radio, length);
data.ScaleTimes = GetScaleTimes(radio, ScaleTimesMax, ScaleTimesMin);
radio += radioOffect;
PosDataList.Add(data);
}
}
/// <summary>
/// 设置图片的位置数据(将第i个位置信息赋予第i个子物体)
/// </summary>
private void SetItemPosData()
{
for (int i = 0; i < RotationDiagramItemList.Count; i++)
{
RotationDiagramItemList[i].SetPos(PosDataList[i]);
}
}
/// <summary>
/// 用于获取X轴的位置
/// </summary>
/// <param name="radio">图片所在位置比例,如有三张图片,长度为1,则位置为0,0.33,0.66.</param>
/// <param name="length">length为总长度,length = (图片长度 + 图片间间隔) * 图片数量</param>
/// <returns></returns>
private float GetX(float radio, float length)
{
if (radio < 0 || radio > 1)
{
Debug.LogWarning("当前比例必须为 0 - 1 的值");
return 0;
}
else if (radio >= 0 && radio < 0.25)
{
return radio * length;
}
else if (radio >= 0.25 && radio < 0.75)
{
return (0.5f - radio) * length;
}
else
{
return (radio - 1) * length;
}
}
//获取缩放系数
public float GetScaleTimes(float radio,float max ,float min)
{
if (radio < 0 || radio > 1)
{
Debug.Log