You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity本地文件上传至3D物体/平面的实现及渲染问题

解决Unity中本地图片显示在3D物体上的问题

嘿,我之前也踩过这个坑!你已经搞定UI的RawImage加载逻辑了,现在卡壳的核心原因是:UI组件(比如RawImage)和3D物体的纹理渲染机制完全不同——RawImage可以直接绑定Texture,但3D物体需要通过MeshRenderer组件的材质来关联纹理。你说系统提示图片已存在但看不到,大概率是没把纹理正确赋值给材质的主纹理,或者材质类型不对导致渲染异常。

下面是具体的解决步骤和代码修正方案:

一、先确认3D物体的基础组件

首先检查你的立方体/平面:

  • 确保它带有MeshRenderer组件(Unity默认创建的3D物体都自带,但如果不小心删除了,手动添加即可)
  • 建议给它的材质用Unlit/Texture类型(这种材质不受光照影响,能直接清晰显示图片,避免场景光照不足导致看不到图片的情况)

二、修正代码逻辑(核心部分)

你原来的代码已经实现了本地图片加载到RawImage,现在只需要扩展代码,把加载好的Texture赋值给3D物体的材质主纹理即可。注意不要用sharedMaterial(会修改项目里的原始材质文件),要用material(创建材质的实例,只影响当前物体)。

完整的示例代码片段

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

public class ImageLoader : MonoBehaviour
{
    public RawImage uiRawImage; // 拖拽你的UI RawImage组件到这里
    public MeshRenderer target3DRenderer; // 拖拽你的3D物体的MeshRenderer组件到这里

    // 点击按钮触发的方法
    public void LoadAndDisplayImage()
    {
        // 打开文件浏览器(你原来的逻辑应该已经有这部分)
        string path = EditorUtility.OpenFilePanel("选择图片", "", "png,jpg,jpeg");
        if (string.IsNullOrEmpty(path)) return;

        // 加载本地图片为Texture2D
        byte[] imageBytes = File.ReadAllBytes(path);
        Texture2D loadedTexture = new Texture2D(2, 2);
        loadedTexture.LoadImage(imageBytes);
        loadedTexture.name = "LoadedLocalImage";

        // 显示到UI的RawImage(你原来的逻辑)
        uiRawImage.texture = loadedTexture;

        // 关键:显示到3D物体上
        if (target3DRenderer != null)
        {
            // 1. 如果物体已有材质,直接替换主纹理
            target3DRenderer.material.mainTexture = loadedTexture;

            // (可选)如果需要显示透明图片,切换为Unlit/Transparent材质
            // target3DRenderer.material = new Material(Shader.Find("Unlit/Transparent"));
            // target3DRenderer.material.mainTexture = loadedTexture;
        }
        else
        {
            Debug.LogError("请给target3DRenderer赋值3D物体的MeshRenderer组件!");
        }
    }
}

三、常见坑排查

如果还是看不到图片,检查这几点:

  • 材质类型问题:如果用了Standard材质,场景中没有光源的话,3D物体会黑掉,换成Unlit/Texture材质就能直接显示
  • Texture是否可读:LoadImage默认会把Texture设为可读,但如果你的图片格式特殊,可手动设置loadedTexture.isReadable = true
  • 不要用sharedMaterial:如果用target3DRenderer.sharedMaterial.mainTexture,会修改项目中原始的材质文件,下次打开项目所有用这个材质的物体都会显示这张图,一定要用material
  • UV映射问题:如果图片显示拉伸/变形,检查3D物体的MeshFilter的UV是否正确(默认平面/立方体的UV是正常的,除非你修改过Mesh)

内容的提问来源于stack exchange,提问作者user6411634

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:54