かさたな日記

主にUnityを使った制作記録。書いてる人は初心者です。一緒に頑張ろう。

自分用Unityメモ:クラスをシリアライズしてインスペクタから編集

クラスをシリアライズすることで
インスペクタから内容を直接編集することが出来るみたい。

やり方はシリアライズしたいクラスの前に

[System.Serializable]

を付けるだけ。

public class Test : MonoBehaviour


       public List<hoge> hogeList = new List<hoge>();

        [System.Serializable]
        public class hoge
        {
            public string key;
            public int value;
        }

}


上の例ではListになったhogeクラスの内容を
インスペクタから設定することが出来るようになります。

現在unityではDictionaryはインスペクタに対応してないみたいですが、
これを使えば疑似的にDictionaryっぽい使い方もできそうです。
ちょっと回りくどいケド...

public int GetHogeValue(string key)
{
    return hogeList.Find(x => x.key == key).value;
}

こんな感じで中身を持って来れます。
ただ、クラスの中に要素が多い場合はクラスそのものを取得した方が良さそうです。


パフォーマンスは...どうだろうか...

そろそろデザイン画をお届けせねば。
タスク的に休日返上になるけど、まだ平気さ。

自分用Unityメモ:UnityEventでコールバック

ちょっと便利なことを知ったのでブログに書いておこう。
もしかしたら基本なのかもしれないけど。
ボクのような初心者にとってはかなり使える機能だったのだ...。


UnityにはUnityEventなるクラスがありまして、
これを使うことでコールバックイベントのような機能を持たせることができます。
一番わかりやすいのがButtonコンポーネントのOnClickイベント。

//↓この名前空間を使うよと言っておく。
//  言わないとUnityEventなんて知らないよ、と怒られる。
using UnityEngine.Events

~~~~~~~~~~~~

    [SerializeField]
    private UnityEvent callBackEvent;

こんな感じで定義して、シリアライズしておきます。

するとButtonのときみたいにインスペクターから
イベント(任意のメソッド)を追加できるようになります。
(※追加できるのはpublicだけです。引数は1つだけ。きっとスペースの関係)

あとは

    callBackEvent.Invoke();

で、設定したイベントを呼び出すことができます。

動的にメソッドを追加・削除したいときは、
AddListener、RemoveListenerを使います。
その場合は多分、引数は2つ以上でも大丈夫だと思います。
(試してないの...でも、ボタンの時は行けたから...)


これを使うことで
「特定の状況になったら呼ばれるイベント」を
あとから決めたり、差し替えたりできます。便利。


今回はこの機能を使って、
マウスのドラッグやタップ(おまけで方向キー)の入力に反応するマネージャーと
超簡易なステートマシンもどきを作ってみました。




最終的に2つを連携させることにしたので
互いのクラスにめり込んでて、あんまりスマートではないけど....。


#追記
気になるのでもうクラス自体をくっつけてしまった。
コードはすっきりした。コードは....