Пользовательский значок на ScriptableObject на Unity3d

Я делаю некоторые элементы для своей игры, чтобы облегчить разработку, я хочу добавить к своим элементам пользовательские значки, которые ScriptableObjects, как я могу это сделать? Я знаю, как поместить значок в папку Gizmo с тем же именем, что и сценарий, но значки должны отличаться для разных элементов с одинаковым сценарием.

2 ответа

Вы можете добавить поле RawImage в свой объект сценариев.

[SerializeField] RawImage imageIcon;

Отредактируйте, чтобы ответить на ваш дополнительный вопрос:

  1. Создайте новый объект с вашим объектом сценариев
  2. Нажмите на вновь созданный объект
  3. Откройте инспектор и нажмите на значок:
  4. Нажмите Другое
  5. Выберите свое изображение.

Кроме того, вы можете проверить этот пакет ресурсов и создать значки на основе данных: https://assetstore.unity.com/packages/tools/gui/asseticons-100547

  1. Создайте поле "icon" в вашем подклассе ScriptableObject;
  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 будет использовать значок по умолчанию и сохранять для всех пользовательских подклассов 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 ();


            }
        }

Другие вопросы по тегам