はじめに
UnityのSceneビューのカメラの移動速度を変更する方法を調べてみました。
Unityのバージョンは5.5.0b7です。
Unity内部のソースコードを読んでみる
UnityにはSceneビューのカメラ速度にアクセスする機能が用意されていないみたいです。
そこで、下記URLのUnityエンジンのソースコードからSceneカメラに関するコードがどこにあるのかを探してみます。
https://github.com/MattRix/UnityDecompiled
Sceneカメラの移動速度はSceneViewMotion.csにある
ソースコードを読みすすめてみたところ、それらしきクラスを見つけました。
SceneViewMotion.cs
https://github.com/MattRix/UnityDecompiled/blob/master/UnityEditor/UnityEditor/SceneViewMotion.cs
この中の、s_FlySpeed
がSceneカメラの移動速度に該当するようです。
移動速度を無理やり書き換える。
SceneViewMotion
は非公開のクラスなので、C#のリフレクションを使って無理やり書き換えてやります。
using System.Reflection;
using UnityEngine;
using UnityEditor;
[InitializeOnLoad]
public class Test
{
static Test()
{
var asm = Assembly.Load("UnityEditor.dll");
var typeSceneViewMotion = asm.GetType("UnityEditor.SceneViewMotion");
Event e = null;
SceneView.onSceneGUIDelegate += (sceneView) =>
{
e = Event.current;
};
var s_FlySpeed = (FieldInfo)typeSceneViewMotion.GetMember("s_FlySpeed", BindingFlags.Static | BindingFlags.NonPublic)[0];
EditorApplication.update += () =>
{
float speed = 0.5f;
if (e != null && e.shift)
{
// Shiftキーが押されていたら5倍速
s_FlySpeed.SetValue(null, speed * 5f);
}
else
{
s_FlySpeed.SetValue(null, speed);
}
};
}
}
上記のスクリプトをプロジェクトに入れてやると、Sceneカメラの移動速度がゆっくりになります。
実行してみる
通常のカメラ移動と上記スクリプト適用した場合のカメラ移動を比較してみました。
通常のSceneカメラ移動
Sceneビューを右クリックしながらWとSで前後移動させています。