【问题标题】:Retrieve built-in UI sprites via code通过代码检索内置的 UI 精灵
【发布时间】: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 我知道它会丢弃未使用的资产。 我今天将使用编辑器中使用的所有图像重新进行测试,看看是否是问题所在。虽然,我在这方面取得了很大进展。从&lt;UnityInstallPath&gt;\Unity\Editor\Data\Resources 文件夹中获取unity_builtin_extra。它没有扩展名。添加.asset 作为unity_builtin_extra 文件的扩展名并将其拖到您的项目中。您将看到我想要访问的所有文件的完整列表。

标签: c# unity3d resources


【解决方案1】:

我还遇到了我在脚本中创建的按钮与在 Unity 编辑器中创建的按钮不同的问题,因为我无法检索 Unity 内置资源。但是我在编辑器中制作了一个 prefab并在运行时将其加载到GameObject中以解决此问题。现在它通过了!

【讨论】:

    【解决方案2】:

    我找到了答案herehere

    第一个链接为您提供解决方案的代码,第二个是统一站点上的内置资源 wiki,它有一个特殊的编辑器类,可以找到您需要的纹理的实际路径。我知道这不是一个完整的答案,但我觉得它对你来说已经足够了......祝你好运,让我知道!

    【讨论】:

    • 我认为您误解了这个问题。您在答案中提供的两个链接都使用仅在编辑器中有效的编辑器 API。这些 API 只能在编辑器中使用,例如我在问题中提到的 AssetDatabase.GetBuiltinExtraResource。它不能在构建中使用。它甚至不会构建,因为您不能在构建中使用它。 API 的等效构建版本是 Resources.GetBuiltinResource,但它不起作用,所以我正在寻找它为什么不起作用以及如何在不使用公共变量或复制它们的情况下访问内置资源。
    【解决方案3】:

    嗯...只是复制。只有七个文件,将它们复制到 Resources/Textures(如果需要的话)然后调用它们:

    Sprite knob = Resources.Load<Sprite>("Textures/Knob.psd") as Sprite;
    

    这将是简单的方法.. 但是为了好玩,让我们看看这个

    static void CreateMaterial()
    {
        // Create a simple material asset
    
        Material material = new Material(Shader.Find("Specular"));
        AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
    
        // Add an animation clip to it
        AnimationClip animationClip = new AnimationClip();
        animationClip.name = "My Clip";
        AssetDatabase.AddObjectToAsset(animationClip, material);
    
        // Reimport the asset after adding an object.
        // Otherwise the change only shows up when saving the project
        AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(animationClip));
    
        // Print the path of the created asset
        Debug.Log(AssetDatabase.GetAssetPath(material));
    }
    

    我在统一文档中找到了它。现在我知道它在谈论一种材料......但在我看来,您可以手动将有问题的 Sprite 添加到您的资产中,这样可以确保它们被引用并包含在构建中。

    【讨论】:

    • 我会避免复制它们,因为如果它被用户引用,Unity 构建它时会出现此文件的副本
    • 是的,这是简单的方法,而不是正确的方法,最好是使用AssetDatabase.CreateAsset,您可以随时将按钮设置到AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath()); 有问题的图片之一,然后构建和部署并点击按钮,这样你可以确保它在统一构建时被添加到你的资产中,而不是被剥离。
    • 否则如果由于某种原因没有添加文件,它会崩溃并烧毁。
    • 抱歉,但不确定您所说的“装配按钮”是什么意思
    • OnGUI(){ if(GUI.Button(new Rect(5,5,100,40),"CheckForFile")){ //you will need to adjust the path to where you want to check for your asset. AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath()); }; 您可以出于调试目的尝试/捕获,但这有点多余,因为这里的空指针告诉您需要了解的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多