我正在尝试将图片从网址加载到GameObject。
我找到了下一个教程:
https://www.youtube.com/watch?v=8UK2EsKBzv8
下载成功,但我看不到图像。
我做错了什么?
// Use this for initialization
void Start () {
StartCoroutine(loadSpriteImageFromUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png"));
}
IEnumerator loadSpriteImageFromUrl(string URL)
{
// Check internet connection
if (Application.internetReachability == NetworkReachability.NotReachable)
{
yield return null;
}
var www = new WWW(URL);
Debug.Log("Download image on progress");
yield return www;
if (string.IsNullOrEmpty(www.text))
{
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.one / 2);
GetComponent<SpriteRenderer>().sprite = sprite; // Change current sprite
}
}
修改
按照ScriptRenderer的建议移动到UI Image后,代码如下所示:
IEnumerator loadSpriteImageFromUrl(string URL, GameObject cell)
{
// Check internet connection
if(Application.internetReachability == NetworkReachability.NotReachable)
{
yield return null;
}
var www = new WWW(URL);
Debug.Log("Download image on progress");
yield return www;
if(string.IsNullOrEmpty(www.text))
{
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.one/2);
cell.AddComponent<Image>();
cell.GetComponent<Image>().sprite = sprite;
}
}
但是我的下一个结果是屏幕(而不是网址中的图片):
答案 0 :(得分:2)
你的代码很好。下载的图像未显示,因为您处于场景视图中且相机远离它。
选择附加脚本的GameObject,然后按 F 。它应该放大它,你会看到下载的图像。有关如何重置Unity布局以恢复游戏视图的信息,请参阅here。
如果仍然无法看到图像,则SpriteRenderer
不在相机前面。从屏幕截图中,其位置为0
,0
,0
,因此请确保相机的位置为0
,0
,{{ 1}}。
显示图片的正确方法:
要在Unity中简单地显示图像,请使用-10
或Image
组件。建议使用RawImage
,因为在更改纹理时它不会产生垃圾。你应该已经知道如何从这个
如果您需要将Rigidbody或2D Colliders附加到该图像,请使用RawImage
或SpriteRenderer
3D对象显示MeshRenderer
。
以下是在Unity中显示图像的四种方法。如果根本不需要物理或碰撞,建议使用#2 :
1 。使用image
组件:
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);
2 。使用Texture2D texture = new Texture2D(1, 1);
texture.LoadImage(www.bytes);
texture.Apply();
组件(推荐):
RawImage
3 。使用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;
}
}
组件:
主要用于 Rigidbody2D 和 2D碰撞器的2D物体和2D物理模拟。如果没有,请使用上面的用户界面(#1 或#2 )。
SpriteRenderer
4 。使用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;
}
}
组件:
主要用于使用 Rigidbody 和 2D Colliders 进行3D物体和3D物理模拟。如果没有,请使用上面的用户界面(#1 或#2 )。只需使用一个平面,四边形或一个MeshRenderer
的立方体。
MeshRenderer
新的Unity版本:
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;
}
}
API现在似乎已被弃用。现在应该使用WWW
。
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