2013年6月10日月曜日

シーンビューでImage Effectsプレビュー

Unity創業者Nicolas Francisがframebunkerに移ってまだ二ヶ月ほど。面白い技術記事を書いているので紹介したい:

------
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 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿