0

我想在游戏中使用 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 ();

但是,我想知道在游戏中是否有任何可能的方法来做到这一点。这可能吗?

4

2 回答 2

1

我忘记了有办法做到这一点。

使用编辑器脚本,我们将节省磁盘编辑​​器 guiskin:

        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 文件夹中,并使用以下命令加载它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")

于 2019-01-11T20:43:41.787 回答
1

编辑器类不能在游戏中使用。

如果您正在为游戏内开发 UI,您应该使用Unity UI 系统,带有 的Canvas,然后像 Horizo​​ntalLayoutGroup 这样的东西可以为您排序。

但是,如果您打算使用 IMGUI,这是OnGUI做用户界面的传统方式,我强烈反对您这样做,您可以使用带有GUILayout.BeginHorizo​​ntal的GUI 皮肤

希望我理解正确并能有所帮助。

此致。

于 2019-01-11T03:48:51.297 回答