UGUI 可循环展示的图集(列表)

自动循环滚动,图片尺寸自适应
节点结构如下
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ScrollView脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class ScrollViewScript : MonoBehaviour
{
    public Transform Content;
    public List<Transform> Ctts = new List<Transform>();

    public float MaxTime_ChangeImage;
    public float time;

    public Transform ReferencePoint;

    //public SerialNumber serial;

    [SerializeField]
    private int index;
    public int Index
    {
        get { return index; }
        set {
            if (value>= Content.childCount)
            {
                //print("value>= Content.childCount");
                value = 0;
            }            
            index = value;
            ChangeImage(index);                       
        }
    }
    private void Awake()
    {
        Content = transform.Find("Viewport/Content");
        ReferencePoint = transform.Find("ReferencePoint");
        //serial = transform.parent.Find("SerialNumber").GetComponent<SerialNumber>();
        ResetTime();
        InitCttSelfIndex();
    }
    private void OnEnable()
    {
        ResetAll();
    }


    private void Start()
    {      
        MaxTime_ChangeImage = Page0Script.Instance.MaxTime_C;
        ResetTime();
        print(Page0Script.Instance.MaxTime_C);
    }

    public void InitCttSelfIndex()
    {
        foreach (Transform ctt in Content)
        {
            Ctts.Add(ctt);
        }
    }  

    void FixedUpdate()
    {
        if (time > 0)
        {
            time -= Time.deltaTime;
        }
        else
        {
            //切换画面
            Index++;
            ResetTime();
        }
    }

    public void ResetTime()
    {
        time = MaxTime_ChangeImage;
    }

    //初始化
    private void ResetAll()
    {
        //计数器计时器图片定位
        index = 0;
        ResetTime();
        StartCoroutine(ResetIndex002());
    }

    //图片切换
    public void ChangeImage(int i)
    {
        StartCoroutine(ResetIndex(0.2f));       
    }


    /// <summary>
    /// 1.把子物体列表中的第一个移至末尾 2.同时当前显示图片会前移一个单位我们需要让content闪现把画面复原 3.然后再进行向左移动的操作
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    IEnumerator ResetIndex(float t)
    {
        if (Ctts[index].GetSiblingIndex() == Ctts.Count-1)
        {
            //闪现距离
            float D_idx3 = ReferencePoint.position.x - Content.GetChild(Content.childCount-3).position.x;
            //刷新顺序
            Content.GetChild(0).SetSiblingIndex(Ctts.Count - 1);
            //闪现
            float TPx = Content.position.x + D_idx3;
            Content.position = new Vector3(TPx, Content.position.y, Content.position.z);
        }
        yield return new WaitForEndOfFrame();
        //用索引找对应的图片,计算距离并位移
        float d = ReferencePoint.position.x - Ctts[index].position.x;
        float TragetPoint = Content.position.x + d;
        Content.DOMoveX(TragetPoint, t);
    }

    //初始化专用
    IEnumerator ResetIndex002()
    {
        if (Ctts[index].GetSiblingIndex() == Ctts.Count - 1)
        {
            //闪现距离
            float D_idx3 = ReferencePoint.position.x - Content.GetChild(1).position.x;
            //刷新顺序
            Content.GetChild(0).SetSiblingIndex( Ctts.Count - 1);
            //闪现
            float TPx = Content.position.x + D_idx3;            
            Content.position = new Vector3(TPx, Content.position.y, Content.position.z);
        }
        yield return new WaitForEndOfFrame();
        //用索引找对应的图片,计算距离并位移
        float d = ReferencePoint.position.x - Ctts[index].position.x;
        float TragetPoint = Content.position.x + d;
        Content.DOMoveX(TragetPoint, 0F);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

Ctt脚本
public class CttScript : MonoBehaviour
    public int SelfIndex;

MTexture脚本

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

/// <summary>
/// 图片参考父物体大小等比例缩放
/// </summary>
public class X_RectAutoSize : MonoBehaviour
{
    //原始尺寸
    private Vector2 olSize;
    //缩放后的尺寸
    private Vector2 size;
    //原始尺寸宽高比
    private float al;
    private RectTransform self;

    //是否锁定位置
    public bool lockPos = true;
    
    internal float ReferHeight;
    internal float ReferWidth;

    //父物体尺寸
    private Vector2 parentSize;

    //边框厚度
    public float FrameThickness;

    void Update()
    {
        SetWidthHight();
    }

    //设置宽高
    public void SetWidthHight()
    {
        self = GetComponent<RectTransform>();       
        //父物体尺寸
        parentSize = self.parent.GetComponent<RectTransform>().rect.size;
        ReferHeight = parentSize.y - FrameThickness;
        ReferWidth = parentSize.x - FrameThickness;
        self.GetComponent<Image>().SetNativeSize();
        olSize = self.sizeDelta;
        al = olSize.x / olSize.y;

        //决定以宽或高为标准
        if (olSize.x < olSize.y)
            size = new Vector2(ReferHeight * al, ReferHeight);
        else
            size = new Vector2(ReferWidth, ReferWidth / al);

        self.sizeDelta = size;

        if (lockPos)
            self.anchoredPosition = Vector2.zero;
    }
}

生成图片元素方式

 //生成图片,并适应大小
    public void InsImage(Sprite sprite)
    {
        GameObject TextureBG = Instantiate(Ctt_prefab, TragetParent.transform);
        GameObject MTexture = Instantiate(Texture_Prefab, TextureBG.transform);
        MTexture.GetComponent<Image>().sprite = sprite;
        MTexture.GetComponent<X_RectAutoSize>().SetWidthHight();
    }
posted @   哒哒哒~~~  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示