C# 为什么Resources.Load在没有systemTypeInstance的情况下无法工作

C# 为什么Resources.Load在没有systemTypeInstance的情况下无法工作,c#,unity3d,unity5,C#,Unity3d,Unity5,UnityResource.Load有两个重载方法——一个只包含指向资产的路径,另一个要求输入systemTypeInstance类型。没有任何信息说明我为什么要使用这种或那种方法。但当我尝试Resources.Load时,只有一个参数返回null,添加第二个参数一切正常。例如 Sprite asd=Resources.Load(“test”)作为Sprite返回null,但 Sprite asd=Resources.Load(“test”,typeof(Sprite))作为Sprite返回位于

Unity
Resource.Load
有两个重载方法——一个只包含指向资产的路径,另一个要求输入systemTypeInstance类型。没有任何信息说明我为什么要使用这种或那种方法。但当我尝试Resources.Load时,只有一个参数返回null,添加第二个参数一切正常。例如
Sprite asd=Resources.Load(“test”)作为Sprite返回null,但

Sprite asd=Resources.Load(“test”,typeof(Sprite))作为Sprite返回位于
“资产/资源/测试”
的精灵。为什么我必须添加第二个参数?为什么它是必需的?

在Unity中,
精灵
是一种纹理类型,因此不带type参数的调用很可能返回
纹理2d
,然后无法投射(如果在Unity的项目窗口中查看,精灵本质上是纹理的子资产)

通过一些调试,这应该很容易确定。请先尝试将其保存为
对象
,连接调试器,然后在强制转换之前查看调用实际返回的内容:

Object testObj = Resources.Load("test");
Texture text = testObj as Texture2D; // Probably a valid Texture2D
Sprite spr = testObj as Sprite; // Probably null
为什么我必须添加第二个参数?为什么有必要

1
Sprite asd=Resources.Load(“test”)作为Sprite;
不工作并返回null的使用下面的重载:

public static Object Load(string path);
public static Object Load(string path, Type systemTypeInstance);

2
Sprite asd=Resources.Load(“test”,typeof(Sprite))作为Sprite;
按照预期工作,使用以下重载:

public static Object Load(string path);
public static Object Load(string path, Type systemTypeInstance);
还有其他使用泛型的重载


还有其他使用泛型的重载,但这两种重载在这个问题上很重要

当您导入图像并将纹理类型设置为“精灵”(2D和UI)时,它会变成一种类型。问题是#1中的第一个重载使用Unity作为默认类型,而不是
Sprite
。它还返回Unity
对象
。如下所示:

public static Object Load(string path)
{
    return Load(path, typeof(Object));
}
第一个代码的问题是当您使用
作为精灵
从Unity的
对象
精灵
执行强制转换时。如果您作为Unity的
对象
执行强制转换,它应该可以工作

例如:

使用
Resources.Load
函数而不使用第二个参数的下列操作有效

//OK
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object;
asd变量不应
null
。它应加载对象,但您不能将其强制转换为
Sprite

现在,当您将其转换为
Sprite
时,它将为
null
,因为无法将Unity的
对象
转换为
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;

2。第二个用于加载文件,如图像(.png,jpeg)和音频、视频、fbx.文件

例如,在资源文件夹中加载fbx文件:

//OK
Mesh model = Resources.Load("test", typeof(Mesh)) as Mesh;
//Not Ok
Mesh model2 = Resources.Load("test") as Mesh;
最后,如果要加载的
对象
不是预制件,则不能将
UnityEngine.Object
转换为任何其他类型。如果是预制件,则可以。如果是图像、音频、视频等文件,则无法将
对象
转换为该类型的文件。甚至无法将其转换为
GameObject