Можно ли использовать EditorStyle на Unity в игре для создания горизонтальных групп кнопок? - PullRequest
0 голосов
/ 11 января 2019

Я хочу использовать EditorStyles в игровой ситуации. Я проверил класс EditorStyles и понял, что все происходит из:

        private GUIStyle GetStyle(string styleName)
        {
            GUIStyle s = GUI.skin.FindStyle(styleName) ?? EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector).FindStyle(styleName);
            if (s == null)
            {
                Debug.LogError("Missing built-in guistyle " + styleName);
                s = GUISkin.error;
            }
            return s;
        }

Скопировано из: https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/GUI/EditorStyles.cs#L425

Ссылка вызова здесь: https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/GUI/EditorStyles.cs#L333

И вот что я использую (в редакторе): https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/GUI/EditorStyles.cs#L71

Все это для выполнения следующих действий:

...

Я должен сделать следующее:

 EditorGUILayout.BeginHorizontal ();
 if (GUILayout.Button ("Select", EditorStyles.miniButtonLeft)) {
 }
 if (GUILayout.Button ("Revert", EditorStyles.miniButton)) {
 }
 if (GUILayout.Button ("Apply", EditorStyles.miniButtonRight)) {
 }
 EditorGUILayout.EndHorizontal ();

Но я хочу знать, есть ли какой-нибудь возможный способ сделать это в игре. Это возможно?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я забыл, что был способ сделать это.

С помощью скрипта Editor мы сохраним на диске guiskins редактора:

        bool saveAssets = false;
        foreach (var editorSkin in Enum.GetValues(typeof(EditorSkin)).Cast<EditorSkin>())
        {
            string file = Path.Combine("Assets", "StreamingAssets", $"{editorSkin.ToString()}.guiskin");

            if (!File.Exists(file))
            {
                AssetDatabase.CreateAsset(Instantiate(EditorGUIUtility.GetBuiltinSkin(editorSkin)), file);
                saveAssets = true;
            }
        }

        if (saveAssets)
            AssetDatabase.SaveAssets();

И тогда мы можем просто сохранить в папке «Ресурсы» и загрузить ее с Resources.Load:

...

//
// Summary:
//     Enum that selects which skin to return from EditorGUIUtility.GetBuiltinSkin.
public enum GlobalSkin
{
    //
    // Summary:
    //     The skin used for game views.
    Game = 0,

    //
    // Summary:
    //     The skin used for inspectors.
    Inspector = 1,

    //
    // Summary:
    //     The skin used for Scene views.
    Scene = 2
}

А затем просто создайте метод для их возврата:

    // Get one of the built-in GUI skins, which can be the game view, inspector or scene view skin as chosen by the parameter.
    public static GUISkin GetBuiltinSkin(GlobalSkin skin)
    {
        return Resources.Load<GUISkin>($"Skins/{skin.ToString()}");
    }

Все остальное делается с помощью GUISkin.FindStyle("whatever").

0 голосов
/ 11 января 2019

Классы редактора нельзя использовать в игре.

Если вы разрабатываете пользовательский интерфейс для игры, вы должны использовать систему Unity UI , систему с Canvas, тогда что-то вроде HorizontalLayoutGroup может отсортировать вещи для вас.

Но если вы намереваетесь использовать IMGUI, это устаревший OnGUI способ создания пользовательского интерфейса, и я настоятельно рекомендую вам сделать это, вы можете использовать GUI Skin с GUILayout .BeginHorizontal .

Надеюсь, что я правильно понял и мог бы вам чем-то помочь.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...