読者です 読者をやめる 読者になる 読者になる

けいごのなんとか

Unityユーザーとしてのブログ。ギリギリ路線走ってます。

SceneViewクラスについて

SceneViewとは

皆さんの知っているシーンビューを表示するためのクラスです

ドキュメント化されていない

ドキュメント化されてないです。なんでだろうな...

ぶっちゃけただのEditorWindow

SceneViewはSearchableEditorWindowを継承しただけのEditorWindowです。

SceneViewをうまく使いこなす近道

ヒエラルキービューとかプロジェクトビューを先にいじって知識を得たほうがいいと思う。ドキュメント化されてるし。

SceneViewにGUIを追加する

using UnityEngine;
using UnityEditor;
using System.Collections;

[InitializeOnLoad]
public class NewBehaviourScript
{
    static NewBehaviourScript ()
    {
        SceneView.onSceneGUIDelegate += OnSceneGUI;
    }

    static void OnSceneGUI (SceneView sceneView)
    {
        Handles.BeginGUI ();
        GUILayout.Window (1, new Rect (10, 30, 100, 100), Func, "Window");
        Handles.EndGUI ();
    }

    static void Func (int id)
    {
        GUILayout.Button ("Hogeeeeee");
    }
}

SceneViewにメッシュを描画する

using UnityEngine;
using UnityEditor;
using System.Collections;

[InitializeOnLoad]
public class NewBehaviourScript
{
    static NewBehaviourScript ()
    {
        SceneView.onSceneGUIDelegate += OnSceneGUI;
    }

    static void OnSceneGUI (SceneView sceneView)
    {
        DrawMesh();
    }

    static void DrawMesh ()
    {
        Mesh mesh = new Mesh ();
        mesh.name = "Panel";
        
        mesh.vertices = new Vector3{
            new Vector3(-0.5f,  0.5f, 0f),
            new Vector3( 0.5f,  0.5f, 0f),
            new Vector3( 0.5f, -0.5f, 0f),
            new Vector3(-0.5f, -0.5f, 0f)
        };
        mesh.triangles = new int{
            0, 1, 2, 2, 3, 0
        };
        mesh.uv = new Vector2[]{
            new Vector2(0f, 1f),
            new Vector2(1f, 1f),
            new Vector2(1f, 0f),
            new Vector2(0f, 0f)
        };
        
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        mesh.Optimize();
        mesh.MarkDynamic ();

        Graphics.DrawMesh(mesh,Vector3.zero, Quaternion.identity, null, 0);
    }
}

f:id:anchan828:20130313004232p:plain

ここで重要なのが

SceneView.onSceneGUIDelegate

このデリゲートにSceneView.SceneFunc(SceneView sceneView)さえ追加してあげればOK

この使い方は

projectWindowItemOnGUI とか hierarchyWindowItemOnGUI と同じ

シーンビューは複数表示できるのでsceneViewを確認しながら表示するかどうかを制御するのも良い。

あと別にInitializeOnLoadで呼び出さなくてもいいので使いたいように使いましょう。

でもInitializeOnLoadを使わない方法はEditor.OnSceneGUI使ったほうが良い場合がほとんどなんじゃないかな。

sceneView.LookAtあるよ!

これ使えば色々視点を切り替えられるよ。 Unity3.5時代にあってUnity4.0で亡くなったシーンギズモの真ん中押すといい具合にカメラ移動してくれた機能作れるんじゃないかな

f:id:anchan828:20130313005412p:plain