ジェネリックをサポートするUnityシングルトンベースクラスを作成するには?
私のプロジェクトでは、画像に示すようなクラス構造を持っています。
緑のクラスは非常によく走る古いコード、です。赤いボックスのクラスは新しく追加されたコードです。コンパイラエラーはありませんが、Unityでクリックを再生して新しいコードを実行すると、3つのクラスを正しく初期化できません。
ユニティコンソールでは、「DataMgrBase`2というクラスは一般的です。一般的なMonoBehavioursはサポートされていません!UnityEngine.GameObject:AddComponent()」という行があります: "instance = obj.AddComponent(); "
どうすればこの問題を解決できますか?続き
は、おかげであなたの参考のためにいくつかのコードです!シングルトンベースクラスの
実装:DataMgrBaseの
using UnityEngine;
using System.Collections;
public class UnitySingletonPersistent<T> : MonoBehaviour where T : Component
{
private static T instance;
public static T Instance {
get {
if (instance == null) {
instance = FindObjectOfType<T>();
if (instance == null) {
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
obj.hideFlags = HideFlags.DontSave;
instance = obj.AddComponent<T>();
}
}
return instance;
}
}
public virtual void Awake()
{
DontDestroyOnLoad (this.gameObject);
if (instance == null) {
instance = this as T;
} else {
Destroy (gameObject);
}
}
}
が実装:あなたの具体的なクラスに続いて
public abstract class UnitySingletonPersistent<T> : MonoBehaviour where T:UnitySingletonPersistent<T>
{
...
}
:
public class DataMgrBase<TKey, TValue>: UnitySingletonPersistent<DataMgrBase<TKey, TValue>> {
protected Dictionary<TKey, TValue> dataDict;
public override void Awake()
{
base.Awake();
dataDict = new Dictionary<TKey, TValue>();
}
public TValue GetDataForKey(TKey key)
{
TValue data;
if (dataDict.TryGetValue(key, out data))
{
return data;
}
else
{
data = LoadDataForKey(key);
if (data != null)
{
dataDict.Add(key, data);
}
return data;
}
}
virtual protected TValue LoadDataForKey(TKey key)
{
if (dataDict.ContainsKey(key))
{
return GetDataForKey(key);
}
else
{
return default(TValue);
}
}
}
これはクールな回避策ですが、私はそれがUnity3Dのやり方ではないという小さな感情を持っています。とにかく問題を解決するためにcongratz! –
ありがとう:) @ジェリースウィタルスキ – ArtS