using System; using System.Reflection; using UnityEditor; using UnityEngine; namespace VS.EditorTools { // GUI 에디터를 열면 Game 뷰를 세로 720×1280 으로 맞춘다(내부 API 리플렉션 · 실패 시 경고만). LDClone 도구와 같은 방식. [InitializeOnLoad] static class GameViewPortrait { const string Label = "VS Portrait 720x1280"; const int Wd = 720, Ht = 1280; static GameViewPortrait() { if (Application.isBatchMode) return; EditorApplication.delayCall += () => Apply(false); } [MenuItem("VS/Game 뷰 세로 720x1280")] static void ApplyMenu() => Apply(true); static void Apply(bool verbose) { try { var asm = typeof(Editor).Assembly; var sizesType = asm.GetType("UnityEditor.GameViewSizes"); var single = typeof(ScriptableSingleton<>).MakeGenericType(sizesType); var instance = single.GetProperty("instance").GetValue(null); var groupType = sizesType.GetProperty("currentGroupType").GetValue(instance); var group = sizesType.GetMethod("GetGroup").Invoke(instance, new[] { groupType }); var gt = group.GetType(); int total = (int)gt.GetMethod("GetTotalCount").Invoke(group, null); int idx = -1; for (int i = 0; i < total; i++) { var sz = gt.GetMethod("GetGameViewSize").Invoke(group, new object[] { i }); if ((string)sz.GetType().GetProperty("baseText").GetValue(sz) == Label) { idx = i; break; } } if (idx < 0) { var sizeT = asm.GetType("UnityEditor.GameViewSize"); var kindT = asm.GetType("UnityEditor.GameViewSizeType"); var ctor = sizeT.GetConstructor(new[] { kindT, typeof(int), typeof(int), typeof(string) }); var size = ctor.Invoke(new object[] { Enum.Parse(kindT, "FixedResolution"), Wd, Ht, Label }); gt.GetMethod("AddCustomSize").Invoke(group, new[] { size }); idx = (int)gt.GetMethod("GetTotalCount").Invoke(group, null) - 1; } var gvType = asm.GetType("UnityEditor.GameView"); foreach (var w in Resources.FindObjectsOfTypeAll(gvType)) { var prop = gvType.GetProperty("selectedSizeIndex", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (prop != null && prop.CanWrite) prop.SetValue(w, idx); else gvType.GetMethod("SizeSelectionCallback", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.Invoke(w, new object[] { idx, null }); ((EditorWindow)w).Repaint(); } if (verbose) Debug.Log("[VS] Game 뷰 = " + Label); } catch (Exception e) { Debug.LogWarning("[VS] Game 뷰 세로 설정 실패(수동으로 720x1280 선택): " + e.Message); } } } }