Generikleri desteklemek için Unity singleton taban sınıfı nasıl yapılır?
Projemde, resimde gösterildiği gibi bir sınıf yapısına sahibim.
Yeşil sınıflar, çok iyi çalışan eski kodlardır. Kırmızı kutulardaki sınıflar yeni eklenen kodlardır. Derleyici hataları yoktur, ancak Unity içinde oynat ve yeni kodda çalıştırıldığında, üç sınıf doğru şekilde başlatılamaz.
Ve birlik konsolu, "DataMgrBase`2" adlı sınıfın genel olduğunu bildiren uyarı verir. Genel MonoBehaviours desteklenmez! UnityEngine.GameObject: AddComponent() "bu satırda:" instance = obj.AddComponent(); "
Bu sorunu nasıl çözebilirim?
Referans için bazı kodlar aşağıdadır, teşekkürler! Singleton taban sınıfın
Uygulama: DataMgrBase ait
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);
}
}
}
Uygulama:
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);
}
}
}
Bu harika bir çözümdür, ancak küçük bir his var, Unity3D bir şey yapmanın pek yolu değil. Her neyse problemi çözmek için congratz! –
Teşekkürler :) @JerrySwitalski – ArtS