Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过代码检索内置UI精灵_C#_Unity3d_Resources - Fatal编程技术网

C# 通过代码检索内置UI精灵

C# 通过代码检索内置UI精灵,c#,unity3d,resources,C#,Unity3d,Resources,Unity中包含大约7个精灵,在创建UI时使用。我想通过代码访问这些,包括UISprite、UIMask、旋钮、背景和下面截图中圈出的其他内容 我深入研究了UI源代码,找到了它们在脚本中声明的所有位置 在编辑器中,我可以使用GetBuiltinExtraResource函数检索它们: Sprite img = UnityEditor.AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/InputFieldBackground

Unity中包含大约7个精灵,在创建UI时使用。我想通过代码访问这些,包括UISprite、UIMask、旋钮、背景和下面截图中圈出的其他内容

我深入研究了UI源代码,找到了它们在脚本中声明的所有位置

在编辑器中,我可以使用GetBuiltinExtraResource函数检索它们:

Sprite img = UnityEditor.AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/InputFieldBackground.psd");
Debug.Log(img); //NOT NULL
尝试了
typeof(Sprite)
而不是
typeof(UnityEngine.Object)
,但也失败了

如何在独立构建中而不是在编辑器中访问这些内置精灵

注意


我不想使用预设或公共变量来完成这项工作,这需要先手动完成。这是我目前的做法。我只想访问构建中已打包的内置精灵。

嗯。。。只是复印一下。只有七个文件,将它们复制到资源/纹理(如果必须,请创建),然后使用以下命令调用它们:

Sprite knob = Resources.Load<Sprite>("Textures/Knob.psd") as Sprite;
我在unity文档中找到的。现在我知道这是在谈论一种材料。。。但在我看来,您可以手动将有问题的精灵添加到您的资产中,这样可以确保它们被引用并包含在构建中。

我找到了答案,并且


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

我还面临一个问题,即我在脚本中创建的按钮与在Unity Editor中创建的按钮不同,因为我无法检索Unity内置资源。但我在编辑器中制作了一个预制,并在运行时将其加载到游戏对象中以解决此问题。现在它通过了

我想说,由于一天之后没有人能够提供帮助,所以应该考虑手动方式。很容易有一些管理器,你可以在其中拖动精灵,这样你就有了对它们的引用。将其转化为预制件,并对每个项目进行一次性拖动。然后,您可以使用SpriteManager.Instance.UISprite通过代码获取它们。@程序员,在选择“Resources.GetBuiltinResource”时,您确定这些精灵包含在您的构建中吗?@Hristo是的,它们是Unity中包含的默认图像。它们应该包含在构建中。它还可以找到默认材质,但不能找到那些图像。@Everts我现在就是这样做的,但我问这个问题是想看看是否有人知道如何使用
资源动态地完成它。GetBuiltinResource
。这是我制作的一个插件,可以重新获取这些图片,我不想让用户做任何额外的步骤。你知道Unity是如何丢弃未使用的资产的。如果没有明确的引用,则可能是您的精灵没有打包。您最好将它们打包到资源中的文件夹中,这样您就可以确保它们在那里,并知道在代码中从何处获取它们。用户不必做任何事情。我会避免复制它们,因为如果用户引用了它们,Unity在构建它时会有此文件的副本。这是一种简单的方法,而不是正确的方法,最好使用
AssetDatabase.CreateAsset
您可以始终在
AssetDatabase.ImportAset(AssetDatabase.GetAssetPath)上装配一个按钮());
一张有问题的图片,然后构建和部署并点击按钮,这样你可以确保在unity构建时它被添加到你的资产中,而不是被剥离。或者,如果由于某种原因文件没有被添加,它将崩溃并烧掉。抱歉,但不确定你所说的“装配一个按钮”
OnGUI(){if(GUI.button)是什么意思(新的Rect(5,5100,40),“CheckForFile”){//您需要调整路径,以便在其中检查资产。AssetDatabase.ImportAssetSet(AssetDatabase.GetAssetPath());};
您可以出于调试目的尝试/catch,但这有点多余,因为这里的空指针告诉您需要知道的内容。我认为您误解了这个问题。您在回答中提供的两个链接都使用的是编辑器API,它只在编辑器中工作。这些API只能在编辑器中使用,如
AssetDatabase.GetBuiltinExtraResource
我在问题中提到过。它不能在构建中使用。它甚至不会构建,因为您不能在构建中使用它。API的等效构建版本是
Resources.GetBuiltinResource
,但它不起作用,所以我想了解它为什么不起作用,以及如何在不使用发布的情况下访问内置资源或复制它们。
UnityEngine.Object img = Resources.GetBuiltinResource(typeof(UnityEngine.Object), "UI/Skin/InputFieldBackground.psd");
Debug.Log(img); NULL
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));
}