Advertisement
P_V_D

Unity GameMode Scale Self Reset Fix

Oct 17th, 2024
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.63 KB | Fixit | 0 0
  1. using System;
  2. using System.Reflection;
  3. using UnityEditor;
  4.  
  5. namespace Beast.Claw.Editor
  6. {
  7.     public class GameViewReflection
  8.     {
  9.         private const BindingFlags INSTANCE_PRIVATE = BindingFlags.Instance | BindingFlags.NonPublic;
  10.  
  11.         private Type _type_PlayModeWindow;
  12.         private Type _type_ZoomableArea;
  13.         private EditorWindow _window_PlayModeWindow;
  14.         private FieldInfo _field_PlayModeWindow_zoomArea;
  15.         private FieldInfo _field_ZoomableArea_Scale;
  16.  
  17.         public FieldInfo GetField_ZoomableArea_Scale()
  18.         {
  19.             _cashedType<EditorApplication>("UnityEditor.ZoomableArea", ref _type_ZoomableArea);
  20.             _cashedField(_type_ZoomableArea, "m_Scale", INSTANCE_PRIVATE, ref _field_ZoomableArea_Scale);
  21.  
  22.             return _field_ZoomableArea_Scale;
  23.         }
  24.        
  25.         public FieldInfo GetField_PlayModeWindow_ZoomArea()
  26.         {
  27.             _cashedType<EditorApplication>("UnityEditor.GameView", ref _type_PlayModeWindow);
  28.            
  29.             _cashedField(_type_PlayModeWindow, "m_ZoomArea", INSTANCE_PRIVATE, ref _field_PlayModeWindow_zoomArea);
  30.  
  31.             return _field_PlayModeWindow_zoomArea;
  32.         }
  33.        
  34.         public EditorWindow Get_PlayModeWindow()
  35.         {
  36.             _cashedType<EditorApplication>("UnityEditor.GameView", ref _type_PlayModeWindow);
  37.            
  38.             _cashedWindow(_type_PlayModeWindow, ref _window_PlayModeWindow);
  39.  
  40.             return _window_PlayModeWindow;
  41.         }
  42.  
  43.         private void _cashedField(Type ownerType, string fieldName, BindingFlags flags, ref FieldInfo cash)
  44.         {
  45.             if (cash != null)
  46.             {
  47.                 return;
  48.             }
  49.  
  50.             cash = ownerType.GetField(fieldName, flags);
  51.  
  52.             if (cash == null)
  53.             {
  54.                 throw new Exception($"Failed to get field {ownerType} ({fieldName})");
  55.             }
  56.         }
  57.  
  58.         private void _cashedWindow(Type windowType, ref EditorWindow cash)
  59.         {
  60.             if (cash != null)
  61.             {
  62.                 return;
  63.             }
  64.  
  65.             cash = EditorWindow.GetWindow(windowType);
  66.            
  67.             if (cash == null)
  68.             {
  69.                 throw new Exception($"Failed: EditorWindow.GetWindow({windowType.FullName})");
  70.             }
  71.         }
  72.        
  73.         private void _cashedType<TAssembly>(string name, ref Type cash)
  74.         {
  75.             if (cash != null)
  76.             {
  77.                 return;
  78.             }
  79.            
  80.             cash = typeof(TAssembly).Assembly.GetType(name, true);
  81.         }
  82.     }
  83. }
  84.  
  85. #if UNITY_2022_3_45
  86.  
  87. using System;
  88. using System.Reflection;
  89. using Beast.Claw.Attributes;
  90. using Beast.Claw.Debug;
  91. using UnityEditor;
  92. using UnityEngine;
  93.  
  94. namespace Beast.Claw.Editor
  95. {
  96.     /// <summary>
  97.     /// Unity 2022.3.45
  98.     /// Fixes Game View Editor Window scale reset after domain reloaded.
  99.     /// </summary>
  100.     [DomainInitialize]
  101.     public static class GameViewScaleSelfResetFix
  102.     {
  103.         private const string PREFS_KEY_X = nameof(GameViewScaleSelfResetFix) + "_AAUO4ggU0JiK5i";
  104.         private const string PREFS_KEY_Y = nameof(GameViewScaleSelfResetFix) + "_9iGSn8r4uhU0Am";
  105.  
  106.         private static readonly GameViewReflection CASH;
  107.        
  108.         static GameViewScaleSelfResetFix()
  109.         {
  110.             try
  111.             {
  112.                 CASH = new GameViewReflection();
  113.                
  114.                 AssemblyReloadEvents.afterAssemblyReload += _afterAssemblyReload;
  115.                 AssemblyReloadEvents.beforeAssemblyReload += _beforeAssemblyReload;
  116.             }
  117.             catch (Exception e)
  118.             {
  119.                 BDebug.StaticLogException(e);
  120.             }
  121.         }
  122.  
  123.         private static void _afterAssemblyReload()
  124.         {
  125.             try
  126.             {
  127.                 if (!PlayerPrefs.HasKey(PREFS_KEY_X) ||
  128.                     !PlayerPrefs.HasKey(PREFS_KEY_Y))
  129.                 {
  130.                     return;
  131.                 }
  132.                
  133.                 Vector2 scale;
  134.                 scale.x = PlayerPrefs.GetFloat(PREFS_KEY_X);
  135.                 scale.y = PlayerPrefs.GetFloat(PREFS_KEY_Y);
  136.                
  137.                 PlayerPrefs.DeleteKey(PREFS_KEY_X);
  138.                 PlayerPrefs.DeleteKey(PREFS_KEY_Y);
  139.                
  140.                 EditorWindow window = CASH.Get_PlayModeWindow();
  141.                 FieldInfo zoomAreaField = CASH.GetField_PlayModeWindow_ZoomArea();
  142.                 object zoomArea = zoomAreaField.GetValue(window);
  143.  
  144.                 FieldInfo scaleField = CASH.GetField_ZoomableArea_Scale();
  145.                 scaleField.SetValue(zoomArea, scale);
  146.                
  147.                 BDebug.StaticLogInfo("Applied scale: " + scale);
  148.             }
  149.             catch (Exception e)
  150.             {
  151.                 BDebug.StaticLogException(e);
  152.             }
  153.         }
  154.  
  155.         private static void _beforeAssemblyReload()
  156.         {
  157.             try
  158.             {
  159.                 EditorWindow window = CASH.Get_PlayModeWindow();
  160.                 FieldInfo zoomAreaField = CASH.GetField_PlayModeWindow_ZoomArea();
  161.                 object zoomArea = zoomAreaField.GetValue(window);
  162.  
  163.                 FieldInfo scaleField = CASH.GetField_ZoomableArea_Scale();
  164.                 Vector2 scale = (Vector2)scaleField.GetValue(zoomArea);
  165.  
  166.                 PlayerPrefs.SetFloat(PREFS_KEY_X, scale.x);
  167.                 PlayerPrefs.SetFloat(PREFS_KEY_Y, scale.y);
  168.  
  169.                 BDebug.StaticLogInfo("Saved current scale: " + scale);
  170.             }
  171.             catch (Exception e)
  172.             {
  173.                 BDebug.StaticLogException(e);
  174.             }
  175.         }
  176.     }
  177. }
  178.  
  179. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement