【Unity】手写图片轮播

news2024/11/19 9:27:11

最近项目空闲,回顾了一下之前写的杂七杂八的软件,比较多,而且比较杂乱,代码能看明白,但是非常不科学,不符合逻辑,然后我就有点无奈,虽说是做了很多年的老程序的,但是遇到现在公司的这种小软件,基本都是硬写,没有什么框架,没有什么标准,写出来能实现功能就行。

然后就是复盘一下自己写的一些小杂货,看看有没有什么可以积累的内容,忽然发现有一个东西可以积累下来,就是手写的图片轮播模块。

有两个版本的,一个是Resources下加载的,一个是StreamingAssets下加载的,但是感觉大差不差。

先是Resources加载的:

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

public class PicChange : MonoSingleton<PicChange>
{
    public Button lastBtn;
    public Button nextBtn;

    public RawImage picImg;

    public Text picName;

    //先获取加载所有图片路径  然后点击哪个按钮进入哪一组图片内

    void Start()
    {
        Debug.Log("Start:"+ index);
        lastBtn.onClick.AddListener(lastPic);
        nextBtn.onClick.AddListener(nextPic);
    }

    Texture2D[] sprites;
    /// <summary>
    /// 确定是哪组图片在进行切换
    /// </summary>
    /// <param name="index"></param>
    public void SetPath(string endPath)
    {
        sprites = Resources.LoadAll<Texture2D>(endPath);

        InitPic(0);
    }

    int index = 0;
    /// <summary>
    /// 初始化切换图片模块
    /// </summary>
    /// <param name="index"></param>
    private void InitPic(int index=0)
    {
        try
        {
            Texture2D pic = sprites[index];

            //Debug.Log(index);
            //Debug.Log(pic);

            picImg.texture = pic;

            picImg.SetNativeSize();

            picName.text = sprites[index].name;
        }
        catch (Exception o)
        {
            Debug.Log("异常信息"+o.Message);
        }  
    }

    /// <summary>
    /// 上一张图片
    /// </summary>
    private void lastPic() //0 1 2 3 4 5
    {
        index = index-- <= 0 ? sprites.Length - 1 : index--; //如果index--小于0 则sprites.Length - 1为长度 否则为index--
        Debug.Log(index);
        InitPic(index);
    }

    /// <summary>
    /// 下一张图片
    /// </summary>
    private void nextPic()
    {
        index = index++ >= sprites.Length - 1 ? 0 : index++; //如果index++大于长度 则index为0 否则为index++
        Debug.Log(index);
        InitPic(index);
    }
}

接下来就是StreamingAssets下加载的,这个也是翻看了一些大佬的博客借鉴了一下:

using System.Collections.Generic;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System;
using System.IO;

/// <summary>
/// 基于streamingAssets文件夹下图片动态切换及加载.
/// </summary>
public class PicChangeStreamingAssets : MonoSingleton<PicChange>
{
    public Button lastBtn;
    public Button nextBtn;

    public RawImage picImg;

    public Text picName;

    //先获取加载所有图片路径  然后点击哪个按钮进入哪一组图片内

    void Start()
    {
        lastBtn.onClick.AddListener(lastPic);
        nextBtn.onClick.AddListener(nextPic);
        //SetPath("1"); //获取图片地址
    }

    /// <summary>
    /// 确定是哪组图片在进行切换
    /// </summary>
    /// <param name="index"></param>
    public void SetPath(string endPath)
    {
        Load(endPath);
        InitPic();
    }

    // 储存获取到的图片  
    List<Texture2D> allTex2d ;
    #region  图片加载模块
    /// <summary>
    /// 读取StremingAssets文件夹指定的文件夹目录下的所有图片进行加载
    /// </summary>
    /// <param name="path"> StremingAssets文件夹下的文件夹名字 </param>
    void Load(string path)
    {
        allTex2d = new List<Texture2D>();
        List<string> filePaths = new List<string>();
        string[] dirs = null;
        string imgtype = "*.BMP|*.JPG|*.GIF|*.PNG";
        string[] ImageType = imgtype.Split('|');
        for (int i = 0; i < ImageType.Length; i++)
        {
            //获取Application.dataPath文件夹下所有的图片路径  
            dirs = Directory.GetFiles((Application.streamingAssetsPath + "/" + path), ImageType[i]);
            for (int j = 0; j < dirs.Length; j++)
            {
                filePaths.Add(dirs[j]);
            }
        }

        Debug.Log("图片数量:" + dirs.Length);

        for (int i = 0; i < filePaths.Count; i++)
        {
            Texture2D tx = new Texture2D(187, 287);
            tx.LoadImage(GetImageByte(filePaths[i]));
            ///获取图片名字,并去除.png 后缀
            tx.name = filePaths[i].Substring(filePaths[i].LastIndexOf(@"\") + 1, filePaths[i].LastIndexOf('.') - filePaths[i].LastIndexOf('\\') - 1);
            allTex2d.Add(tx);
            Debug.Log("Texture2D Name:" + tx.name + ".png");
        }
    }

    /// <summary>  
    /// 根据图片路径返回图片的字节流byte[]  
    /// </summary>  
    /// <param name="imagePath">图片路径</param>  
    /// <returns>返回的字节流</returns>  
    public static byte[] GetImageByte(string imagePath)
    {
        FileStream files = new FileStream(imagePath, FileMode.Open);
        byte[] imgByte = new byte[files.Length];
        files.Read(imgByte, 0, imgByte.Length);
        files.Close();
        return imgByte;
    }

    /// <summary>
    /// 将Texture2d转换为Sprite
    /// </summary>
    /// <param name="tex">参数是texture2d纹理</param>
    /// <returns></returns>
    private Sprite TextureToSprite(Texture2D tex)
    {
        Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
        return sprite;
    }
    #endregion

    #region  图片切换模块
    int index = 0;
    /// <summary>
    /// 初始化切换图片模块
    /// </summary>
    /// <param name="index"></param>
    private void InitPic(int index = 0)
    {
        try
        {
            Texture2D pic = allTex2d[index];

            Debug.Log(index);
            Debug.Log(pic);

            picImg.texture = pic;

            picImg.SetNativeSize();

            picName.text = allTex2d[index].name;
        }
        catch (Exception o)
        {
            Debug.Log("异常信息" + o.Message);
        }
    }

    /// <summary>
    /// 上一张图片
    /// </summary>
    private void lastPic()
    {
        index = index-- < 0 ? allTex2d.Count - 1 : index--; //如果index--小于0 则index为长度 否则为index--
        InitPic(index);
    }

    /// <summary>
    /// 下一张图片
    /// </summary>
    private void nextPic()
    {
        index = index++ >= allTex2d.Count - 1 ? 0 : index++; //如果index++大于长度 则index为0 否则为index++
        InitPic(index);
    }
    #endregion
}

Unity中的层级如下:

脚本直接挂在这个上面就行。

实际效果如上图,有些内容是保密的哈,打了个马赛克,大家可以自己慢慢看,如果需求强烈的话,可以私聊我要一下资源包。

这个比较简单,建议大家最好是自己diy一下,能锻炼一下手感,大佬略过哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小目标检测顶会新思路!最新成果刷爆遥感SOTA,参数小了18倍

遥感领域的小目标检测一直是个具有挑战性和趣味性的研究方向&#xff0c;同时也是顶会顶刊的常客。但不得不说&#xff0c;今年关于遥感小目标检测的研究热情尤其高涨&#xff0c;已经出现了很多非常优秀的成果。 比如SuperYOLO方法&#xff0c;通过融合多模态数据并执行高分辨…

数据库安全性控制

‍ 在当今信息化时代&#xff0c;数据库安全性 对于保护数据免受非法访问和损害至关重要。无论是个人数据还是企业机密&#xff0c;数据库安全性控制都能有效地防范潜在的威胁。本文将为你深入浅出地介绍数据库安全性控制的关键方法和机制&#xff0c;帮助你轻松掌握这一重要概…

vulnhub靶机:21 LTR: Scene1

下载 下载地址&#xff1a;https://www.vulnhub.com/entry/21ltr-scene-1,3/ 导入靶机 一直按默认的来&#xff0c;一直下一步 修改网卡 修改靶机和 kali 攻击机网络模式为仅主机模式 把仅主机模式的 IP 修改为 192.168.2.0 信息收集 主机发现 arp-scan -l 靶机 IP 是 192.…

Windows系统下安装Redis

文章目录 1、下载Redis安装包2、解压压缩包3、运行Redis4、Redis连接检测5、Redis相关设置5.1设置环境变量PATH5.2Redis 配置文件修改 1、下载Redis安装包 Windows版本的Redis可以在Github中下载&#xff1a;下载Redis 2、解压压缩包 将下载的压缩包解压到某个目录下&#…

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;Jenkins部署及环境配置 微服务CI/CD实践&#xff08;四&#xff09;…

c++20 std::format 格式化说明

在标头<format>定义 ()功能很强大&#xff0c;它把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 &#xff08;1&#xff09;不带编号&#xff0c;即“{}”&#xff08;2&#xff09;带…

学会使用西门子博途Startdrive中的测量功能

工程师在驱动调试过程中&#xff0c;往往需要对驱动系统的性能进行分析及优化&#xff0c;比如说借助于调试软件中的驱动器测量功能&#xff0c;可以得到驱动系统的阶跃响应、波特图等&#xff0c;以此为依据工程师可以调整速度控制器、电流控制器的相关参数&#xff0c;使驱动…

今天一定要彻底卸载Windows Denfender!攻略给你了

最近有小伙伴吐槽&#xff1a;明明都已经把Windows Defender关了&#xff0c;为啥它还会时不时拦截我下载的文件&#xff1f; 小白就问&#xff1a;明明是谁&#xff1f; 嗯…… 肯定有小伙伴遇到同样的问题&#xff0c;Windows Defender已经关了&#xff0c;但好像并没有完…

利用Xinstall,轻松搭建高效App运营体系

在移动互联网时代&#xff0c;App的推广和运营成为了企业发展的关键环节。然而&#xff0c;随着流量红利的逐渐消失&#xff0c;传统的推广方式已经难以满足企业快速获客的需求。在这个背景下&#xff0c;Xinstall作为一款强大的渠道推广工具&#xff0c;凭借其独特的功能和优势…

【IP协议】IP协议报头结构(上)

IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4&#xff08;主流&#xff09;6 > IPv6 IPv2&#xff0c;IPv5 在实际中是没有的&#xff0c;可能是理论上/实验室中存在 4位首部长度 IP 协议报头也是变长的&#xff0c;因为选项个数不确定&#xff0c;所以报头长…

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异

测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint&#xff08;1&#xff09;的用法来实现存储0 1 作为boolean的标识列&#xff1b;但是在达梦并不允许使用 tinyint&#xff08;1&#xff09;来定义列&#xff0c;只能使用 tinyint 即 取值范围为&#xff…

《深度学习》CUDA安装配置、pytorch库、torchvision库、torchaudio库安装

目录 一、下载CUDA 1、什么是CUDA 2、查看电脑支持版本号 3、下载CUDA包 1&#xff09;进入下列下载位置 2&#xff09;选择版本 4、安装CUDA 1&#xff09;双击这个文件&#xff0c;然后得到下列图像 2&#xff09;选择自定义安装 3&#xff09;取消选项Visual Inte…

众店绿色积分模式:引领消费新风尚,共筑商业新生态

大家好&#xff0c;我是吴军&#xff0c;目前担任一家业界知名的软件开发公司产品管理的领航者。 最近&#xff0c;市场上涌动着一股创新商业模式的新浪潮&#xff0c;它不仅为消费者编织了一张省钱的网&#xff0c;更为商家铺设了一条吸引新客与增收的道路&#xff0c;甚至平…

【智能流体力学】数值模拟中的稳态和瞬态

在流体力学和数值模拟中, 稳态 (Steady State)意味着流体的物理量(如速度、压力、温度等)不随时间变化。换句话说,在稳态模拟中,系统已经达到了平衡,任何位置上的流场特性都不再随时间发生变化。 其他教程参考:https://doc.cfd.direct/openfoam/user-guide-v12/index…

Linux环境变量详解命令行参数

&#x1f31f;目录 &#x1f4dd;1. 什么是环境变量&#xff1f;&#x1f4dd;2. 查看系统的环境变量&#x1f4dd;3. 添加环境变量&#x1f4dd;4. 环境变量用例5. 命令行参数 好雨知时节 当春乃发生 随风潜入夜 润物细无声 &#x1f4dd;1. 什么是环境变量&#xff1f; 环境…

Matlab simulink建模与仿真 第十二章(信号属性库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号属性库中的模块概览 1、信号属性操作库 注&#xff1a;数据类型转换模块在第二章中有介绍&#xff0c;本章不再赘述&#xff1b;数据类型传播实例在本章也不进行介绍。 2、信号属性检测库 二、数据类…

OPENAI的 o1非常强-可是也被网友们玩坏了

OpenAI o1的潜力 OpenAI o1作为当前人工智能领域的先锋&#xff0c;展现了强大的推理能力和文本生成水平。其在多个标准测试中表现优异&#xff0c;甚至在某些任务上超越了人类PhD水平。这让人们对其能力充满期待。根据数据&#xff0c;o1在处理复杂语句和逻辑推理解题时&…

Qt常用控件——QTextEdit

文章目录 QTextEdit核心属性和信号同步显示示例信号示例 QTextEdit核心属性和信号 QTextEdit表示多行输入框&#xff0c;是一个富文本和markdown编辑器&#xff0c;并且能在内存超出编辑框范围时自动提供滚动条。 QPlainTexEdit是纯文本&#xff0c;QTextEdit不仅表示纯文本&a…

AI界的新宠儿:L20显卡凭什么让云服务商趋之若鹜?

NVIDIA L20 GPU 随着 AI 模型的规模和复杂度不断攀升&#xff0c;对计算能力的渴求也与日俱增。对于 C 端用户的朋友们而言&#xff0c;A 系列和 H 系列的价格过于昂贵&#xff0c;而 RTX 4090 在更高的现存需求面前也无能为力。 在这个背景下&#xff0c;一款新的 GPU 悄然崛起…

SQL入门题

作者SQL入门小白&#xff0c;此栏仅是记录一些解题过程 1、题目 用户访问表users&#xff0c;记录了用户id&#xff08;usr_id&#xff09;和访问日期&#xff08;log_date&#xff09;,求出连续3天以上访问的用户id。 2、解答过程 2.1数据准备 通过navicat创建数据&#xf…