You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
6.3 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UltraCombos;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
[ExecuteInEditMode]
public class DisplayControl : MonoBehaviour
{
[AutoUI]
public bool hideCursorInStandalone = true;
public bool fullScreen = true;
public int preferredRefreshRate = 60;
public List<Vector2> resolutions = new List<Vector2>();
object gameViewSizesInstance;
MethodInfo getGroup;
public enum GameViewSizeType
{
AspectRatio, FixedResolution
}
void Start()
{
#if UNITY_EDITOR
var sizesType = typeof(Editor).Assembly.GetType("UnityEditor.GameViewSizes");
var singleType = typeof(ScriptableSingleton<>).MakeGenericType(sizesType);
var instanceProp = singleType.GetProperty("instance");
getGroup = sizesType.GetMethod("GetGroup");
gameViewSizesInstance = instanceProp.GetValue(null, null);
getGroup = sizesType.GetMethod("GetGroup");
gameViewSizesInstance = instanceProp.GetValue(null, null);
#endif
int num = Mathf.Min(resolutions.Count, Display.displays.Length);
int width, height;
if (num == 1)
{
width = (int)resolutions[0].x;
height = (int)resolutions[0].y;
string input;
if (Misc.GetCommandLineArgument("-width", out input))
{
int res;
if (int.TryParse(input, out res))
{
Misc.Verbose("Display Control", "get arg -width " + res);
width = res;
}
}
if (Misc.GetCommandLineArgument("-height", out input))
{
int res;
if (int.TryParse(input, out res))
{
Misc.Verbose("Display Control", "get arg -height " + res);
height = res;
}
}
if (Misc.GetCommandLineArgument("-fullscreen", out input))
{
bool res;
if (bool.TryParse(input, out res))
{
Misc.Verbose("Display Control", "get arg -fullscreen " + res);
fullScreen = res;
}
}
Screen.SetResolution(width, height, fullScreen, preferredRefreshRate);
#if UNITY_EDITOR
SetGameViewResolution(width, height);
/*
UnityEditorInternal.InternalEditorUtility.RepaintAllViews();
System.Reflection.Assembly assembly = typeof(UnityEditor.EditorWindow).Assembly;
System.Type type = assembly.GetType("UnityEditor.GameView");
EditorWindow gameview = EditorWindow.GetWindow(type);
EditorApplication.Step();
EditorApplication.update();
*/
#endif
}
else if (num > 1)
{
for (int i = 0; i < num; i++)
{
var display = Display.displays[i];
width = (int)resolutions[i].x;
height = (int)resolutions[i].y;
display.Activate(width, height, preferredRefreshRate);
display.SetParams(width, height, 0, 0);
}
}
if (Application.isEditor == false)
Cursor.visible = !hideCursorInStandalone;
}
#if UNITY_EDITOR
void SetGameViewResolution(int width,int height)
{
int idx = FindSize(GameViewSizeGroupType.Standalone, width, height);
if(idx == -1)
{
AddCustomSize(GameViewSizeType.AspectRatio, GameViewSizeGroupType.Standalone, width, height, "");
}
SetSize(idx);
}
public int FindSize(GameViewSizeGroupType sizeGroupType, int width, int height)
{
// goal:
// GameViewSizes group = gameViewSizesInstance.GetGroup(sizeGroupType);
// int sizesCount = group.GetBuiltinCount() + group.GetCustomCount();
// iterate through the sizes via group.GetGameViewSize(int index)
var group = GetGroup(sizeGroupType);
var groupType = group.GetType();
var getBuiltinCount = groupType.GetMethod("GetBuiltinCount");
var getCustomCount = groupType.GetMethod("GetCustomCount");
int sizesCount = (int)getBuiltinCount.Invoke(group, null) + (int)getCustomCount.Invoke(group, null);
var getGameViewSize = groupType.GetMethod("GetGameViewSize");
var gvsType = getGameViewSize.ReturnType;
var widthProp = gvsType.GetProperty("width");
var heightProp = gvsType.GetProperty("height");
var indexValue = new object[1];
for (int i = 0; i < sizesCount; i++)
{
indexValue[0] = i;
var size = getGameViewSize.Invoke(group, indexValue);
int sizeWidth = (int)widthProp.GetValue(size, null);
int sizeHeight = (int)heightProp.GetValue(size, null);
if (sizeWidth == width && sizeHeight == height)
return i;
}
return -1;
}
public void AddCustomSize(GameViewSizeType viewSizeType, GameViewSizeGroupType sizeGroupType, int width, int height, string text)
{
// GameViewSizes group = gameViewSizesInstance.GetGroup(sizeGroupTyge);
// group.AddCustomSize(new GameViewSize(viewSizeType, width, height, text);
var group = GetGroup(sizeGroupType);
var addCustomSize = getGroup.ReturnType.GetMethod("AddCustomSize"); // or group.GetType().
var gvsType = typeof(Editor).Assembly.GetType("UnityEditor.GameViewSize");
var ctor = gvsType.GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(string) });
var newSize = ctor.Invoke(new object[] { (int)viewSizeType, width, height, text });
addCustomSize.Invoke(group, new object[] { newSize });
}
object GetGroup(GameViewSizeGroupType type)
{
return getGroup.Invoke(gameViewSizesInstance, new object[] { (int)type });
}
public void SetSize(int index)
{
var gvWndType = typeof(Editor).Assembly.GetType("UnityEditor.GameView");
var selectedSizeIndexProp = gvWndType.GetProperty("selectedSizeIndex",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var gvWnd = EditorWindow.GetWindow(gvWndType);
selectedSizeIndexProp.SetValue(gvWnd, index, null);
}
#endif
}