UGUI案例篇——使用2D图片制作3D轮转图

最后的两个代码段为最终代码,可直接使用(需导入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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值