我需要添加第二个参数吗?为什么是必要的?
1.
Sprite asd = Resources.Load("test") as Sprite;
不起作用并返回 null,使用下面的重载方法:
public static Object Load(string path)
2.Sprite asd = Resources.Load("test", typeof(Sprite)) as Sprite;
这段代码按照预期工作,使用了下面的重载:
public static Object Load(string path, Type systemTypeInstance);
还有其他使用泛型的重载。
还有其他使用泛型的重载,但这两个对于这个问题很重要。
当你导入图像并将纹理类型(Texture Type)设置为Sprite(2D and UI)时,它成为了一种Sprite
类型。问题在于#1中的第一个重载使用Unity的Object
作为默认类型而不是Sprite
。它也返回Unity的 Object
。代码如下:
public static Object Load(string path)
{
return Load(path, typeof(Object));
}
第一段代码的问题在于,当你使用
as Sprite
将 Unity 的
Object
强制转换为
Sprite
时。如果你将强制转换为 Unity 的
Object
,它应该可以工作。
例如:
以下使用
Resources.Load
函数而不带第二个参数的代码
有效:
//OK
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object
asd变量不应该为null
。它应该加载对象,但是您无法将其转换为Sprite
。
现在,当您将其转换为Sprite
时,它将会变成null
,因为您无法将Unity的Object
转换为Sprite
。请阅读以下代码中的注释:
//OK
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object;
//NOT OK(NULL)
Sprite obj1 = asd as Sprite;
//NOT OK(NULL) + InvalidCastException
Sprite obj2 = (Sprite)asd;
由于将类型转换为Sprite
,因此它再次返回null
。
这就是为什么添加了第二个加载函数的原因:
public static Object Load(string path, Type systemTypeInstance);
没有信息告诉我为什么要使用一个方法而不是另一个。
1.第一种方法用于加载预制体。当你创建一个游戏对象时,你可以将它制作成预制体并放入资源文件夹中。
//OK
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object;
//OK
GameObject obj2 = asd as GameObject;
或者
//OK
UnityEngine.Object asd = (GameObject)Resources.Load("test")
2. 第二种方法用于加载诸如图像(.png, jpeg)、音频、视频、fbx文件等的文件。
例如,在资源文件夹中加载fbx文件:
//OK
Mesh model = Resources.Load("test", typeof(Mesh)) as Mesh
//Not Ok
Mesh model2 = Resources.Load("test") as Mesh
最后,如果要加载的 Object
不是预制体,就无法将 UnityEngine.Object
转换为任何其他类型。如果它是预制体,则可以进行转换。如果它是像图片、音频、视频这样的文件,则无法将 Object
转换为该类型的文件。甚至无法将其转换为 GameObject
。