为什么没有systemTypeInstance,Resources.Load无法工作

3

Unity Resource.Load 函数有两种重载方法——一种只需要路径信息,另一种则需要指定类型(Type systemTypeInstance)。但是官方文档并没有说明应该使用哪种方法。但是当我只使用一个参数调用 Resources.Load 时,它会返回 null;而添加第二个参数后,一切都正常了。例如,Sprite asd = Resources.Load("test") as Sprite; 会返回 null,但是 Sprite asd = Resources.Load("test", typeof(Sprite)) as Sprite; 则会返回位于“Assets/Resources/test”路径下的 Sprite。为什么我需要添加第二个参数?它是必须的吗?

2个回答

3
我需要添加第二个参数吗?为什么是必要的? 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


1
在Unity中,Sprite是纹理的一种类型,因此没有类型参数的调用可能会返回一个Texture2D,然后无法转换(如果在Unity的项目
Object testObj = Resources.Load("test");
Texture text = testObj as Texture2D; // Probably a valid Texture2D
Sprite spr = testObj as Sprite; // Probably null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接