1. Qiita
  2. 投稿
  3. Unity

【Unity拡張】Sceneビューのカメラの移動速度を変更する.

  • 2
    いいね
  • 0
    コメント

はじめに

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#のリフレクションを使って無理やり書き換えてやります。

Test.cs
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カメラ移動

NormalSceneCamera.gif
Sceneビューを右クリックしながらWとSで前後移動させています。

上記スクリプトを適用した場合のSceneカメラ移動

SlowSceneCamera.gif
カメラがゆっくり移動するようになりました。 
カメラの移動速度が変更できていることが確認できます(完)