Skip to content

Commit e63ed2b

Browse files
author
Takayuki MATSUOKA
committed
Import from gist
1 parent 0a3c0c7 commit e63ed2b

28 files changed

+302
-0
lines changed

Assets/SceneViewFovControl.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/SceneViewFovControl/Editor.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//#define SCENE_VIEW_FOV_DEBUG
2+
3+
using UnityEngine;
4+
using UnityEditor;
5+
using System;
6+
using System.Collections.Generic;
7+
8+
#if !UNITY_EDITOR
9+
#error This script must be placed under "Editor/" directory.
10+
#endif
11+
12+
namespace UTJ.UnityEditor.Extension.SceneViewFovControl {
13+
14+
[InitializeOnLoad]
15+
public static class SceneViewFovControl
16+
{
17+
static Dictionary<int, Status> statuses = new Dictionary<int, Status>();
18+
19+
static SceneViewFovControl() {
20+
Enable(true);
21+
}
22+
23+
#if SCENE_VIEW_FOV_DEBUG
24+
[MenuItem("Experimental/Enable SceneView FOV Control")]
25+
static void MenuitemEnable() {
26+
Enable(true);
27+
}
28+
29+
[MenuItem("Experimental/Disable SceneView FOV Control")]
30+
static void MenuitemDisable() {
31+
Enable(false);
32+
}
33+
#endif
34+
35+
public static void Enable(bool enable) {
36+
if(enable) {
37+
SceneViewHiddenApi.AddOnPreSceneGUIDelegate(OnScene);
38+
} else {
39+
SceneViewHiddenApi.RemoveOnPreSceneGUIDelegate(OnScene);
40+
}
41+
SceneView.RepaintAll();
42+
}
43+
44+
static void OnScene(SceneView sceneView) {
45+
if(sceneView == null || sceneView.camera == null) {
46+
return;
47+
}
48+
49+
Status s;
50+
{
51+
int key = sceneView.GetInstanceID();
52+
if(! statuses.TryGetValue(key, out s)) {
53+
s = new Status();
54+
statuses[key] = s;
55+
}
56+
}
57+
s.OnScene(sceneView);
58+
}
59+
}
60+
61+
} // namespace

Assets/SceneViewFovControl/Editor/SceneViewFovControl.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using UnityEngine;
2+
using UnityEditor;
3+
using System;
4+
using System.Reflection;
5+
6+
#if !UNITY_EDITOR
7+
#error This script must be placed under "Editor/" directory.
8+
#endif
9+
10+
namespace UTJ.UnityEditor.Extension.SceneViewFovControl {
11+
12+
static class SceneViewHiddenApi {
13+
static bool initialized = false;
14+
static FieldInfo fi;
15+
16+
static FieldInfo onPreSceneGUIDelegateFieldInfo {
17+
get {
18+
if(fi != null || initialized) {
19+
return fi;
20+
}
21+
22+
initialized = true;
23+
24+
// UnityEditor.SceneView.onPreSceneGUIDelegateFieldInfo
25+
fi = typeof(SceneView).GetField(
26+
"onPreSceneGUIDelegate",
27+
BindingFlags.Static
28+
| BindingFlags.NonPublic
29+
| BindingFlags.Public
30+
);
31+
return fi;
32+
}
33+
}
34+
35+
static SceneView.OnSceneFunc onPreSceneGUIDelegate {
36+
get {
37+
var fi = onPreSceneGUIDelegateFieldInfo;
38+
if(fi == null) {
39+
return null;
40+
}
41+
return fi.GetValue(null) as SceneView.OnSceneFunc;
42+
}
43+
44+
set {
45+
var fi = onPreSceneGUIDelegateFieldInfo;
46+
if(fi == null) {
47+
return;
48+
}
49+
fi.SetValue(null, value);
50+
}
51+
}
52+
53+
// Add delegate to UnityEditor.SceneView.onPreSceneGUIDelegate
54+
public static void AddOnPreSceneGUIDelegate(SceneView.OnSceneFunc func) {
55+
onPreSceneGUIDelegate =
56+
Delegate.Combine(func, onPreSceneGUIDelegate)
57+
as SceneView.OnSceneFunc;
58+
}
59+
60+
// Remove delegate from UnityEditor.SceneView.onPreSceneGUIDelegate
61+
public static void RemoveOnPreSceneGUIDelegate(SceneView.OnSceneFunc func) {
62+
onPreSceneGUIDelegate =
63+
Delegate.Remove(func, onPreSceneGUIDelegate)
64+
as SceneView.OnSceneFunc;
65+
}
66+
}
67+
68+
} // namespace

Assets/SceneViewFovControl/Editor/SceneViewHiddenApi.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using UnityEngine;
2+
using UnityEditor;
3+
4+
#if !UNITY_EDITOR
5+
#error This script must be placed under "Editor/" directory.
6+
#endif
7+
8+
namespace UTJ.UnityEditor.Extension.SceneViewFovControl {
9+
static class Settings {
10+
public static EventModifiers ModifiersNormal = EventModifiers.Alt | EventModifiers.Control;
11+
public static EventModifiers ModifiersQuick = EventModifiers.Alt | EventModifiers.Control | EventModifiers.Shift;
12+
13+
public static KeyCode KeyCodeIncreaseFov = KeyCode.O;
14+
public static KeyCode KeyCodeDecreaseFov = KeyCode.P;
15+
16+
public static float FovSpeed = 0.5f * 0.3f;
17+
public static float FovQuickMultiplier = 5.0f;
18+
public static float MinFov = 2.0f;
19+
public static float MaxFov = 160.0f;
20+
}
21+
}

Assets/SceneViewFovControl/Editor/Settings.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using UnityEngine;
2+
using UnityEditor;
3+
4+
#if !UNITY_EDITOR
5+
#error This script must be placed under "Editor/" directory.
6+
#endif
7+
8+
namespace UTJ.UnityEditor.Extension.SceneViewFovControl {
9+
10+
class Status {
11+
float fov = 0.0f;
12+
13+
public void OnScene(SceneView sceneView) {
14+
if(sceneView == null || sceneView.camera == null) {
15+
return;
16+
}
17+
18+
Camera camera = sceneView.camera;
19+
if(fov == 0.0f) {
20+
fov = camera.fieldOfView;
21+
}
22+
23+
var ev = Event.current;
24+
float deltaFov = 0.0f;
25+
26+
if(ev.modifiers == Settings.ModifiersNormal || ev.modifiers == Settings.ModifiersQuick) {
27+
if(ev.type == EventType.ScrollWheel) {
28+
// todo : Check compatibility of Event.delta.y.
29+
// e.g. Platform, mice, etc.
30+
deltaFov = ev.delta.y;
31+
ev.Use();
32+
} else if(ev.type == EventType.KeyDown && ev.keyCode == Settings.KeyCodeIncreaseFov) {
33+
deltaFov = +1.0f;
34+
ev.Use();
35+
} else if(ev.type == EventType.KeyDown && ev.keyCode == Settings.KeyCodeDecreaseFov) {
36+
deltaFov = -1.0f;
37+
ev.Use();
38+
}
39+
}
40+
41+
if(deltaFov != 0.0f) {
42+
deltaFov *= Settings.FovSpeed;
43+
if(ev.modifiers == Settings.ModifiersQuick) {
44+
deltaFov *= Settings.FovQuickMultiplier;
45+
}
46+
fov += deltaFov;
47+
fov = Mathf.Clamp(fov, Settings.MinFov, Settings.MaxFov);
48+
}
49+
50+
camera.fieldOfView = fov;
51+
}
52+
}
53+
54+
} // namespace

Assets/SceneViewFovControl/Editor/Status.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)