服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity UI实现循环播放序列图

Unity UI实现循环播放序列图

2022-11-29 12:05PangCoder C#

这篇文章主要为大家详细介绍了Unity UI实现循环播放序列图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、思路

1.获取播放组件

一般我们使用UI的Raw Image或者Image来显示图片

Image:仅支持Sprite类型图片,需要更改图片的格式(注意:在StreamingAssets文件夹里的图片是更改不了类型的,在这里必须放在Assets/Resources路径下

Unity UI实现循环播放序列图

Raw Image:支持图片的原格式,一般我们将其转换成 Texture2D使用

2.加载图片

Resources提供了一个Load方法,可以从Resources文件夹里加载图片。

!!!!!注意一定要在Resources路径下,否则找不到

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

3.循环加载

记录当前到哪一张,判断是不是到了最后一张,是,加载第一张

二、示例代码

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("有效数字的位数(代表排序的有效数字位数)")]
        public int SignificantDigits;
 
        [Header("开始数(开始的数)")]
        public int Start;
 
        [Header("总数(一共多少张图片)")]
        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 = "请填写文件夹路径";
 
    [Header("命名规则(序列图的命名规则)")]
    public NameRules Rules;
 
    [Header("FPS(一秒内显示多少张图片)")]
    public int FramesPerSecond = 24;
 
    [Header("循环播放(默认开启)")]
    public bool Loop=true;
 
    [Header("UI可用时自动播放(默认开启)")]
    public bool PlayOnWake=true;
 
 
 
 
    /// <summary>
    /// 私有变量
    /// </summary>
    /// /// 显示图片的UI控件
    private Image ImageComponent = null;
    private RawImage RawImgComponent = null;
 
    
    private int currentFrames;//当前播放的图片帧数
    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()
    {
        /这个是重点,显示不出来图片的话,大概率问题在这个函数
        string formatStr = "{0:D" + Rules.SignificantDigits + "}";//保留有效数字,不够前面加0
        string imageName = ModeName + "/" + Rules.BaseName + string.Format(formatStr, currentFrames);
        return LoadSprite(imageName);
    }
 
    private Texture2D GetCurrentTexture2D()
    {
        /这个是重点,显示不出来图片的话,大概率问题在这个函数
        string formatStr = "{0:D"+ Rules .SignificantDigits+ "}";//保留有效数字,不够前面加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
    }
}

Unity UI实现循环播放序列图

Unity UI实现循环播放序列图Unity UI实现循环播放序列图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_36251561/article/details/119426503

延伸 · 阅读

精彩推荐
  • C#C#中的Task.Delay()和Thread.Sleep()区别(代码案例)

    C#中的Task.Delay()和Thread.Sleep()区别(代码案例)

    Task.Delay(),async/await和CancellationTokenSource组合起来使用可以实现可控制的异步延迟。本文通过多种代码案例给大家分析C#中的Task.Delay()和Thread.Sleep()知识,感...

    農碼一生3902022-11-22
  • C#对C# 多态的理解

    对C# 多态的理解

    这篇文章主要介绍了对C# 多态的理解,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    打游戏也要有梦想10982022-10-08
  • C#C# 正则表达式进阶

    C# 正则表达式进阶

    这篇文章主要介绍了C# 正则表达式进阶,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...

    丹枫无迹8052022-08-27
  • C#C#实现任务栏通知窗口

    C#实现任务栏通知窗口

    作为程序员在享受的同时我们也不禁要问:这到底是怎么实现的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架绘图技术来实现这种任务栏通知窗口。...

    C#教程网10952021-10-29
  • C#C# Winform 实现TCP发消息

    C# Winform 实现TCP发消息

    这篇文章主要介绍了C# Winform 实现TCP发消息的示例,帮助大家更好的理解和学习使用c#技术,感兴趣的朋友可以了解下...

    小草上飞飞3402022-11-08
  • C#C#获取每个年,月,周的起始日期和结束日期的方法

    C#获取每个年,月,周的起始日期和结束日期的方法

    这篇文章主要介绍了C#获取每个年,月,周的起始日期和结束日期的方法,涉及C#时间与日期基本操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    蓝之风3952021-12-27
  • C#Unity实现攻击范围检测并绘制检测区域

    Unity实现攻击范围检测并绘制检测区域

    这篇文章主要介绍了Unity实现攻击范围检测并绘制检测区域,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    画个小圆儿7962022-09-05
  • C#C#实现的上传图片、保存图片、加水印、生成缩略图功能示例

    C#实现的上传图片、保存图片、加水印、生成缩略图功能示例

    这篇文章主要介绍了C#实现的上传图片、保存图片、加水印、生成缩略图功能,结合实例形式较为详细的分析了C#图片上传、保存、水印、缩略图等相关操作...

    changuncle10712022-03-10