С помощью редактора Unity, как мне загрузить файл с моего компьютера, чтобы он появился на трехмерном объекте или плоскости?

На YouTube я нашел учебник, в котором точно добавили Проводник и загрузку изображений в RawImage на холсте с использованием Unity 2017.3.1f1.

введите описание изображения здесь

То, что я пытаюсь сделать, это добавить то же изображение после "нажатия кнопки" к трехмерному объекту, такому как куб или плоскость, как показано цветным кубом. Когда я запускаю приведенный ниже код, он регистрируется как присутствующий в кубе, но не отображается. Любая помощь приветствуется.

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;
    }
}

2 ответа

Решение

В вашем коде есть небольшая ошибка. Это должно работать иногда и терпеть неудачу другие времена Вероятность того, что он работает или нет, зависит от размера изображения. Это будет работать, если изображение действительно маленькое, но потерпит неудачу, когда оно будет большим.

Причина этого кроется в коде в вашем 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;
}
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;
    }

}
Другие вопросы по тегам