エディタ拡張(Custom Editors)でInspectorにリストを追加したい
mikasa.hatenablog.jp
でエディタ拡張について整理したので作り始めたところ、早速躓いたのでメモ。
これをCustom Editorsで作るのに苦労した。
以下で実現できる。
ランタイムスクリプト
using UnityEngine; using System.Collections.Generic; public class SampleScript : MonoBehaviour { public List<GameObject> objList; }
エディタスクリプト(*1)
using UnityEngine; using UnityEditor; [CustomEditor(typeof(SampleScript))] public class SampleScriptInspector : Editor { public override void OnInspectorGUI() { SerializedProperty prop = serializedObject.FindProperty("objList"); serializedObject.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(prop, true); if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); } } }
*1 "Editor"フォルダおよびそのサブフォルダのスクリプトは全てエディタスクリプトとなる。
まぁそもそも
Custom Editorsを使わなければランタイムスクリプトに
public List<GameObject> objList;
と書くだけで良いし、
Custom Editorsを使う場合でも上に加えてエディタスクリプトに
public override void OnInspectorGUI() { DrawDefaultInspector(); }
と書けば同じ結果になる。
でも、個人的にはCustom Editorsを使う場合は全部エディタスクリプトで管理したいので調べてみた。
ちなみにマニュアルによると、"DrawDefaultInspector();"は「全体のインスペクタ表示を1から入力したくない時に便利ですが、 いくつかのボタンなどを追加したい場合には当てはまりません。」とのこと。
何かは知らない。
Unity - スクリプティング API: Editor.DrawDefaultInspector
TODO
- リスト内の各要素の名前を個別に指定したい。
エディタ拡張ことはじめ
「Unity エディタ拡張」でググったところ、記事によってやってることが違い混乱してしまったので整理する。
マニュアルによると、一口にエディタ拡張といっても3つに分類される模様。
Property Drawers
Inspectorを拡張する。
変数・クラス定義に属性(Attribute)を与えることでInspector上の挙動を制御する。
(範囲指定、スライダー表示など)
スクリプト内に直接記述する。
Custom Editors
Inspectorを拡張する。
Property Drawersは予め用意された属性を使用するが、こちらは属性を自作する機能。
Assets/Editor配下に処理を書いたエディタースクリプトを格納する。
Editor Window
Unity組込み(Inspector等)ではない自前のインターフェースをごりごり作る。
こちらもAssets/Editor配下に処理を書いたエディタースクリプトを格納する。
なるほど!
スッキリした!!
マニュアル大事!!!
Unity5でボリュームライトを使ってみる
こちらの記事を参考に。
Unityでボリュームライト表現やレンズの汚れ表現 - テラシュールブログ
ボリュームライトはUnity5でもStandard Assetsに入っていないので、StoreからSample Assets(beta) for Unity 4.6を持ってくる。
https://www.assetstore.unity3d.com/jp/#!/content/21064
Unity5用にUpdateするか聞いてくるのでGo Ahead!!
Spotlightに「LightShafts」をアタッチ。
Volume Start、Volume Endで位置を調整。
Gameビューで確認
OFF
ON
Render Textureでカメラの映像をスクリーンに映す
[Project] -> [Texture] -> [Render Texture]を追加。
ひとまずプロパティはデフォルト。詳細は以下。
Unity - マニュアル: レンダーテクスチャ
必要なオブジェクトを追加する。
[Hierarchy] -> [Camera]を追加(サブカメラ)
[Hierarchy] -> [UI] -> [Canvas]を追加
[Canvas]に[UI] -> [Raw Image]を追加
追加したオブジェクトに[Render Texture]をアタッチ。
[Camera]のInspectorから[Camera] -> [Target Texture]に[Render Texture]をアタッチ
[Canvas]のInspectorから[Raw Image] -> [Texture]に[Render Texture]をアタッチ
確認用に床と箱を追加するとこんな感じに。右のカメラの映像がスクリーンに投影されています。
作成中のアプリにも使ってます。
Particle Systemで火球を作ってみる
テクスチャを用意。
SAIで作成したけど透過を扱えるペイントソフトならなんでも良い。
512*512、背景透過で作成。
[GameObject] -> [Particle System] でオブジェクトを追加。
Unity - マニュアル: パーティクルシステムリファレンス
でパラメータの意味を確認しながら設定していく。
以下設定例
同じテクスチャでパラメータのみ変更して3パターン作成してみた。
設定例は左のもの。
作業中に発生したエラーと対処
Unityでパーティクル作ってたらいつの間にか「Particle system meshes will only work with exactly one(1) sub mesh」ってエラーが出るようになった。
Render ModeはBillboardなんだけどなー
— 御笠 (@mikasaNow) May 2, 2015
どうも一度Render Mode->Meshを選択すると、その情報が残るっぽい
Render Mode->Meshを選択してMeshをNoneに。
その後、Billboardを選択することで解消された!
— 御笠 (@mikasaNow) May 2, 2015
プロジェクト
mikasaNow/Particles · GitHub