Unity3d中(加载(内部、外部))显示图片(sprite、texture2d)

介绍:在这片中将逐渐添加开发中遇到的各种加载图片的方法、情况

 

一、使用文件流(FileStream)从指定文件夹中读取图片

   

    /// <summary>
    /// 从外部指定文件中加载图片
    /// </summary>
    /// <returns></returns>
    private Texture2D LoadTextureByIO()
    {
        FileStream fs = new FileStream(@"D:\" + "图片文件名的全程(包含后缀名)比如  1.png", FileMode.Open, FileAccess.Read);
        fs.Seek(0, SeekOrigin.Begin);//游标的操作,可有可无
        byte[] bytes = new byte[fs.Length];//生命字节,用来存储读取到的图片字节
        try
        {
            fs.Read(bytes, 0, bytes.Length);//开始读取,这里最好用trycatch语句,防止读取失败报错

        }
        catch (Exception e)
        {
            Debug.Log(e);
        }
        fs.Close();//切记关闭

        int width = 2048;//图片的宽(这里两个参数可以提到方法参数中)
        int height = 2048;//图片的高(这里说个题外话,pico相关的开发,这里不能大于4k×4k不然会显示异常,当时开发pico的时候应为这个问题找了大半天原因,因为美术给的图是6000*3600,导致出现切几张图后就黑屏了。。。
        Texture2D texture = new Texture2D(width, height);
        if (texture.LoadImage(bytes))
        {
            print("图片加载完毕 ");
            return texture;//将生成的texture2d返回,到这里就得到了外部的图片,可以使用了

        }
        else
        {
            print("图片尚未加载");
            return null;
        }
    }

经过上边的方法获取到了外部的图片,得到的是Texture2d,如果目的是需要sprite,则调用下边的方法即可

    /// <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;
    }
<think>好的,用户现在问的是Unity中的Texture2D对象,需要详细讲解。首先,我需要回忆一下用户之前的提问历史。之前他们问了签入和撤销,可能是在学习Unity的基础或者团队协作相关的内容。现在转向Texture2D,可能是在学习资源管理或者图形渲染部分。 首先,要明确Texture2D是什么。它是Unity中处理2D纹理的核心类,用于图像数据。用户可能想知道如何创建、加载、修改纹理,以及应用场景和性能优化。需要覆盖基本概念、创建方式、常用属性方法、应用实例、性能注意事项,以及常见问题。 接下来,要分结构讲解。先介绍Texture2D的定义和用途,然后创建方法,包括代码创建、加载资源、导入图片等。然后属性和方法,比如width、height、SetPixels、Apply等。应用实例部分需要具体例子,比如动态生成纹理,修改像素,保存为图片文件。性能方面,需要考虑内存、Mipmap、压缩格式等。常见问题如内存泄漏、读写权限、平台差异等。 还需要注意用户可能的实际需求。比如他们可能在开发游戏时需要动态生成纹理,或者修改已有纹理,或者优化性能。要给出实际的代码示例,帮助用户理解如何操作。同时,要提醒注意事项,比如调用Apply()才能应用修改,不同平台的纹理限制,避免常见错误。 另外,用户可能对Texture2DTexture的区别不太清楚,需要解释Texture是基类,Texture2D是子类,专门处理2D纹理。还有Read/Write Enabled选项的作用,以及如何保存生成的纹理到本地,这些都需要详细说明。 最后,要检查是否有遗漏的重要点,比如压缩格式对性能的影响,如何正确释放纹理内存,避免泄漏。可能用户在使用过程中遇到问题,比如纹理不显示,修改无效,这时候需要给出排查步骤,比如检查导入设置,确认Apply是否调用,读写权限是否开启等。 总结一下,结构应该是:概述、创建方法、属性和方法、应用实例、性能优化、常见问题。每个部分都需要详细但清晰的解释,配合代码示例和实际应用场景,帮助用户全面理解Texture2D的使用和注意事项。</think>### **Unity中的Texture2D对象详解** --- #### **1. 基本概念** **Texture2D** 是Unity中用于处理2D纹理的核心类,继承自`Texture`类。它表示一个二维的像素网格,通常用于存储图像数据,例如: - 材质贴图(漫反射、法线贴图等) - UI元素(如Sprite、RawImage) - 程序化生成的纹理(如噪声图、渐变图) --- #### **2. 创建Texture2D的常用方法** ##### **2.1 通过代码动态创建** ```csharp // 创建一个纯色纹理 int width = 512; int height = 512; Texture2D texture = new Texture2D(width, height, TextureFormat.RGBA32, false); // 填充颜色 Color[] colors = new Color[width * height]; for (int i = 0; i < colors.Length; i++) { colors[i] = Color.red; // 红色填充 } texture.SetPixels(colors); texture.Apply(); // 必须调用Apply使修改生效 // 应用到材质 GetComponent<Renderer>().material.mainTexture = texture; ``` ##### **2.2 从资源加载** ```csharp // 通过Resources加载 Texture2D loadedTexture = Resources.Load<Texture2D>("Textures/MyTexture"); // 通过AssetDatabase(仅限Editor) #if UNITY_EDITOR Texture2D editorTexture = UnityEditor.AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Textures/MyTexture.png"); #endif ``` ##### **2.3 从图片文件导入** ```csharp // 异步加载外部图片文件 IEnumerator LoadTextureFromFile(string path) { using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(path)) { yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.Success) { Texture2D texture = DownloadHandlerTexture.GetContent(www); GetComponent<RawImage>().texture = texture; } } } ``` --- #### **3. 核心属性和方法** | **属性/方法** | **说明** | |------------------------------|-------------------------------------------------------------------------| | `width` / `height` | 纹理的宽度和高度(像素) | | `format` | 纹理格式(如`TextureFormat.RGBA32`、`TextureFormat.ARGB32`) | | `mipmapCount` | Mipmap层级数量 | | `SetPixel(int x, int y, Color)` | 设置单个像素颜色(需配合`Apply()`生效) | | `GetPixel(int x, int y)` | 获取单个像素颜色(需要开启纹理的`Read/Write Enabled`) | | `SetPixels(Color[] colors)` | 批量设置像素颜色(更高效) | | `Apply(bool updateMipmaps = true)` | 应用所有修改到GPU | | `ReadPixels(Rect source, int destX, int destY)` | 从屏幕或RenderTexture读取像素 | --- #### **4. 典型应用场景** ##### **4.1 动态生成纹理** ```csharp // 生成渐变纹理 Texture2D CreateGradient(int width, int height) { Texture2D tex = new Texture2D(width, height); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { float t = (float)x / width; tex.SetPixel(x, y, Color.Lerp(Color.blue, Color.yellow, t)); } } tex.Apply(); return tex; } ``` ##### **4.2 修改现有纹理** ```csharp // 在运行时添加水印 void AddWatermark(Texture2D sourceTex, Texture2D watermark) { int startX = sourceTex.width - watermark.width - 10; int startY = 10; for (int y = 0; y < watermark.height; y++) { for (int x = 0; x < watermark.width; x++) { Color srcColor = sourceTex.GetPixel(startX + x, startY + y); Color wmColor = watermark.GetPixel(x, y); sourceTex.SetPixel(startX + x, startY + y, Color.Lerp(srcColor, wmColor, wmColor.a)); } } sourceTex.Apply(); } ``` ##### **4.3 保存为图片文件** ```csharp // 将Texture2D保存为PNG void SaveTextureToFile(Texture2D texture, string path) { byte[] bytes = texture.EncodeToPNG(); System.IO.File.WriteAllBytes(path, bytes); #if UNITY_EDITOR UnityEditor.AssetDatabase.Refresh(); #endif } ``` --- #### **5. 关键注意事项** ##### **5.1 性能优化** - **内存管理**: - 及时销毁动态创建的纹理:`Destroy(texture);` - 使用`Texture2D.Compress(bool highQuality)`压缩纹理 - **Mipmap策略**: - 3D场景中的远距离物体建议开启Mipmap(减少锯齿) - UI纹理应关闭Mipmap以节省内存 - **压缩格式**: | 平台 | 推荐格式 | |-----------|-------------------------| | PC | DXT5(带透明通道) | | Android | ETC2(支持透明) | | iOS | ASTC 4x4 | ##### **5.2 常见问题** - **“Texture is not readable”错误**: 在纹理导入设置中勾选`Read/Write Enabled`(仅限需要CPU修改的纹理) - **像素坐标原点**: Unity纹理的(0,0)点在**左下角**(与OpenGL一致,不同于UI系统的左上角) - **Alpha通道处理**: 使用`TextureFormat.RGBA32`确保Alpha通道正确存储 --- #### **6. 高级功能** - **异步纹理上传**: 使用`Texture2D.CreateExternalTexture`配合`AsyncGPUReadback`实现 - **多线程处理**: 通过`Job System`批量处理像素数据(需将颜色数据转换为NativeArray) - **RenderTexture交互**: ```csharp // 将RenderTexture转换为Texture2D RenderTexture rt = RenderTexture.GetTemporary(256, 256); Texture2D tex = new Texture2D(rt.width, rt.height); RenderTexture.active = rt; tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); tex.Apply(); RenderTexture.ReleaseTemporary(rt); ``` --- ### **总结** - **Texture2DUnity中处理2D图像数据的核心对象** - **关键操作流程**:创建 → 修改像素 → Apply → 应用/保存 - **性能关键点**:压缩格式选择、及时销毁、避免频繁CPU读写 - **典型用途**:动态贴图生成、运行时图像处理、屏幕截图保存 掌握Texture2D的用法,可以灵活实现各种图像相关的运行时功能!
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值