我是靠谱客的博主 哭泣小甜瓜,最近开发中收集的这篇文章主要介绍Unity动态加载本地图片,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Unity运行时动态加载本地图片

一、Unity运行时加载本地文件夹下所有图片的方法,用于在使用图片前加载完成

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

/// <summary>
/// IO加载本地图片 txt文档
/// </summary>
public class ComPanyUILoadController : MonoBehaviour {
    
    public static ComPanyUILoadController instance { get; private set; }

    private string jsonPath = @"E:文件夹名json存放文件夹json名.json"; //json文件路径
    private string imagePath = @"E:文件夹名文件夹名"; //图片文件路径

    public List<CompanyData> datas;  //数据存储列表
    public CompanyData currentDatas; //Json解析格式 

    private void Awake()
    {
        instance = this;
        //加载各个文件
        datas = JsonToObject.JsonToObject_ByJsonFile<CompanyData>(jsonPath); //json解析
    }

    #region  图片加载
    /// <summary>
    /// 获取文件根路径
    /// </summary>
    /// <returns></returns>
    private string GetPath()
    {
        string path ="";
        foreach (CompanyData i in datas)
        {
            if (GameManager.instacne.currentCompany.Equals(i.ID))  //加载编号
            {
                path = imagePath + i.Name+@"";
            }
        }
        return path;  // E:文件夹名文件夹名文件夹名
    }

    /// <summary>
    /// 按照表编号加载对象
    /// </summary>
    /// <returns></returns>
    public CompanyData LoadText()
    {
        foreach (var i in datas)
        {
            if (i.ID == null)
            {
                break;
            }
            if (i.ID.Equals(GameManager.instacne.currentCompany))
            {
                currentDatas = i;
            }
        }
         return currentDatas;
    }

    /// <summary>
    ///加载一个文件夹中所有的图片流 返回字典
    /// 加载图片的Dictionary<string,List<Byte[]>>
    /// </summary>
    /// <param name="filesName">图片所在文件夹地址</param>
    /// <returns></returns>
    public Dictionary<string, List<byte[]>> LoadImages(string filesName)
    {
        Dictionary<string, List<byte[]>> list = new Dictionary<string, List<byte[]>>();
       
        string tempPath = GetPath() + filesName; //图片文件夹位置

        List<string> filePaths = new List<string>();
        string imgtype = "*.BMP|*.JPG|*.PNG";
        string[] ImageType = imgtype.Split('|');
        for (int i = 0; i < ImageType.Length; i++)
        {
            //文件夹下所有的图片路径  
            string[] dirs = Directory.GetFiles(tempPath, ImageType[i]);
            for (int j = 0; j < dirs.Length; j++)
            {
                filePaths.Add(dirs[j]);
            }
        }

        for (int i = 0; i < filePaths.Count; i++)
        {
        	//切割图片名和对对应的图片流数据
            List<byte[]> tl = new List<byte[]>();
            string Tstr = filePaths[i].Split('\')[5].Split('.')[0]; //图片位置 下标为5个元素是图片名称  分割图片名称
            byte[] bs = getImageByte(filePaths[i]);
            tl.Add(bs);
            list.Add(Tstr,tl); //图片名和图片流数据对应
        }
        return list;
    }

    #region 加载图片List<Texture2D>
    /// <summary>
    ///加载文件夹下所有图片流 返回图片流列表
    /// 加载图片的Byte[]数组
    /// </summary>
    /// <param name="filesName">地址</param>
    public List<byte[]> LoadImage(string filesName)
    {
        List<byte[]> list = new List<byte[]>();
        string tempPath = GetPath() + filesName;  //图片文件夹路径

        List<string> filePaths = new List<string>();
        string imgtype = "*.BMP|*.JPG|*.PNG";
        string[] ImageType = imgtype.Split('|');
        for (int i = 0; i < ImageType.Length; i++)
        {
            //文件夹下所有的图片路径  
            string[] dirs = Directory.GetFiles(tempPath, ImageType[i]);
            for (int j = 0; j < dirs.Length; j++)
            {
                filePaths.Add(dirs[j]);
            }
        }
		//通过路径加载图片流
        for (int i = 0; i < filePaths.Count; i++)
        {
            byte[] bs = getImageByte(filePaths[i]);
            list.Add(bs);
        }
        return list;
    }
    #endregion

    /// <summary>  
    /// 根据图片路径返回图片的字节流byte[]  
    /// </summary>  
    /// <param name="imagePath">图片路径</param>  
    /// <returns>返回的字节流</returns>  
    private byte[] getImageByte(string imagePath)
    {

        FileStream files = new FileStream(imagePath, FileMode.Open,FileAccess.Read);
        files.Seek(0,SeekOrigin.Begin);
        byte[] imgByte = new byte[files.Length];
        files.BeginRead(imgByte,0,(int)files.Length,CallBack,files);
        return imgByte;
    }

    /// <summary>
    /// 异步加载
    /// </summary>
    /// <param name="ar"></param>
    void CallBack(IAsyncResult ar)
    {
        FileStream fs = ar.AsyncState as FileStream;
        fs.Close();
        fs.Dispose();
    }

    #endregion
}


用的时候:

List<byte[]> data=new  List<byte[]>();  //临时接收图片数据流
List<Texture2D> turList=new List<Texture2D>();  //保存图片
data=ComPanyUILoadController.instance.LoadImage("图片所在文件夹");
foreach (byte[] item in data)
{
	//文件byte[]转换成Texture2D
   Texture2D tex = new Texture2D(100, 100, TextureFormat.RGBA32, false);   
   tex.LoadImage(item); //建议哪里调用哪里转
   turList.Add(tex);  
}

//后续或将Texture2D转换为Sprite使用

二、Unity运行时临时加载本地文件夹下一张图片的方法

    public static class ImageLoad {

       		public static Texture2D LoadImageByte(string path)
       		{
       		//读取图片位置   PathSet.dataPath+path=图片所在文件夹路径+图片名称.格式        .png/.jpg等
            FileStream files=new FileStream (PathSet.dataPath+path,FileMode.Open,FileAccess.Read);
            files.Seek(0,SeekOrigin.Begin);
            byte[] imgByte=new byte[files.Length];

            //这种加载方法临时加载可能会加载数据流不全,在转成Texture2D出现红问号加载失败的情况
            //files.BeginRead(imgByte,0,(int)files.Length,CallBack,files);

            files.Read(imgByte,0,imgByte.Length);
            files.Close();

            Texture2D tx=new Texture2D (512,512);
            tx.LoadImage(imgByte);
            return tx;
        }
       //分线程加载
       static void CallBack(IAsyncResult ar){
           FileStream fileStream=ar.AsyncState as FileStream;
            fileStream.Close();
            fileStream.Dispose();
       } 
    }

最后

以上就是哭泣小甜瓜为你收集整理的Unity动态加载本地图片的全部内容,希望文章能够帮你解决Unity动态加载本地图片所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部