C#の便利な機能「ジェネリック」
たとえば、RPGでHPなどを個別に成長させるシステムがあったとして
その成長パラメータは、レベルがあがると同じような計算式によって成長していくものであるとすると、以下のようにパラメータクラスを用意しておくと便利かもしれません。
using UnityEngine; using System.Collections; [System.Serializable] public class GrowthParameter<T> { public int level = 1; public T value; };
すると。
GrowthParameter<int> hp = new GrowthParameter<int>(); GrowthParameter<float> reloadTime = new GrowthParameter<float>(); hp.value = 10; reloadTime = 5.0f;
と、型は違うけど成長に必要な要素は同じなので、成長処理を何度も書く必要がなくなります。
レベルが上がったら同じ計算がされるだけです。
さて、こんな便利なジェネリックですが、[System.Serializable]をつけたとしてもUnityのInspectorには表示されません。
これでは、いくらジェネリックが便利でも、使える場所があまりにも限定されてしまうので良くありませんね。
そんな時、Unity Answersを眺めていたら、ちょっと手を加えるだけでシリアライズ可能になるよ!というのを見つけたので紹介します。
http://answers.unity3d.com/questions/214300/serializable-class-using-generics.html
コレにしたがって書くと。
[System.Serializable] public class GrowthIntParameter : GrowthParameter<int> { } [System.Serializable] public class GrowthFloatParameter : GrowthParameter<float> { }
となります。
基本的な処理は同じだけど、どうしてもジェネリック使わないときれいにコーディングできない!
使う型はある程度分かってるし、そこまでの汎用性は必要ない!
そんなことがあれば、使える方法かもしれませんね。
Unityのアセット販売中!
ステートマシンの状態遷移やパラメータはエディタで編集でき、
ゲームロジックに依存するステートの挙動はスクリプトで記述可能なエディタ拡張。
RPGツクールVXやWOLF RPGエディターのオートタイルに準拠したエディタ拡張。