Skip to content

Instantly share code, notes, and snippets.

@Fewes
Last active April 11, 2017 17:00
Show Gist options
  • Save Fewes/d76770b659ea3f81df22bbfd1fceac10 to your computer and use it in GitHub Desktop.
Save Fewes/d76770b659ea3f81df22bbfd1fceac10 to your computer and use it in GitHub Desktop.
Allows you to control the scene camera speed using the scroll wheel in the Unity editor (much like UE4).
using UnityEngine;
using UnityEditor;
using System.Reflection;
[InitializeOnLoad]
public static class ScrollableEditorCameraSpeed
{
static ScrollableEditorCameraSpeed()
{
float cameraSpeed = 10.0f;
const float cameraSpeedMin = 0.02f;
const float cameraSpeedMax = 1000f;
bool key_w = false;
bool key_a = false;
bool key_s = false;
bool key_d = false;
bool isForward = false;
SceneView.onSceneGUIDelegate += view =>
{
Event e = Event.current;
if (e != null)
{
// Seems silly but Input.GetKey() does not work in here so we keep our own states
if (e.type == EventType.KeyDown)
{
if (e.keyCode == KeyCode.W) key_w = true;
if (e.keyCode == KeyCode.A) key_a = true;
if (e.keyCode == KeyCode.S) key_s = true;
if (e.keyCode == KeyCode.D) key_d = true;
}
else if (e.type == EventType.KeyUp)
{
if (e.keyCode == KeyCode.W) key_w = false;
if (e.keyCode == KeyCode.A) key_a = false;
if (e.keyCode == KeyCode.S) key_s = false;
if (e.keyCode == KeyCode.D) key_d = false;
}
bool moving = key_w || key_a || key_s || key_d;
if (moving && e.type == EventType.ScrollWheel)
{
// Increase camera speed
if (e.delta.y < 0)
{
cameraSpeed *= 1.5f;
cameraSpeed = Mathf.Clamp(cameraSpeed, cameraSpeedMin, cameraSpeedMax);
// Camera hack to disable/counteract scroll wheel zoom
if (Camera.current != null)
{
GameObject target = new GameObject();
target.transform.position = Camera.current.transform.position - Camera.current.transform.forward * (isForward ? 0.45f : 0.45f);
target.transform.rotation = Camera.current.transform.rotation;
view.AlignViewToObject(target.transform);
GameObject.DestroyImmediate(target);
}
isForward = true;
}
// Decrease camera speed
else
{
cameraSpeed *= 0.75f;
cameraSpeed = Mathf.Clamp(cameraSpeed, cameraSpeedMin, cameraSpeedMax);
// Camera hack to disable/counteract scroll wheel zoom
if (Camera.current != null)
{
GameObject target = new GameObject();
target.transform.position = Camera.current.transform.position + Camera.current.transform.forward * (!isForward ? 0.45f : 0.45f);
target.transform.rotation = Camera.current.transform.rotation;
view.AlignViewToObject(target.transform);
GameObject.DestroyImmediate(target);
}
isForward = false;
}
}
}
// -------------------------------------------------------------
// Original code below from UnityEditorCameraSpeed.cs by Kalineh
// All credit goes to him
// https://github.com/kalineh
// -------------------------------------------------------------
if (Event.current.type != EventType.Layout)
return;
var tools_type = typeof(UnityEditor.Tools);
var locked_view_tool_field = (FieldInfo)tools_type.GetField("s_LockedViewTool", BindingFlags.NonPublic | BindingFlags.Static);
var locked_view_tool = (ViewTool)locked_view_tool_field.GetValue(null);
if (locked_view_tool != ViewTool.FPS)
return;
var scene_view_assembly = Assembly.GetAssembly(typeof(UnityEditor.SceneView));
var scene_view_motion_type = scene_view_assembly.GetType("UnityEditor.SceneViewMotion");
var scene_view_flyspeed_type = scene_view_assembly.GetType("UnityEditor.SceneViewMotion");
var flyspeed_field = (FieldInfo)scene_view_motion_type.GetField("s_FlySpeed", BindingFlags.NonPublic | BindingFlags.Static);
var flyspeed = flyspeed_field.GetValue(null);
var flyspeed_modified = (float)flyspeed;
flyspeed_modified = cameraSpeed;
flyspeed_field.SetValue(null, flyspeed_modified);
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment