使用 Unity 编辑器,我如何从我的计算机上传文件并将其显示在 3D 对象或平面上?

Posted

技术标签:

【中文标题】使用 Unity 编辑器,我如何从我的计算机上传文件并将其显示在 3D 对象或平面上?【英文标题】:Using Unity Editor, how do i upload a file from my computer and have it appear on a 3D object or plane? 【发布时间】:2018-10-07 22:41:03 【问题描述】:

我在 YouTube 上找到了一个教程,该教程使用 Unity 2017.3.1f1 准确地将文件资源管理器和图像上传到画布上的“RawImage”。

我要做的是在“按下按钮”后将相同的图像添加到 3D 对象,如彩色立方体所示的立方体或平面。当我运行以下代码时,它注册为存在于多维数据集上但不呈现。任何帮助表示赞赏。

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

public class Explorer : MonoBehaviour

    string path;
    public RawImage image;

    public void OpenExplorer()
    
        path = EditorUtility.OpenFilePanel("Overwrite with png", "", "png");
        GetImage();
    

    void GetImage()
    
        if (path != null)
        
            UpdateImage();
        
    
    void UpdateImage()
    
        WWW www = new WWW("file:///" + path);
        image.texture = www.texture;
    

【问题讨论】:

【参考方案1】:

您的代码中有一个小错误。它有时应该工作,有时会失败。它工作与否的机会取决于图像的大小。如果图像非常小,它会起作用,但如果图像很大,它会失败。

这是因为您的UpdateImage 函数中的代码。 WWW 应该在协程函数中使用,因为在使用www.texture 访问纹理之前,您需要让步或等待它完成加载或下载文件。你现在不这样做。将其更改为协程函数,然后生成它,它应该可以正常工作。

void GetImage()

    if (path != null)
    
        StartCoroutine(UpdateImage());
    


IEnumerator UpdateImage()

    WWW www = new WWW("file:///" + path);
    yield return www;
    image.texture = www.texture;


如果由于某种原因你不能使用协程,因为它是一个编辑器插件,那么忘记 WWW API 并使用 File.ReadAllBytes 来读取图像。

void GetImage()

    if (path != null)
    
        UpdateImage();
    


void UpdateImage()

    byte[] imgByte = File.ReadAllBytes(path);
    Texture2D texture = new Texture2D(2, 2);
    texture.LoadImage(imgByte);

    image.texture = texture;

要将图像分配给 3D 对象,请获取 MeshRenderer,然后将纹理设置为渲染器正在使用的材质的 mainTexture

//Drag the 3D Object here
public MeshRenderer mRenderer;

void UpdateImage()

    byte[] imgByte = File.ReadAllBytes(path);
    Texture2D texture = new Texture2D(2, 2);
    texture.LoadImage(imgByte);

    mRenderer.material.mainTexture = texture;

【讨论】:

谢谢。我将在下面添加完整的脚本。把你的 venmo 或付款方式给我,我会为你的善举寄几块钱。 感谢您的慷慨。如果您发现我的回答有用并想回报我,那么您只需回答您认为可以回答的任何问题。您不必这样做,但这是在人们帮助您时回报他们的最佳方式。不客气! @Hulk 不知道你为什么不接受我的回答。您复制了我的答案中的内容并将其作为答案然后接受了吗?如果有人帮助您并解决了您的问题,您会接受他们的回答。无需复制他们的答案然后接受。 我不记得不接受答案。我添加了我的代码作为附加答案。我没有意识到它仅限于一个答案并覆盖了另一个答案。诚实的错误。 您可以添加任意数量的答案,但您点击答案上的复选标记,它将接受/不接受它。【参考方案2】:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;
using System.IO;


public class Explorer : MonoBehaviour 


string path;
public MeshRenderer mRenderer;

public void OpenExplorer()

        path = EditorUtility.OpenFilePanel("Overwrite with png", "", "png");
        GetImage();


void GetImage()

    if (path != null)
    
        UpdateImage();
    

    void UpdateImage()

    byte[] imgByte = File.ReadAllBytes(path);
    Texture2D texture = new Texture2D (2, 2);
    texture.LoadImage(imgByte);

    mRenderer.material.mainTexture = texture;

    //WWW www = new WWW("file:///" + path);
    //yield return www;
    //image.texture = texture;
    


【讨论】:

以上是关于使用 Unity 编辑器,我如何从我的计算机上传文件并将其显示在 3D 对象或平面上?的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的设备中选择文件? [关闭]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?

如何从我的模型中的剑道编辑器中获取价值

如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件

将文件从我的计算机上传到 ubuntu 服务器

减少 Unity 游戏 iOS 应用程序大小