コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Game ビューの Scale を特定の範囲でのみ変更する構造体

ソースコード

#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