Unity3d上ScriptableObject上的自定义图标

问题描述 投票:2回答:2

我为我的游戏做一些项目使开发更容易,我希望为我的项目添加自定义图标,这是ScriptableObjects,我该怎么做?我知道将图标放在与脚本同名的Gizmo文件夹上的技巧,但对于具有相同脚本的不同项目,图标应该是不同的

c# unity3d unity5
2个回答
2
投票

您可以将RawImage字段添加到可编写脚本的对象中。

[SerializeField] RawImage imageIcon;

编辑以回答您的其他问题:

  1. 使用可编写脚本的对象创建新对象
  2. 单击新创建的对象
  3. 查看检查器并单击图标:enter image description here
  4. 单击其他
  5. 选择你的形象。

此外,您可以查看此资产包并根据数据创建图标:https://assetstore.unity.com/packages/tools/gui/asseticons-100547


0
投票
  1. 在ScriptableObject子类中创建Field“icon”;
  2. 为ScriptableObject子类创建自定义编辑器;
  3. 在编辑器中创建Target属性


    public StateMachine Target {
                get {
                    return this.target as StateMachine;
                }
        }

  1. 覆盖此方法


    public override Texture2D RenderStaticPreview(string assetPath, UnityEngine.Object[] subAssets, int width, int height) {


            Texture2D newIcon = new Texture2D(width, height);


            if (Target.icon != null) {
                EditorUtility.CopySerialized(Target.icon, newIcon);
                return newIcon;
            } else {

                Texture2D defaultCustomIcon = AssetDatabase.LoadAssetAtPath("Assets/WinxProduction/Editor/Editor Default Resources/StateMachine Icon.png", typeof(Texture2D)) as Texture2D;

                if (defaultCustomIcon != null) {




                   EditorUtility.CopySerialized(defaultCustomIcon, newIcon);

                    Target.icon=newIcon;

                    AssetDatabase.AddObjectToAsset(newIcon,Target);

                    EditorUtility.SetDirty(Target);

                    return newIcon;
                }
            }

            return base.RenderStaticPreview(assetPath, subAssets, width, height);
        }

Unity Loads第一次使用默认Icon并保存所有自定义子类ScriptableObjects。如果你想拥有不同的图标然后默认你会创建一些这样的功能:



    protected void OnClickBrowseForNewIcon() {

                    string path=EditorUtility.OpenFilePanelWithFilters("Select icon","Assets",new string[]{"Icon files", "png",});

                    if(!string.IsNullOrEmpty(path)){

                        Target.icon=AssetDatabase.LoadAssetAtPath(AssetDatabaseUtility.AbsoluteUrlToAssets(path));

                        EditorUtility.SetDirty(Target);

                    }
                }

相对于绝对



    public static class AssetDatabaseUtility
        {

            public static string AbsoluteUrlToAssets(string absoluteUrl)
            {
                Uri fullPath = new Uri (absoluteUrl, UriKind.Absolute);
                Uri relRoot = new Uri (Application.dataPath, UriKind.Absolute);

                return relRoot.MakeRelativeUri (fullPath).ToString ();


            }
        }

© www.soinside.com 2019 - 2024. All rights reserved.