05_Unity动态加载图片资源

这篇具有很好参考价值的文章主要介绍了05_Unity动态加载图片资源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零、前言

本文归纳了Unity中加载图片资源的常用方法,包括url和本地路径的加载。

一、www加载

在工具类中封装如下方法:

一般是放在单例中,如:GameManager

public void LoadTexture(Image obj, string path)
{
    // Application.dataPath + "/Resources/Image/Guide1.png"
    string finalPath = Application.dataPath + "/Resources/" + path;
    print("final " + finalPath);
    StartCoroutine(ILoadTexture(obj, finalPath));
}

public void LoadTextureUrl(Image obj, string url)
{
    StartCoroutine(ILoadTexture(obj, url));
}

IEnumerator ILoadTexture(Image obj, string url)
{
    double startTime = (double)Time.time;
    //请求WWW
    WWW www = new WWW(url);

    yield return www;
    if (www != null && string.IsNullOrEmpty(www.error))
    {
        //获取Texture
        Texture2D texture = www.texture;
            //创建Sprite
        Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
        startTime = (double)Time.time - startTime;
        Debug.Log("www加载用时 : " + startTime);
        obj.sprite = sprite;
    }
}

加载本地图片:

  1. 创建一个Image物体

05_Unity动态加载图片资源

  1. 在本地存放一张图片,Guide1.png

放置在: Resources/Image/Guide1.png 路径下

05_Unity动态加载图片资源

  1. 在物体上挂接一个测试脚本
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
 
public class Test : MonoBehaviour {
    void Start () {
        Image img = GetComponent<Image>();
        // 此处调用,上面的LoadTexture方法
        GameManager.instance.LoadTexture(img, "Image/Guide1.png");
	}
}
  1. 执行前:

05_Unity动态加载图片资源

  1. 执行后:

05_Unity动态加载图片资源

加载url

  1. 还是刚刚的Image
  2. 脚本变成:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
 
public class Test : MonoBehaviour {
    void Start () {
        Image img = GetComponent<Image>();
        // 此处调用,上面的LoadTexture方法
        GameManager.instance.LoadTextureUrl(img, "https://docs.unity3d.com/uploads/Main/ShadowIntro.png");
	}
}
  1. 表现效果和上面的一致
  2. 缺点是速度比较慢,运行时间大约0.4s

二、UnityWebReqeust

现在官方建议是采用UnityWebReqeust

参考代码如下

public IEnumerator LoadTexture2D(string path)
{
    UnityWebRequest request = UnityWebRequestTexture.GetTexture(path);
    yield return request.SendWebRequest();

    if (request.isHttpError || request.isNetworkError)
    {  }
    else
    {
        // 这个是物体身上的组件Image
        Image img = GetComponent<Image>();

        var texture = DownloadHandlerTexture.GetContent(request);
        Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
        img.sprite = sprite;
    }
}

本地加载

StartCoroutine(LoadTexture2D(Application.dataPath + "/Resources/Image/Guide1.png"));

url加载

StartCoroutine(LoadTexture2D("https://docs.unity3d.com/uploads/Main/ShadowIntro.png"));

三、以IO的形式加载

private void LoadByIo(string path)
{
    // 目标
    Image img = GetComponent<Image>();

    double startTime = (double)Time.time;
    //创建文件读取流
    FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
    //创建文件长度缓冲区
    byte[] bytes = new byte[fileStream.Length];
    //读取文件
    fileStream.Read(bytes, 0, (int)fileStream.Length);

    //释放文件读取流
    fileStream.Close();
    //释放本机屏幕资源
    fileStream.Dispose();
    fileStream = null;

    //创建Texture
    int width = 300;
    int height = 372;
    Texture2D texture = new Texture2D(width, height);
    texture.LoadImage(bytes);

    //创建Sprite
    Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
    image.sprite = sprite;

    startTime = (double)Time.time - startTime;
    Debug.Log("IO加载" + startTime);

}

四、优化方案

前两种方案均使用到了协程,最后一种方案用到了IO。

优劣分析:

  • 协程的接口封装更完善,使用更简洁。缺点是协程无法将texture作为返回值return回去。
  • IO加载需要自己写读写代码,偏底层一些。优点是可以return,return后交给使用的人自行处理,更加灵活。

下面提出一种协程的优化方案:

首先,为什么需要优化?
原因是使用封装的接口,不应该把Image传递进去,也不应该将Image和texture强绑定起来。而是获得目标texture,如何处置则交给使用的人。
因此解决方案是传递一个回调函数,在texture加载完成后执行回调。

参考代码如下:

public RawImage imageBox;
void Start()
{
    StartCoroutine(LoadTexture2D("/icon.png", (value) => imageBox.texture = value));
}

public IEnumerator LoadTexture2D(string url, Action<Texture2D> taskCompletedCallBack)
{
    UnityWebRequest request = UnityWebRequestTexture.GetTexture(Application.persistentDataPath + url);
    yield return request.SendWebRequest();

    if (request.isHttpError || request.isNetworkError)
    { }
    else
    {
        var texture = DownloadHandlerTexture.GetContent(request);
        taskCompletedCallBack(texture);
    }

}

五、其他

仅本地加载的办法,类似加载其他资源

1、Resources文件夹下加载

  inside = Resources.Load("inside") as Texture;//Resources夹下动态加载

2、Assets文件夹下加载

AssetsManager.Load("Assets/_Sprites/Setting/" + index + ".png", (sprite) =>

        {

            img.sprite = sprite;

        });

六、结语

你学废了吗?


关注我,一起进步吧~

  • bilibili 打工人小棋

  • 知乎 打工人小棋

  • CSDN 打工人小棋

05_Unity动态加载图片资源文章来源地址https://www.toymoban.com/news/detail-453976.html

参考文档:

  • WWW.LoadImageIntoTexture
  • Unity Coroutine返回值如何处理
  • Unity中加载图片的几种方法
  • Unity中加载本地图片
  • Unity Coroutine返回值如何处理
  • Unity中加载图片的几种方法
  • Unity中加载本地图片

到了这里,关于05_Unity动态加载图片资源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • vue中图片不显示问题 - vue中静态资源加载

    vue中图片不显示问题 - vue中静态资源加载

    在 JavaScript 被导入或在 template/CSS 中通过 相对路径 被引用。这类引用会被 webpack 处理后再输出到打包后的文件。 放置在 public(static)目录下或通过绝对路径被引用。这类资源将会直接被拷贝到打包后的文件 ,而不会经过 webpack 的处理。 在 config.js 的 build.assetsPublicPath 和 build

    2024年01月25日
    浏览(14)
  • Unity 图片资源的适配

    Unity 图片资源的适配

    最近小编做Unity项目时,发现在资源处理这方面和Android有所不同;例如:Android的资源文件夹res下会有着mipmap-mdpi,mipmap-hdpi,mipmap-xhdpi,mipmap-xxhdpi,mipmap-xxxhdpi这五个文件夹,这是因为我们一般在蓝湖UI设计图上下载的图片资源都是对应这五种分辨率的图片,而在Unity中,图片

    2024年02月11日
    浏览(12)
  • Vite静态资源处理——动态引入图片

    Vite静态资源处理——动态引入图片

    服务时引入一个静态资源会返回解析后的公共路径: 导入既可以使用绝对公共路径(基于开发期间的项目根路径),也可以使用相对路径。 vite 生产构建后文件名会哈希,如图: import.meta.url 是一个 ESM 的原生功能,会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用,

    2024年02月10日
    浏览(16)
  • Unity UI修改Image中的图片资源

    Unity UI修改Image中的图片资源

    把资质文件放到Assets文件夹下Resources文件中。 Sprite sprite = Resources.Load(“Images/2”); //Images文件夹下名为2的图片 Image2.sprite = sprite; //修改Image2的sprite //完成

    2024年02月11日
    浏览(10)
  • [渲染层网络层错误] Failed to load local image resource /miniprogram/images/1.jpg无法加载本地图片资源

    [渲染层网络层错误] Failed to load local image resource /miniprogram/images/1.jpg无法加载本地图片资源

    最近开始学习编写小程序,跟着教程走到展示图片这一步发现这个错误。按照正常的编程思路和百度大法,大部分说是路径错误和图片不能带有中字。但是按照经验复制相对路径和绝对路径都不行,还是同样的错误。代码如下。 图片的路径绝对没问题,百度有的博客说用wx

    2024年02月11日
    浏览(10)
  • python打包,图片资源打包

    1,安装pyinstaller pip install pyinstaller *,新配置的python环境,出现了两个报错 第一个通过修改配置文件解决 Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。 所在位置 C:Usersxxxminiconda3shellcondabinCond_invoke-expression : 所在位置 行:1 字符: 254 + ... engana

    2024年02月13日
    浏览(16)
  • Webpack5 处理图片资源

    过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了,我们只需要简单配置即可处理图片资源 src/images/1.jpeg src/images/2.png src/images/3.gif src/less/index.less src/sass/index.sass src/styl/index.styl 打开 index.html 页面查看

    2024年02月13日
    浏览(19)
  • 如何在Qt项目中引入图片资源

    如何在Qt项目中引入图片资源

    首先,在Qt项目里创建一个目录 icon ,然后将图片资源放 icon 目录中 在Qt creator中创建resource file 右键项目 myqtdesign Add New... Qt Qt Resource File 输入文件名 myimage ,并在 CMakeLists.txt 加入 myimage.qrc 并保存(control + s) 3. 添加前缀 /images 右键 myimage.qrc 文件 Add Prefix... ,结果如下图: 添

    2024年02月13日
    浏览(12)
  • uniapp选取本地资源(图片,视频,文件)

    从本地相册选择图片或使用相机拍照。 App端如需要更丰富的相机拍照API(如直接调用前置摄像头),参考plus.camera OBJECT 参数说明 参数名 类型 必填 说明 平台差异说明 count Number 否 最多可以选择的图片张数,默认9 见下方说明 sizeType ArrayString 否 original 原图,compressed 压缩图,

    2024年02月11日
    浏览(13)
  • Android Studio开发之路(二)添加图片资源

    Android Studio开发之路(二)添加图片资源

    第一步:复制要添加的图片 第二步:右键点击项目的res-drawable目录,选择paste粘贴 选择drawable目录 问你是否确定要复制,点击ok即可 然后就可以看到在drawable目录下出现了复制的图片 然后在xml中添加代码就可以显示在界面上了

    2024年02月09日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包