Skip to content

Commit 3fcda31

Browse files
fix: adjust reflection code in SceneOverlayWindow for Unity 2019
fix #2
1 parent b5c353a commit 3fcda31

File tree

1 file changed

+36
-7
lines changed

1 file changed

+36
-7
lines changed

Editor/SceneOverlayWindow.cs

+36-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23
using System.Reflection;
34
using UnityEditor;
45
using UnityEngine;
@@ -7,36 +8,64 @@ namespace MeshTilesetsEditor
78
{
89
public class SceneOverlayWindow
910
{
11+
public delegate void WindowFunction(SceneView sceneView);
12+
1013
private object sceneOverlayWindow;
11-
private MethodInfo showWindow;
14+
private MethodInfo windowMethod;
15+
private object[] windowMethodParams;
1216
public UnityEngine.Object target;
1317

1418
// public delegate void ShowWindowFunc(object overlayWindow);
1519
public delegate void OnWindowGUICallback(UnityEngine.Object target, SceneView sceneView);
16-
20+
1721
public SceneOverlayWindow(GUIContent title, OnWindowGUICallback onWindowGUI, UnityEngine.Object target, int priority = int.MaxValue)
1822
{
1923
this.target = target;
2024
var unityEditor = Assembly.GetAssembly(typeof(UnityEditor.SceneView));
25+
26+
#if UNITY_2019_3 || UNITY_2019_4
27+
var overlayWindowType = unityEditor.GetType("UnityEditor.SceneViewOverlay+OverlayWindow");
28+
#elif UNITY_2020_1_OR_NEWER
2129
var overlayWindowType = unityEditor.GetType("UnityEditor.OverlayWindow");
30+
#endif
2231
var sceneViewOverlayType = unityEditor.GetType("UnityEditor.SceneViewOverlay");
2332
var windowFuncType = sceneViewOverlayType.GetNestedType("WindowFunction");
24-
var windowFunc = Delegate.CreateDelegate(windowFuncType, onWindowGUI.Target, onWindowGUI.Method);
33+
var sceneViewFuncDelegate = Delegate.CreateDelegate(windowFuncType, onWindowGUI.Target, onWindowGUI.Method);
34+
2535
var windowDisplayOptionType = sceneViewOverlayType.GetNestedType("WindowDisplayOption");
36+
var windowDisplayOption = Enum.Parse(windowDisplayOptionType, "OneWindowPerTarget");
37+
38+
#if UNITY_2019_3 || UNITY_2019_4
39+
windowMethod = sceneViewOverlayType.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).FirstOrDefault(t => t.Name == "Window" && t.GetParameters().Length == 6);
40+
#elif UNITY_2020_1_OR_NEWER
41+
//public static void ShowWindow(OverlayWindow window)
42+
windowMethod = sceneViewOverlayType.GetMethod("ShowWindow", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
43+
#endif
44+
45+
#if UNITY_2019_3 || UNITY_2019_4
46+
windowMethodParams = new object[]
47+
{
48+
title, sceneViewFuncDelegate, priority, target, windowDisplayOption, null
49+
};
50+
#elif UNITY_2020_1_OR_NEWER
51+
//public OverlayWindow(GUIContent title, SceneViewOverlay.WindowFunction guiFunction, int primaryOrder, Object target, SceneViewOverlay.WindowDisplayOption option)
2652
sceneOverlayWindow = Activator.CreateInstance(overlayWindowType,
2753
title,
2854
windowFunc,
2955
int.MaxValue, this.target,
30-
Enum.Parse(windowDisplayOptionType, "OneWindowPerTarget") //SceneViewOverlay.WindowDisplayOption.OneWindowPerTarget
56+
windowDisplayOption //SceneViewOverlay.WindowDisplayOption.OneWindowPerTarget
3157
);
32-
showWindow = sceneViewOverlayType.GetMethod("ShowWindow", BindingFlags.Static | BindingFlags.Public);
33-
58+
windowMethodParams = new object[] { overlayWindow };
59+
#endif
60+
61+
//showWindow = sceneViewOverlayType.GetMethod("ShowWindow", BindingFlags.Static | BindingFlags.Public);
3462
// showWindow = Delegate.CreateDelegate(typeof(ShowWindowFunc), showSceneViewOverlay) as ShowWindowFunc;
3563
}
3664

3765
public void ShowWindow()
3866
{
39-
this.showWindow.Invoke(null, new object[]{sceneOverlayWindow});
67+
if (windowMethod != null)
68+
windowMethod.Invoke(null, windowMethodParams);
4069
}
4170

4271
}

0 commit comments

Comments
 (0)