您的代码很好。下载的图像未显示,因为您在场景视图中并且相机远离它。
选择脚本附加到的游戏对象,然后按F。它应该放大它,您将看到下载的图像。请参阅here,了解如何重置 Unity 布局以恢复游戏视图。
如果您仍然看不到图像,则SpriteRenderer 不在摄像头前面。从截图来看,它的位置是0,0,0,所以请确保相机的位置是0,0,-10。
正确的图片展示方式:
要在 Unity 中简单地显示图像,请使用 Image 或 RawImage 组件。推荐使用RawImage,因为它在更改纹理时不会产生垃圾。你应该已经知道怎么做这个了
如果您需要将刚体或 2D 碰撞器附加到该图像,请使用 SpriteRenderer 或 MeshRenderer 用于 3D 对象以显示 image。
这是在 Unity 中显示图像的四种方式。如果根本不需要物理或碰撞,建议使用 #2:
1. 使用Image 组件:
public Image imageToDisplay;
string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png";
void Start()
{
StartCoroutine(loadSpriteImageFromUrl(url));
}
IEnumerator loadSpriteImageFromUrl(string URL)
{
WWW www = new WWW(URL);
while (!www.isDone)
{
Debug.Log("Download image on progress" + www.progress);
yield return null;
}
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log("Download failed");
}
else
{
Debug.Log("Download succes");
Texture2D texture = new Texture2D(1, 1);
www.LoadImageIntoTexture(texture);
Sprite sprite = Sprite.Create(texture,
new Rect(0, 0, texture.width, texture.height), Vector2.zero);
imageToDisplay.sprite = sprite;
}
}
过去LoadImageIntoTexture 存在问题。因此,我的其他示例不会使用LoadImageIntoTexture。如果您看到一个问号作为图像,则使用 www.bytes 和 Texture2D.LoadImage 函数。
简单替换:
Texture2D texture = new Texture2D(1, 1);
www.LoadImageIntoTexture(texture);
与
Texture2D texture = new Texture2D(1, 1);
texture.LoadImage(www.bytes);
texture.Apply();
2.使用RawImage 组件(推荐):
public RawImage imageToDisplay;
string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png";
void Start()
{
StartCoroutine(loadSpriteImageFromUrl(url));
}
IEnumerator loadSpriteImageFromUrl(string URL)
{
WWW www = new WWW(URL);
while (!www.isDone)
{
Debug.Log("Download image on progress" + www.progress);
yield return null;
}
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log("Download failed");
}
else
{
Debug.Log("Download succes");
Texture2D texture = new Texture2D(1, 1);
texture.LoadImage(www.bytes);
texture.Apply();
imageToDisplay.texture = texture;
}
}
3.使用SpriteRenderer 组件:
主要用于 2D 对象和带有 Rigidbody2D 和 2D Colliders 的 2D 物理模拟。如果没有,请使用上面的 UI(#1 或 #2)。
public SpriteRenderer imageToDisplay;
string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png";
void Start()
{
StartCoroutine(loadSpriteImageFromUrl(url));
}
IEnumerator loadSpriteImageFromUrl(string URL)
{
WWW www = new WWW(URL);
while (!www.isDone)
{
Debug.Log("Download image on progress" + www.progress);
yield return null;
}
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log("Download failed");
}
else
{
Debug.Log("Download succes");
Texture2D texture = new Texture2D(1, 1);
www.LoadImageIntoTexture(texture);
Sprite sprite = Sprite.Create(texture,
new Rect(0, 0, texture.width, texture.height), Vector2.zero);
imageToDisplay.sprite = sprite;
}
}
4.使用MeshRenderer 组件:
主要用于 3D 对象和带有 Rigidbody 和 2D Colliders 的 3D 物理模拟。如果没有,请使用上面的 UI(#1 或 #2)。只需使用带有MeshRenderer 的平面、四边形或立方体。
public MeshRenderer imageToDisplay;
string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png";
void Start()
{
StartCoroutine(loadSpriteImageFromUrl(url));
}
IEnumerator loadSpriteImageFromUrl(string URL)
{
WWW www = new WWW(URL);
while (!www.isDone)
{
Debug.Log("Download image on progress" + www.progress);
yield return null;
}
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log("Download failed");
}
else
{
Debug.Log("Download succes");
Texture2D texture = new Texture2D(1, 1);
www.LoadImageIntoTexture(texture);
imageToDisplay.material.mainTexture = texture;
}
}
新的 Unity 版本:
WWW API 现在似乎已被弃用。现在应该使用UnityWebRequest。
public Image imageToUpdate;
void Start()
{
StartCoroutine(downloadImage());
}
IEnumerator downloadImage()
{
string url = "http://wallpaper-gallery.net/images/hq-images-wallpapers/hq-images-wallpapers-12.jpg";
UnityWebRequest www = UnityWebRequest.Get(url);
DownloadHandler handle = www.downloadHandler;
//Send Request and wait
yield return www.SendWebRequest();
if (www.isHttpError || www.isNetworkError)
{
UnityEngine.Debug.Log("Error while Receiving: " + www.error);
}
else
{
UnityEngine.Debug.Log("Success");
//Load Image
Texture2D texture2d = new Texture2D(8, 8);
Sprite sprite = null;
if (texture2d.LoadImage(handle.data))
{
sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), Vector2.zero);
}
if (sprite != null)
{
imageToUpdate.sprite = sprite;
}
}
}
您还可以使用UnityWebRequestTexture.GetTexture 和DownloadHandlerTexture.GetContent 功能更快地下载、处理和获取图像。
IEnumerator downloadImage()
{
string url = "http://wallpaper-gallery.net/images/hq-images-wallpapers/hq-images-wallpapers-12.jpg";
UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);
DownloadHandler handle = www.downloadHandler;
//Send Request and wait
yield return www.SendWebRequest();
if (www.isHttpError || www.isNetworkError)
{
UnityEngine.Debug.Log("Error while Receiving: " + www.error);
}
else
{
UnityEngine.Debug.Log("Success");
//Load Image
Texture2D texture2d = DownloadHandlerTexture.GetContent(www);
Sprite sprite = null;
sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), Vector2.zero);
if (sprite != null)
{
imageToUpdate.sprite = sprite;
}
}
}