如何通过C#脚本修改Unity编辑器中GameWindow的宽高比
在Unity编辑器中用C#修改GameWindow宽高比的实现方法
因为Unity的GameView(即GameWindow)相关的宽高比设置API并非公开接口,所以需要通过反射调用内部方法实现修改。以下是两种常用实现方式,脚本需放在Assets/Editor目录下(仅在编辑器环境生效):
方式一:直接设置宽高比值(如16:9、4:3)
这种方式会将GameWindow切换到对应的宽高比预设,代码如下:
using UnityEditor; using UnityEngine; using System.Reflection; public static class GameWindowAspectRatioTool { // 添加编辑器菜单,快速设置16:9 [MenuItem("Tools/GameWindow宽高比/设置为16:9")] public static void SetAspectRatio16_9() { SetTargetAspectRatio(16f / 9f); } // 添加编辑器菜单,快速设置4:3 [MenuItem("Tools/GameWindow宽高比/设置为4:3")] public static void SetAspectRatio4_3() { SetTargetAspectRatio(4f / 3f); } // 核心设置方法 private static void SetTargetAspectRatio(float targetRatio) { // 获取当前GameView窗口实例 var gameView = EditorWindow.GetWindow<GameView>(); if (gameView == null) return; // 反射调用GameView内部的GetSizeGroup方法 var gameViewType = typeof(GameView); var getSizeGroupMethod = gameViewType.GetMethod("GetSizeGroup", BindingFlags.Instance | BindingFlags.NonPublic); var sizeGroup = getSizeGroupMethod.Invoke(gameView, null); // 反射调用SizeGroup的SetRatio方法设置宽高比 var sizeGroupType = sizeGroup.GetType(); var setRatioMethod = sizeGroupType.GetMethod("SetRatio", BindingFlags.Instance | BindingFlags.Public); setRatioMethod.Invoke(sizeGroup, new object[] { targetRatio }); // 刷新GameView窗口 gameView.Repaint(); } }
使用说明
- 将脚本放在
Assets/Editor目录下,Unity会自动识别为编辑器扩展。 - 打开Unity编辑器顶部的
Tools/GameWindow宽高比菜单,选择对应选项即可修改GameWindow的宽高比。
方式二:设置自定义分辨率(间接修改宽高比)
如果需要固定具体的分辨率(如1920x1080),可以用这种方式切换到自定义尺寸模式,代码如下:
using UnityEditor; using UnityEngine; using System.Reflection; public static class GameWindowCustomSizeTool { [MenuItem("Tools/GameWindow自定义尺寸/设置为1920x1080")] public static void SetCustomSize1920x1080() { SetCustomSize(1920, 1080); } [MenuItem("Tools/GameWindow自定义尺寸/设置为1280x720")] public static void SetCustomSize1280x720() { SetCustomSize(1280, 720); } private static void SetCustomSize(int width, int height) { var gameView = EditorWindow.GetWindow<GameView>(); if (gameView == null) return; var gameViewType = typeof(GameView); // 获取并设置内部字段:切换到自定义尺寸模式 var sizeTypeField = gameViewType.GetField("m_SizeType", BindingFlags.Instance | BindingFlags.NonPublic); sizeTypeField.SetValue(gameView, (int)GameViewSizeType.Custom); // 设置自定义宽高值 var customWidthField = gameViewType.GetField("m_CustomWidth", BindingFlags.Instance | BindingFlags.NonPublic); var customHeightField = gameViewType.GetField("m_CustomHeight", BindingFlags.Instance | BindingFlags.NonPublic); customWidthField.SetValue(gameView, width); customHeightField.SetValue(gameView, height); // 调用内部方法标记尺寸变更 var setSizeDirtyMethod = gameViewType.GetMethod("SetSizeDirty", BindingFlags.Instance | BindingFlags.NonPublic); setSizeDirtyMethod.Invoke(gameView, null); // 刷新窗口 gameView.Repaint(); } }
注意事项
- 反射依赖Unity内部API,不同Unity版本(如2020+和旧版本)可能存在字段/方法名差异,若失效需检查对应版本的
GameView内部结构。 - 编辑器扩展脚本仅在Unity编辑器中生效,打包后的游戏不会执行这些代码。
内容的提问来源于stack exchange,提问作者user17248503
相关产品推荐
相关产品推荐

