Unity Resource.Load
function有两个重载方法 - 一个只带有 Assets 路径,另一个要求类型 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 。为什么我必须添加第二个参数?为什么需要它?
最佳答案
What for I have to add second param? Why is it necessary?
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);
还有其他使用泛型的重载。
还有其他使用泛型 的重载,但这两个在这个问题中很重要。
当您导入图像并将Texture Type 设置为Sprite(2D 和UI) 时,它变成了 Sprite
的类型.问题是 #1 中的第一个重载使用的是 Unity 的 Object
默认类型不是 Sprite
.它还返回 Unity Object
.它看起来像这样:
public static Object Load(string path)
{
return Load(path, typeof(Object));
}
第一个代码的问题是当您从 Unity 执行转换时 Object
至 Sprite
与 as Sprite
.如果您按照 Unity 的 Object
进行转换,它应该可以工作。
例子:
以下使用Resources.Load
没有第二个参数的函数 works:
//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
由于 Actor Sprite
.
这就是添加第二个加载函数的原因:
public static Object Load(string path, Type systemTypeInstance);
There is no info why I should use one method or another.
1。第一个用于加载预制件。当您创建一个 GameObject 时,您可以将其制成预制件并将其放在 Resources 文件夹中。
//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等文件。文件。
例如加载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
.
关于c# - 为什么 Resources.Load 在没有 systemTypeInstance 的情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47063260/