using System; using System.Reflection; using UnityEditor; using UnityEngine; namespace io.github.hatayama.uLoopMCP { /// /// Bridge class for accessing Unity GameView internal APIs via reflection. /// GameView is an internal class; this bridge discovers members dynamically. /// public static class GameViewBridge { private static Type _gameViewType; private static FieldInfo _renderTextureField; private static bool _memberSearchDone; /// /// Get the GameView's composited RenderTexture containing all cameras + Screen Space Overlay Canvas. /// /// The RenderTexture, or null if GameView not found or field not accessible public static RenderTexture GetRenderTexture() { EnsureMembersResolved(); EditorWindow gameView = FindMainGameView(); if (gameView == null || _renderTextureField == null) { return null; } return _renderTextureField.GetValue(gameView) as RenderTexture; } private static EditorWindow FindMainGameView() { if (_gameViewType == null) { return null; } UnityEngine.Object[] gameViews = Resources.FindObjectsOfTypeAll(_gameViewType); if (gameViews.Length == 0) { return null; } // Prefer focused window to match editor's active view context foreach (UnityEngine.Object gv in gameViews) { EditorWindow window = gv as EditorWindow; if (window != null && window.hasFocus) { return window; } } return gameViews[0] as EditorWindow; } private static void EnsureMembersResolved() { if (_memberSearchDone) { return; } _memberSearchDone = true; _gameViewType = typeof(Editor).Assembly.GetType("UnityEditor.GameView"); if (_gameViewType == null) { Debug.LogWarning("[GameViewBridge] GameView type not found"); return; } _renderTextureField = _gameViewType.GetField("m_RenderTexture", BindingFlags.Instance | BindingFlags.NonPublic); if (_renderTextureField == null) { Debug.LogWarning("[GameViewBridge] m_RenderTexture field not found"); } } } }