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"
返回精灵。我必须添加第二个参数?为什么这是必要的?
答案 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 Sprite
到as 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