为什么没有systemTypeInstance,Resources.Load不起作用

时间:2017-11-01 20:37:03

标签: c# unity3d unity5

Unity Resource.Load function有两个重载方法 - 一个只有资源路径,另一个要求输入类型systemTypeInstance。没有信息为什么我应该使用一种方法或另一种方法。但是,当我尝试只使用一个参数的Resources.Load时,它返回null,并且添加第二个参数一切正常。例如 Sprite asd = Resources.Load("test") as Sprite;返回null,但是 Sprite asd = Resources.Load("test", typeof(Sprite)) as Sprite;会在"Assets/Resources/test"返回精灵。我必须添加第二个参数?为什么这是必要的?

2 个答案:

答案 0 :(得分:1)

  

我必须添加第二个参数?为什么有必要?

执行工作并返回null的

1 Sprite asd = Resources.Load("test") as Sprite;使用以下重载:

public static Object Load(string path);

2 Sprite asd = Resources.Load("test", typeof(Sprite)) as Sprite;按预期工作正在使用以下重载:

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

还有其他使用泛型的重载。

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

导入图像并将纹理类型设置为 Sprite(2D和UI)时,它将变为JPQL的类型。问题是#1 中的第一个重载是使用Unity的Sprite作为默认类型而不是Sprite。它还返回Unity Object。它看起来像这样:

public static Object Load(string path)
{
    return Load(path, typeof(Object));
}

第一个代码的问题是当您使用Object从Unity Spriteas 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;

同样,由于转化为null,它会返回Sprite

这就是添加第二个加载函数的原因:

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

我不应该使用一种或另一种方法。

1 第一个用于加载预制件。创建GameObject时,可以将其作为预制件并将其放在Resources文件夹中。

//OK
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object;
//OK
GameObject obj2 = asd as GameObject;

OR

//OK
UnityEngine.Object asd = (GameObject)Resources.Load("test");

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

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

//OK
Mesh model = Resources.Load("test", typeof(Mesh)) as Mesh;
//Not Ok
Mesh model2 = Resources.Load("test") as Mesh;

最后,如果要加载的UnityEngine.Object 不是预制件,则无法将Object转换为任何其他类型。你可以,如果它是预制件。如果它是图像,音频,视频等文件,则无法将Object转换为该类型的文件。甚至无法将其转换为GameObject

答案 1 :(得分:0)

在Unity中,Sprite是一种纹理,因此没有类型参数的调用可能会返回Texture2D然后无法转换(精灵本质上是一个子) - 如果你在Unity的 Project 窗口中查看纹理的纹理。

通过一些调试很容易确定。尝试先将其保存为Object,附加调试器,然后在投射前查看该调用实际返回的内容:

Object testObj = Resources.Load("test");
Texture text = testObj as Texture2D; // Probably a valid Texture2D
Sprite spr = testObj as Sprite; // Probably null