【发布时间】:2018-05-18 05:15:18
【问题描述】:
Unity 中包含大约 7 个 Sprite,它们会在您创建 UI 时使用。我想通过代码访问这些。这些包括 UISprite、UIMask、Knob、Background 和其他如下屏幕截图中圈出的内容。
我深入挖掘了 UI 源代码,发现了它们在 MenuOptions.cs 脚本中声明的所有位置。
private const string kStandardSpritePath = "UI/Skin/UISprite.psd";
private const string kBackgroundSpritePath = "UI/Skin/Background.psd";
private const string kInputFieldBackgroundPath = "UI/Skin/InputFieldBackground.psd";
private const string kKnobPath = "UI/Skin/Knob.psd";
private const string kCheckmarkPath = "UI/Skin/Checkmark.psd";
private const string kDropdownArrowPath = "UI/Skin/DropdownArrow.psd";
private const string kMaskPath = "UI/Skin/UIMask.psd";
在编辑器中,我可以使用 GetBuiltinExtraResource 函数检索它们:
Sprite img = UnityEditor.AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/InputFieldBackground.psd");
Debug.Log(img); //NOT NULL
很遗憾,AssetDatabase.GetBuiltinExtraResource 来自 UnityEditor 命名空间,无法在构建或独立程序中工作。它甚至无法编译。
我尝试将Resources.GetBuiltinResource 用于构建和独立,但它总是返回null。它找不到内置的精灵。
UnityEngine.Object img = Resources.GetBuiltinResource(typeof(UnityEngine.Object), "UI/Skin/InputFieldBackground.psd");
Debug.Log(img); NULL
尝试typeof(Sprite) 而不是typeof(UnityEngine.Object),但也失败了。
如何在独立版本而不是编辑器中访问这些内置精灵?
注意:
我不想使用预制件或公共变量来执行此操作,这需要先手动执行操作。这是我已经在做的当前方式。我只想访问已经打包在构建中的内置精灵。
【问题讨论】:
-
我会说,因为一天之后没有人能够提供帮助,所以应该考虑手动方式。简单的做法是让一些管理器在其中拖动精灵,以便引用它们。把它变成一个预制件,每个项目一次拖动。然后你可以使用 SpriteManager.Instance.UISprite 通过代码获取它们。
-
@Programmer,在选择“Resources.GetBuiltinResource”时,您确定这些精灵包含在您的构建中吗?
-
@Hristo 是的,它们是 Unity 中包含的默认图像。它们应该包含在构建中。它还可以找到默认材料,但不能找到那些图像。
-
您知道 Unity 如何丢弃未使用的资源。如果没有明确引用它们,则可能是您的精灵没有打包。您最好将它们打包到资源中的文件夹中,这样您就可以确定它们在那里并且知道在代码中的何处获取它们。用户无需执行任何操作。
-
@Everts 我知道它会丢弃未使用的资产。 我今天将使用编辑器中使用的所有图像重新进行测试,看看是否是问题所在。虽然,我在这方面取得了很大进展。从
<UnityInstallPath>\Unity\Editor\Data\Resources文件夹中获取unity_builtin_extra。它没有扩展名。添加.asset作为unity_builtin_extra文件的扩展名并将其拖到您的项目中。您将看到我想要访问的所有文件的完整列表。