Пользовательский значок на ScriptableObject на Unity3d
Я делаю некоторые элементы для своей игры, чтобы облегчить разработку, я хочу добавить к своим элементам пользовательские значки, которые ScriptableObjects
, как я могу это сделать? Я знаю, как поместить значок в папку Gizmo с тем же именем, что и сценарий, но значки должны отличаться для разных элементов с одинаковым сценарием.
2 ответа
Вы можете добавить поле RawImage в свой объект сценариев.
[SerializeField] RawImage imageIcon;
Отредактируйте, чтобы ответить на ваш дополнительный вопрос:
- Создайте новый объект с вашим объектом сценариев
- Нажмите на вновь созданный объект
- Откройте инспектор и нажмите на значок:
- Нажмите Другое
- Выберите свое изображение.
Кроме того, вы можете проверить этот пакет ресурсов и создать значки на основе данных: https://assetstore.unity.com/packages/tools/gui/asseticons-100547
- Создайте поле "icon" в вашем подклассе ScriptableObject;
- Создайте собственный редактор для своего подкласса ScriptableObject;
- Создать свойство Target в редакторе
public StateMachine Target {
get {
return this.target as StateMachine;
}
}
- переопределить этот метод
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 ();
}
}