【问题标题】:Unity Resources.Load<Sprite> vs as SpriteUnity Resources.Load<Sprite> 与作为 Sprite
【发布时间】:2021-07-20 06:22:53
【问题描述】:

我尝试使用此代码更改我的对象的图像(使用 作为 Sprite 演员):

GetComponent<SpriteRenderer>().sprite = Resources.Load("GameObjects/Tiles/Hole") as Sprite;

它不起作用,但它起作用了(使用 ):

GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("GameObjects/Tiles/Hole");

有什么区别?

【问题讨论】:

  • 您的项目中有多个名为“Hole”的文件吗?一个命令指定要搜索的资产类型,但另一个命令不指定。根据您的文件结构,他们可能会因此查找不同的结果。

标签: unity3d resources load sprite renderer


【解决方案1】:

FunctionR 的答案可能是更常见的答案,我在这里可能错了,但我相信Load()Load&lt;T&gt;() 之间的区别在于Load&lt;T&gt;() 检查元数据。 “孔”不是Sprite,它是一个图像文件。 Load() 找到该图像文件并将其加载为文件类型的默认类型,在本例中为 Texture2D

换句话说,您不能使用as Sprite,因为您不能将castTexture2D 转换为Sprite。但是,您可以使用

Texture2D texure = Resources.Load("GameObjects/Tiles/Hole");
Rect rect        = {whatever};
Vector2 pivot    = {whatever};

Sprite.Create(texture, rect, pivot);

但这需要您知道您尝试加载的Sprite 的大小。

总之,Load() 仅根据您正在加载的文件类型来处理它,Load&lt;T&gt;() 包括元数据。

【讨论】:

    【解决方案2】:
    Resources.Load("GameObjects/Tiles/Hole") as Sprite;
    

    您的资源文件夹中有另一个“洞”。这个other-Hole不是Sprite。因此,当您使用 as Sprite 时,它根本无法强制转换为 1,也不会抛出异常(在那一行),因为:

    as 运算符类似于强制转换操作。但是,如果转换 不可能,因为返回 null 而不是引发异常。


    Resources.Load<Sprite>("GameObjects/Tiles/Hole");
    

    在工作代码中,您指定所需的文件,Sprite,以便它找到正确的文件。

    【讨论】:

    • 在 Windows 资源管理器中,我有一个名为 Hole.png 的文件,如果我 Debug,还有一个名为 Hole.png.meta 的文件.Log(Resources.Load("GameObjects/Tiles/Hole")); 那么它是一个 Sprite 如果我 Debug.Log((Resources.Load( "GameObjects/Tiles/Hole"))); 那么它是一个 Texture2D.. 那么 .meta 文件是一个 Texture2D 文件吗?然而,在 Unity 项目资源管理器中,我只有一个名为 Hole 的资源文件。
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2017-01-19
    • 2014-10-22
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多