御笠帖

作業記録など

エディタ拡張(Custom Editors)でInspectorにリストを追加したい

mikasa.hatenablog.jp
でエディタ拡張について整理したので作り始めたところ、早速躓いたのでメモ。

f:id:mikasanow:20150511151041p:plain
これを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

今回必要な「LightShafts」のみインポート。

Unity5用にUpdateするか聞いてくるのでGo Ahead!!

Spotlightに「LightShafts」をアタッチ。
Volume Start、Volume Endで位置を調整。
f:id:mikasanow:20150505123947p:plain

Gameビューで確認
OFF
f:id:mikasanow:20150505123956p:plain
ON
f:id:mikasanow:20150505124002p:plain


プロジェクト
mikasaNow/VolumeLight · GitHub

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]をアタッチ

確認用に床と箱を追加するとこんな感じに。右のカメラの映像がスクリーンに投影されています。
f:id:mikasanow:20150505045453p:plain

作成中のアプリにも使ってます。



プロジェクト
mikasaNow/RenderTexture · GitHub

Particle Systemで火球を作ってみる

テクスチャを用意。
SAIで作成したけど透過を扱えるペイントソフトならなんでも良い。
512*512、背景透過で作成。


[GameObject] -> [Particle System] でオブジェクトを追加。
Unity - マニュアル: パーティクルシステムリファレンス
でパラメータの意味を確認しながら設定していく。

以下設定例
f:id:mikasanow:20150505031602p:plain

同じテクスチャでパラメータのみ変更して3パターン作成してみた。
設定例は左のもの。


作業中に発生したエラーと対処



プロジェクト
mikasaNow/Particles · GitHub