コガネブログ

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

【Unity】Game ビューの解像度のインデックスを特定の範囲でのみ変更する構造体

ソースコード

#if UNITY_EDITOR

using System;
using System.Reflection;
using UnityEditor;

namespace Kogane
{
    public struct SetGameViewSelectedSizeIndexScope : IDisposable
    {
        private const BindingFlags BINDING_ATTRS = BindingFlags.Instance | BindingFlags.Public;

        private static readonly Type         GAME_VIEW_TYPE           = Type.GetType( "UnityEditor.GameView,UnityEditor" );
        private static readonly PropertyInfo SELECTED_SIZE_INDEX_INFO = GAME_VIEW_TYPE!.GetProperty( "selectedSizeIndex", BINDING_ATTRS );

        private readonly int m_oldSelectedSizeIndex;

        private bool m_isInitialized;

        public SetGameViewSelectedSizeIndexScope( int selectedSizeIndex )
        {
            var editorWindow = EditorWindow.GetWindow( GAME_VIEW_TYPE );

            m_oldSelectedSizeIndex = ( int )SELECTED_SIZE_INDEX_INFO!.GetValue( editorWindow );

            SELECTED_SIZE_INDEX_INFO.SetValue( editorWindow, selectedSizeIndex );

            m_isInitialized = true;
        }

        public SetGameViewSelectedSizeIndexScope
        (
            int selectedSizeIndex,
            int oldSelectedSizeIndex
        )
        {
            var editorWindow = EditorWindow.GetWindow( GAME_VIEW_TYPE );

            m_oldSelectedSizeIndex = oldSelectedSizeIndex;

            SELECTED_SIZE_INDEX_INFO!.SetValue( editorWindow, selectedSizeIndex );

            m_isInitialized = true;
        }

        public void Dispose()
        {
            if ( !m_isInitialized ) return;
            m_isInitialized = false;

            var editorWindow = EditorWindow.GetWindow( GAME_VIEW_TYPE );

            SELECTED_SIZE_INDEX_INFO!.SetValue( editorWindow, m_oldSelectedSizeIndex );
        }
    }
}

#endif

参考サイト様