Otis Howell
Otis Howell

Reputation: 23

Make Material From Texture2D

I'm trying to write a program in unity. I'm quite new to unity, so i don't know much.i want to be able to make a new material in my code with only a texture2d to pass into it. So far im trying this:

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

public class Search : MonoBehaviour
{
    public void SearchEnter()
    {
        MyObject.GetComponent<Image>().material = LoadImage(name.ToLower());
    }
    Texture2D LoadImage(string ImageName)
    {
        string url = "file:///C:/MyFilePath" + ImageName + ".jpg";
        Texture2D tex;
        tex = new Texture2D(4, 4, TextureFormat.DXT1, false);
        using (WWW www = new WWW(url))
        {
            www.LoadImageIntoTexture(tex);
            GetComponent<Renderer>().material.mainTexture = tex;
        }
        return tex;
    }
}

I cannot do this as it cannot convert from texture2d to material. Can anyone help me?

Upvotes: 0

Views: 2239

Answers (1)

derHugo
derHugo

Reputation: 90629

First of all you are not waiting until the WWW request finishes so you are trying to access the result to early.

Instead of the WWW you should rather use a UnityWebRequestTexture.GetTexture in a Coroutine like

public class Search : MonoBehaviour
{
    public void SearchEnter()
    {
        StartCoroutine(LoadImage(name.ToLower()))
    }

    IEnumerator LoadImage(string ImageName)
    {
        using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture("file:///C:/MyFilePath" + ImageName + ".jpg"))
        {
            yield return uwr.SendWebRequest();

            if (uwr.isNetworkError || uwr.isHttpError)
            {
                Debug.Log(uwr.error);
            }
            else
            {
                // Get downloaded texture
                var texture = DownloadHandlerTexture.GetContent(uwr);

                //TODO now use it

                ...
            }
        }
    }
}

The second issue: You can not simply convert a Texture2D to Material. You rather have to either create a new Material from a given shader or a given Material using new Material() e.g. using Shader.Find like

//TODO now use it

// ofcourse again you can not simply create a new material from a texture
// you would rather need to pass in a shader like
var material = new Material(Shader.Find("UI/Default"));
material.mainTexture = texture;

MyObject.GetComponent<Image>().material = material;
GetComponent<Renderer>().material.mainTexture = texture;

However, for an Image you would actually probably rather simply stick with the default UI material but use a Sprite instead

MyObject.GetComponent<Image>().sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.one * 0.5f); 

Upvotes: 2

Related Questions