65 lines
3.1 KiB
C#
65 lines
3.1 KiB
C#
|
|
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); }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|