c# - 为什么 Resources.Load 在没有 systemTypeInstance 的情况下不起作用

标签 c# unity3d

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?

1Sprite asd = Resources.Load("test") as Sprite;工作并返回空值使用下面的重载:

public static Object Load(string path);

2Sprite 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 执行转换时 ObjectSpriteas Sprite .如果您按照 Unity 的 Object 进行转换,它应该可以工作。

例子:

以下使用Resources.Load没有第二个参数的函数 works:

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

asd 变量不应该null .它应该加载该对象,但您不能将其转换为 Sprite .

现在,当您将其转换为 Sprite , 它将是 null因为你不能转换Unity的ObjectSprite .阅读以下代码的注释:

//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/

相关文章:

c# - 使用 RegEx 解析和编辑统一动画剪辑

c# - 无论垂直滚动条效果如何,控件的位置

c# - 模式 [xx_- ].[xx_- ] C# 的正则表达式

c# - 从 asp :Repeater with Button 中删除行

c# - 将 GameObject 转换回通用类型 <T>

c# - 在检查器中设置值是否与在 Unity 中设置默认值相同?

unity3d - 线框着色器 : How to display quads and not triangles?

c# - 从 ID 的 C# 列表中删除 mysql 服务器中的行

C#:CompareTo(String) 和 Equals(String) 有什么区别?

c# - 如何解决 IEnumerator(Unity, C#) 的错误?