欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity UI實現(xiàn)循環(huán)播放序列圖

 更新時間:2021年08月08日 10:05:12   作者:PangCoder  
這篇文章主要為大家詳細介紹了Unity UI實現(xiàn)循環(huán)播放序列圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、思路

1.獲取播放組件

一般我們使用UI的Raw Image或者Image來顯示圖片

Image:僅支持Sprite類型圖片,需要更改圖片的格式(注意:在StreamingAssets文件夾里的圖片是更改不了類型的,在這里必須放在Assets/Resources路徑下

Raw Image:支持圖片的原格式,一般我們將其轉換成 Texture2D使用

2.加載圖片

Resources提供了一個Load方法,可以從Resources文件夾里加載圖片。

!?。。。∽⒁庖欢ㄒ赗esources路徑下,否則找不到

Resources.Load(path, typeof(Texture2D)) as Texture2D;
Resources.Load(path, typeof(Sprite)) as Sprite;

3.循環(huán)加載

記錄當前到哪一張,判斷是不是到了最后一張,是,加載第一張

二、示例代碼

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
 
public class FramesController : MonoBehaviour
{
    [System.Serializable]
    public struct NameRules
    {
        [Header("基礎名稱(基礎名字就是序列圖名稱中絕對相同的)")]
        public string BaseName;
 
        [Header("有效數(shù)字的位數(shù)(代表排序的有效數(shù)字位數(shù))")]
        public int SignificantDigits;
 
        [Header("開始數(shù)(開始的數(shù))")]
        public int Start;
 
        [Header("總數(shù)(一共多少張圖片)")]
        public int Count;
 
        public NameRules(string _name,int _digits,int _start,int _count)
        {
            BaseName = _name;
            SignificantDigits = _digits;
            Start = _start;
            Count = _count;
        }
    }
    //圖片類型
    public enum WidgetType
    {
        Image,
        RawImage
    }
    /// 
    [Header("圖片顯示控件(RawImage[支持原始圖片類型] OR Image[僅支持Sprite圖片])")]
    public WidgetType ImgWidget = WidgetType.RawImage;
 
    //要求文件夾必須在Assets/Resources文件夾里面,ModeName填寫后面到文件夾的路徑
    [Header("模式名稱(和文件夾名稱相同,路徑必須在Resources里面)")]
    public string ModeName = "請?zhí)顚懳募A路徑";
 
    [Header("命名規(guī)則(序列圖的命名規(guī)則)")]
    public NameRules Rules;
 
    [Header("FPS(一秒內顯示多少張圖片)")]
    public int FramesPerSecond = 24;
 
    [Header("循環(huán)播放(默認開啟)")]
    public bool Loop=true;
 
    [Header("UI可用時自動播放(默認開啟)")]
    public bool PlayOnWake=true;
 
 
 
 
    /// <summary>
    /// 私有變量
    /// </summary>
    /// /// 顯示圖片的UI控件
    private Image ImageComponent = null;
    private RawImage RawImgComponent = null;
 
    
    private int currentFrames;//當前播放的圖片幀數(shù)
    private float showTime = 0.0f;
    private float rateTime = 0.0f;
 
    private bool Playing;
 
    // Start is called before the first frame update
    void Start()
    {
        InitWidget();
    }
    // Update is called once per frame
    void Update()
    {
        if (!Playing) return;
        showTime += Time.deltaTime;
        if (showTime >= rateTime)
        {
            showTime = 0;
            currentFrames++;
            if (currentFrames >= Rules.Count)
            {
                if(Loop)
                {
                    currentFrames = Rules.Start;
                }else
                {
                    Playing = false;
                }
            }
            if(ImgWidget == WidgetType.Image)
            {
                ImageComponent.sprite = GetCurrentSprite();
            }
            else
            {
                RawImgComponent.texture = GetCurrentTexture2D();
            }
        }
    }
 
    /// /更換播放的序列圖
    public void ChangeMode(string _mode, NameRules _rules, int _fps=24)
    {
        ModeName = _mode;
        Rules=_rules;
        FramesPerSecond = _fps;
 
        currentFrames = Rules.Start;
        rateTime = 1.0f / FramesPerSecond;
        if (ImgWidget == WidgetType.Image)
        {
            ImageComponent.sprite = GetCurrentSprite();
        }
        else
        {
            RawImgComponent.texture = GetCurrentTexture2D();
        }
    }
    //開始播放
    public void Play(bool needLoop=true)
    {
        Playing = true;
        Loop = needLoop;
    }
    //停止播放
    public void Stop()
    {
        Playing = false;
    }
 
    private Sprite GetCurrentSprite()
    {
        /這個是重點,顯示不出來圖片的話,大概率問題在這個函數(shù)
        string formatStr = "{0:D" + Rules.SignificantDigits + "}";//保留有效數(shù)字,不夠前面加0
        string imageName = ModeName + "/" + Rules.BaseName + string.Format(formatStr, currentFrames);
        return LoadSprite(imageName);
    }
 
    private Texture2D GetCurrentTexture2D()
    {
        /這個是重點,顯示不出來圖片的話,大概率問題在這個函數(shù)
        string formatStr = "{0:D"+ Rules .SignificantDigits+ "}";//保留有效數(shù)字,不夠前面加0
        string imageName = ModeName+"/"+Rules.BaseName + string.Format(formatStr, currentFrames);
        return LoadTexture2D(imageName);
    }
 
    private Texture2D LoadTexture2D(string path)
    {
        return Resources.Load(path, typeof(Texture2D)) as Texture2D;
    }
 
    private Sprite LoadSprite(string path)
    {
        return Resources.Load(path, typeof(Sprite)) as Sprite;
    }
    /// <summary>
    /// 初始化圖片顯示組件
    /// </summary>
    private void InitWidget()
    {
        if(ImgWidget== WidgetType.Image)
        {
            ImageComponent = transform.gameObject.GetComponent<Image>();
            if(ImageComponent==null)
            {
                EditorBox("此組件上沒有找到<Image>!請檢查后重試!");
                EditorStop();
            }
        }
        else
        {
            RawImgComponent = transform.gameObject.GetComponent<RawImage>();
            if (RawImgComponent == null)
            {
                EditorBox("此組件上沒有找到<RawImage>!請檢查后重試!");
                EditorStop();
            }
        }
        Playing = PlayOnWake;
        currentFrames = Rules.Start;
        rateTime = 1.0f / FramesPerSecond;
        if (ImgWidget == WidgetType.Image)
        {
            ImageComponent.sprite = GetCurrentSprite();
        }
        else
        {
            RawImgComponent.texture = GetCurrentTexture2D();
        }
    }
 
    /// <summary>
    /// Unity編輯器的MessageBox
    /// </summary>
    private void EditorBox(string msg)
    {
#if UNITY_EDITOR
        EditorUtility.DisplayDialog("FramesController", msg, "確認", "取消");
#endif
    }
    /// <summary>
    /// Unity編輯器停止當前正在運行的程序
    /// </summary>
    private void EditorStop()
    {
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#endif
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 深入談談C#9新特性的實際運用

    深入談談C#9新特性的實際運用

    這篇文章主要給大家介紹了C#9新特性的實際運用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 基于WPF實現(xiàn)彈幕效果的示例代碼

    基于WPF實現(xiàn)彈幕效果的示例代碼

    這篇文章主要為大家詳細介紹了如何利用WPF實現(xiàn)彈幕效果,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-09-09
  • C/C++ 傳遞動態(tài)內存的深入理解

    C/C++ 傳遞動態(tài)內存的深入理解

    本篇文章是對C/C++中的傳遞動態(tài)內存進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 在C#中 webbrowser的使用心得

    在C#中 webbrowser的使用心得

    最近用webbrowser做了個東西,期間有點小曲折,而且網(wǎng)上的解決方法也基本都是淺嘗輒止,特此在這里發(fā)一下同大家分享。

    2013-04-04
  • 完美解決c# distinct不好用的問題

    完美解決c# distinct不好用的問題

    這篇文章主要介紹了完美解決c# distinct不好用的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#結構體特性實例分析

    C#結構體特性實例分析

    這篇文章主要介紹了C#結構體特性,以實例形式較為詳細的分析了C#結構體的功能、定義及相關特性,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C#編程實現(xiàn)四舍五入、向上及下取整的方法

    C#編程實現(xiàn)四舍五入、向上及下取整的方法

    這篇文章主要介紹了C#編程實現(xiàn)四舍五入、向上及下取整的方法,涉及C#數(shù)學運算的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • 解析C#中委托的同步調用與異步調用(實例詳解)

    解析C#中委托的同步調用與異步調用(實例詳解)

    本篇文章是對C#中委托的同步調用與異步調用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C# 反射與 Quartz 實現(xiàn)流程處理詳情

    C# 反射與 Quartz 實現(xiàn)流程處理詳情

    根據(jù)要實現(xiàn)流程處理,比如用戶可以定義一個定時任務,每周一查看報表。任務是用Quartz可實現(xiàn),但用戶自己選擇報表就比較麻煩,這時因為系統(tǒng)的不同模塊的生成報表的函數(shù)不同,這時便可以傳入一個方法名和方法的輸入?yún)?shù),就可以調用該方法。下面小編我為大家介紹具體過程
    2021-09-09
  • C#的靜態(tài)工廠方法與構造函數(shù)相比有哪些優(yōu)缺點

    C#的靜態(tài)工廠方法與構造函數(shù)相比有哪些優(yōu)缺點

    這篇文章主要介紹了C#的靜態(tài)工廠方法與構造函數(shù)對比的優(yōu)缺點,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論