在学习保卫萝卜游戏的案例中,制作地图编辑器的时候,有一个加载地图的xml文件功能,读取本地背景图片时,教程中用到的 WWW 函数在2022年之后的Unity中已被弃用
//加载图片
public static IEnumerator LoadImage(string url, SpriteRenderer render)
{
WWW www = new WWW(url);
while (!www.isDone)
yield return www;
Texture2D texture = www.texture;
Sprite sp = Sprite.Create(
texture,
new Rect(0, 0, texture.width, texture.height),
new Vector2(0.5f, 0.5f));
render.sprite = sp;
}
上网上搜了一下,使用 UnityWebRequest 替代 WWW,参考网上例子,替换成了以下代码
//加载图片
// url 图片加载地址
// render 将读取到的图片加载到某个渲染器里渲染
public static IEnumerator LoadImage(string url, SpriteRenderer render)
{
UnityWebRequest uwr = UnityWebRequest.Get(url);
yield return uwr.SendWebRequest();
if (uwr.result == UnityWebRequest.Result.Success) {
Debug.Log(url);
Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
Sprite sp = Sprite.Create(
texture,
new Rect(0, 0, texture.width, texture.height),
new Vector2(0.5f, 0.5f));
render.sprite = sp;
}
else {
Debug.Log(uwr.error);
}
}
替换后遇到了以下bug,大致意思是说某个类强转无效,加了debug查看url的读取路径也没问题
代码报错提示是这行的强转无效
但是查看源码后发现 GetContent 方法返回值就是 Texture2D,应该是没问题的,前面的代码看起来也没什么问题
在谷歌查找这类报错,也没找到什么解决我这个问题的回答,然后我去问了一下chatgpt
使用chatgpt给出的代码没有遇到报错,逐步排查chatgpt和我的代码区别后,发现问题出在获取uwr的函数上(不加using命名空间看起来也不会报错,不过还是先加上吧)
看了一下这两个函数的区别,返回值也都是 UnityWebRequest 看不出来有什么区别
最终返回的也都是这个构造函数
弄不明白,可能是某个参数出的问题?先这样吧,至少不报错了,最后修改后的代码如下
//加载图片
// url 图片加载地址
// render 将读取到的图片加载到某个渲染器里渲染
public static IEnumerator LoadImage(string url, SpriteRenderer render)
{
using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url)) {
yield return uwr.SendWebRequest();
if (uwr.result == UnityWebRequest.Result.Success) {
Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
Sprite sp = Sprite.Create(
texture,
new Rect(0, 0, texture.width, texture.height),
new Vector2(0.5f, 0.5f));
render.sprite = sp;
}
else {
Debug.Log("Failed to load image: " + uwr.error);
}
}
}
没有再报错了
总结:尽管用chatgpt直接写代码很鸡肋,但是在解决一些偏门问题的时候还是挺有帮助的,另外希望有大佬能解答一下报错的根本原因😁