Unityでプロジェクションマッピングをした話
先日の徳山高専祭で展示した「Re:ink」にて、どのような工程でプロジェクションマッピングを行ったかの解説記事になります。
徳山高専祭のこと、メイン企画のことと、両方とも素晴らしいので語ればきりがないのですが、できるだけプロジェクションマッピングに要点を絞って解説します。
来年以降の後輩、あるいは他高専の皆さまの参考になればと思います。
メイン企画、Re:inkの説明は動画の説明欄から!
【Unity】全ての子オブジェクトをGameObject[]型で取得する
全ての子オブジェクトをGameObject型で取得するサンプルです。
・すべての子オブジェクトを名前から検索する
・すべての子オブジェクトからコンポーネントを拾ってくる
・すべての子オブジェクトをTransform型で拾ってくる
というのはネット上の記事に転がっていますが、今回はGameObject[]型で拾ってきます。
上記の方法についてはググれば出ると思います。
GameObject[] GetChildren(string parentName) { // 検索し、GameObject型に変換 var parent = GameObject.Find(parentName) as GameObject; // 見つからなかったらreturn if(parent == null) return null; // 子のTransform[]を取り出す var transforms = parent.GetComponentsInChildren<Transform>(); // 使いやすいようにtransformsからgameObjectを取り出す var gameObjects = from t in transforms select t.gameObject; // 配列に変換してreturn return gameObjects.ToArray(); }
例えば、UIを組む時にPanelの表示・非表示を切り替えたいときこのメソッドを使うとこんな感じで書けます。
var uiObjects = GetChildren("Panel"); foreach(var uiObject in uiObjects) uiObject.SetActive(false);
Panelの子を拾ってきて、SetActiveで表示・非表示を切り替えることができます。
uGUIで表示・非表示を切り替えるときどのパラメータをいじるのが適切なのか分かりませんが、とりあえずこれで実装可能
追記(2015/11/26) 読み返していて気づきましたが、一度SetActive(false);をしたあとにGameObject.Findを呼ぶと拾ってくれずにnullが返ってきます。よって、上の方法でUIの表示・非表示を切り替えるのはまずいです。注意してください(GameObject.Findで毎回親をさがすのでなく、親のインスタンスを変数で保持しておけば、あとは上の流れで大丈夫です)
【Unityで始める初めてのShader】ポストエフェクトの作り方3
記事に不備があった場合、未来の自分が直すと思います。
では、前回の続き。
前回は、フラグメントシェーダを定義し、そこでreturnしたカラーを画面に反映させることができました。カメラから取ってきた画面を加工するのが目的なので、カメラから映像を取ってきましょう。
まずは、一番最初に消したPropertiesを復活させます。Propertiesはシェーダ内の変数とUnity上の変数を結びつけるのに使用するものでしたね。
Properties { _MainTex("MainTex", 2D) = ""{} }続きを読む
【Unityで始める初めてのShader】ポストエフェクトの作り方2
前回の続きです。足りない情報は将来の自分が書き足してくれると思います。
PostEffect.shaderをいじっていきますよ。
まずはこんな感じにざっくりとコードを消して下さい。
Shader Custom/PostEffect { Properties { } SubShader { } FallBack Diffuse; }続きを読む