ソースコード
#if UNITY_EDITOR using System; using System.Reflection; using UnityEditor; using UnityEngine; namespace Kogane { public struct SetGameViewZoomAreaScaleScope : IDisposable { private const BindingFlags BINDING_ATTRS = BindingFlags.Instance | BindingFlags.NonPublic; private static readonly Type GAME_VIEW_TYPE = Type.GetType( "UnityEditor.GameView,UnityEditor" ); private static readonly FieldInfo ZOOM_AREA_FIELD_INFO = GAME_VIEW_TYPE!.GetField( "m_ZoomArea", BINDING_ATTRS ); private readonly Vector2 m_oldScale; private bool m_isInitialized; public SetGameViewZoomAreaScaleScope ( float scale, float oldScale ) : this ( scale: new Vector2( scale, scale ), oldScale: new Vector2( oldScale, oldScale ) ) { } public SetGameViewZoomAreaScaleScope ( in Vector2 scale, in Vector2 oldScale ) { var editorWindow = EditorWindow.GetWindow( GAME_VIEW_TYPE ); var zoomArea = ZOOM_AREA_FIELD_INFO!.GetValue( editorWindow ); var zoomAreaType = zoomArea.GetType(); var scaleFieldInfo = zoomAreaType.GetField( "m_Scale", BINDING_ATTRS ); m_oldScale = oldScale; scaleFieldInfo!.SetValue( zoomArea, scale ); m_isInitialized = true; } public void Dispose() { if ( !m_isInitialized ) return; m_isInitialized = false; var editorWindow = EditorWindow.GetWindow( GAME_VIEW_TYPE ); var zoomArea = ZOOM_AREA_FIELD_INFO!.GetValue( editorWindow ); var zoomAreaType = zoomArea.GetType(); var scaleFieldInfo = zoomAreaType.GetField( "m_Scale", BINDING_ATTRS ); scaleFieldInfo!.SetValue( zoomArea, m_oldScale ); } } } #endif