您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
115 行
3.2 KiB
115 行
3.2 KiB
using System.Reflection;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
|
|
[InitializeOnLoad]
|
|
public static class SceneCamFovFixer
|
|
{
|
|
[MenuItem(k_MenuName, true)]
|
|
public static bool ToggleFovValidate()
|
|
{
|
|
Menu.SetChecked(k_MenuName, s_Enabled);
|
|
return true;
|
|
}
|
|
|
|
[MenuItem(k_MenuName)]
|
|
public static void ToggleFov()
|
|
{
|
|
SetEnabled(!s_Enabled);
|
|
EditorPrefs.SetBool(k_EditorPrefKey, s_Enabled);
|
|
}
|
|
|
|
static SceneCamFovFixer()
|
|
{
|
|
s_OnPreSceneGUIDelegateInfo = typeof(SceneView).GetField("onPreSceneGUIDelegate", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
|
|
if (s_OnPreSceneGUIDelegateInfo == null)
|
|
{
|
|
Debug.LogWarning("No PreSceneGUIDelegate field found.");
|
|
return;
|
|
}
|
|
var enabled = EditorPrefs.GetBool(k_EditorPrefKey);
|
|
SetEnabled(enabled);
|
|
}
|
|
|
|
static void SetEnabled(bool enabled)
|
|
{
|
|
if (enabled)
|
|
OnEnable();
|
|
else
|
|
OnDisable();
|
|
}
|
|
|
|
static SceneView.OnSceneFunc GetOPSGDelegate()
|
|
{
|
|
return s_OnPreSceneGUIDelegateInfo.GetValue(null) as SceneView.OnSceneFunc;
|
|
}
|
|
|
|
static void SetOPSGDelegate(SceneView.OnSceneFunc fun)
|
|
{
|
|
s_OnPreSceneGUIDelegateInfo.SetValue(null, fun);
|
|
}
|
|
|
|
static void AddCallback(SceneView.OnSceneFunc func)
|
|
{
|
|
var d = System.Delegate.Combine(GetOPSGDelegate(), func);
|
|
SetOPSGDelegate(d as SceneView.OnSceneFunc);
|
|
}
|
|
|
|
static void RemoveCallback(SceneView.OnSceneFunc func)
|
|
{
|
|
var d = System.Delegate.Remove(GetOPSGDelegate(), func);
|
|
SetOPSGDelegate(d as SceneView.OnSceneFunc);
|
|
}
|
|
|
|
static void OnEnable()
|
|
{
|
|
if (s_Enabled)
|
|
return;
|
|
AddCallback(preSceneGUICallback);
|
|
SceneView.RepaintAll();
|
|
s_Enabled = true;
|
|
}
|
|
|
|
static void OnDisable()
|
|
{
|
|
if (!s_Enabled)
|
|
return;
|
|
RemoveCallback(preSceneGUICallback);
|
|
SceneView.RepaintAll();
|
|
s_Enabled = false;
|
|
}
|
|
|
|
static bool rightMouseIsDown = false;
|
|
static void preSceneGUICallback(SceneView sceneView)
|
|
{
|
|
if (Camera.main != null)
|
|
{
|
|
sceneView.camera.fieldOfView = Camera.main.fieldOfView;
|
|
sceneView.camera.nearClipPlane = Camera.main.nearClipPlane;
|
|
sceneView.camera.farClipPlane = Camera.main.farClipPlane;
|
|
sceneView.camera.cullingMask = Camera.main.cullingMask;
|
|
|
|
if (sceneView.orthographic)
|
|
return;
|
|
}
|
|
|
|
sceneView.size = 10.0f;
|
|
|
|
var currentEvent = Event.current;
|
|
|
|
if (currentEvent.type == EventType.MouseDown && currentEvent.button == 1)
|
|
rightMouseIsDown = true;
|
|
if (currentEvent.type == EventType.MouseUp && currentEvent.button == 1)
|
|
rightMouseIsDown = false;
|
|
|
|
if (currentEvent.type == EventType.ScrollWheel && !rightMouseIsDown)
|
|
sceneView.pivot += -Camera.current.transform.forward * currentEvent.delta.y * 0.50f;
|
|
}
|
|
|
|
const string k_MenuName = "FPS Sample/Fix sceneview fov";
|
|
|
|
static FieldInfo s_OnPreSceneGUIDelegateInfo;
|
|
static bool s_Enabled;
|
|
static readonly string k_EditorPrefKey = "EnableFovFixer";
|
|
}
|