------
http://framebunker.com/blog/viewing-image-effects-in-the-scene-view/
Jun 4, 2013
シーンビューでImage Effectsプレビュー
コードを書いたばかりで共有してみようと思い立った:Image Effects をシーンビューでみれるためのフックがある。下のコードを .cs ファイルにコピー&ペーストして、SceneViewFilter から任意の Image Effect を抜き出せる。
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class SceneViewFilter : MonoBehaviour {
#if UNITY_EDITOR
bool hasChanged = false;
public virtual void OnValidate ()
{
hasChanged = true;
}
static SceneViewFilter ()
{
SceneView.onSceneGUIDelegate += CheckMe;
}
static void CheckMe (SceneView sv)
{
if (Event.current.type != EventType.Layout)
return;
if (!Camera.main)
return;
// Get a list of everything on the main camera that should be synced.
SceneViewFilter[] cameraFilters = Camera.main.GetComponents ();
SceneViewFilter[] sceneFilters = sv.camera.GetComponents ();
// Let's see if the lists are different lengths or something like that.
// If so, we simply destroy all scene filters and recreate from maincame
if (cameraFilters.Length != sceneFilters.Length)
{
Recreate (sv);
return;
}
for (int i = 0; i < cameraFilters.Length; i++)
{
if (cameraFilters[i].GetType() != sceneFilters[i].GetType())
{
Recreate (sv);
return;
}
}
// Ok, WHICH filters, or their order hasn't changed.
// Let's copy all settings for any filter that has changed.
for (int i = 0; i < cameraFilters.Length; i++)
if (cameraFilters[i].hasChanged || sceneFilters[i].enabled != cameraFilters[i].enabled)
{
EditorUtility.CopySerialized (cameraFilters[i], sceneFilters[i]);
cameraFilters[i].hasChanged = false;
}
}
static void Recreate (SceneView sv)
{
SceneViewFilter filter;
while (filter = sv.camera.GetComponent ())
DestroyImmediate (filter);
foreach (SceneViewFilter f in Camera.main.GetComponents ())
{
SceneViewFilter newFilter = sv.camera.gameObject.AddComponent (f.GetType()) as SceneViewFilter;
EditorUtility.CopySerialized (f, newFilter);
}
}
#endif
}
(いくつかマヌケな間違いを指摘してもらった内容を修正をして現在はバージョン 2 だ)
これを可能にしているフックの名前は Unity の SceneView.onSceneGUIDelegate だ。このデリゲートに追加した任意の関数はシーンビューがイベントを処理するときにコールされる。引数は シーンビューである。これを通してシーンビューのカメラを取得できる。そうすればあとは Image Effects をすべてカメラーにコピーする作業になる。実現するために AddComponent を使用して Unity の SerializedObject を使用して各々のフィールドをコピーする。
備考:十分にテストしてないので、配列やネストされたオブジェクト等はハンドリングできない。それでも自分たちは便利に活用できている。
楽しんでくれ!そして壊れたとしても大きな問題はないはずだ。
------
Unity創業者Nicolas Francisも現場に戻って頑張ってるぜ!
0 件のコメント:
コメントを投稿