In my project, I have the below code structure. Being a unity project, each class is of course in its own file with appropriate uses and method implementations. My question is, why am I getting a null reference exception (at the bottom). When debugging, the line in question shows both icons and database are null - even after the call to buildDatabase()
What am I missing? Is there a better way to approach this?
Thanks,
public abstract class CGenericDatabase : Monobehaviour {
[SerializeField]protected TextAsset _textFile;
publict TextAsset TextFile { get => _textFile; set { _textFile = value; ReloadTextFile(); }
public void ReloadTextFile() { throw new NotImplementedException(); }
}
public abstract class GenericDatabase<T> : CGenericDatabase where T: class {
[SerializeField]protected List<T> _list;
protected override void ReloadTextFile() { ... }
protected abstract T ParseString(String line);
public abstract T Find(String item_name);
}
public class IconDatabase : GenericDatabase<CardIcon> {
protected override CardIcon ParseString(String line) { ... }
public override CardIcon Find(String item_name) { ... }
}
public abstract class IconDatabaseUser<T> : GenericDatabase<T> where T: class {
[SerializeField]protected IconDatabase _icons;
public IconDatabase icons {
get { return _icons; }
set { _icons = value; ReloadTextFile(); }
}
}
public class PowerDatabase : IconDatabaseUser<CardPower> {
protected override CardPower ParseString(String line) { ... }
public override CardPower Find(String item_name) { ... }
}
public class RarityDatabase : IconDatabaseUser<CardRarity> {
protected override CardRarity ParseString(String line) { ... }
public override CardRarity Find(String item_name) { ... }
}
public class CanonDatabase : IconDatabaseUser<CardCanon> {
protected override CardCanon ParseString(String line) { ... }
public override CardCanon Find(String item_name) { ... }
}
public class DatabaseStore : GenericSingleton<DatabaseStore> {
[SerializeField] private TextAsset _iconsText;
[SerializeField] private TextAsset _powersText;
[SerializeField] private TextAsset _raritiesText;
[SerializeField] private TextAsset _canonsText;
[SerializeField] private TextAsset _cardsText;
public IconDatabase _icons { get; private set; }
public PowerDatabase _powers { get; private set; }
public RarityDatabase _rarities { get; private set; }
public CanonDatabase _canons { get; private set; }
public CardDatabase _cards { get; private set; }
private void Start() {
buildDatabase(_icons).TextFile = _iconsText;
buildUserDatabase<PowerDatabase,CardPower>(_powers, _powersText);
buildUserDatabase<RarityDatabase,CardRarity>(_rarities, _raritiesText);
buildUserDatabase<CanonDatabase,CardCanon>(_canons, _canonsText);
// buildUserDatabase<CardDatabase,CardDefinition>(_cards, _cardsText);
}
private T buildDatabase<T>(T database) where T: CGenericDatabase {
if (database != null)
DestroyImmediate(database);
database = gameObject.AddComponent<T>();
return database;
}
private void buildUserDatabase<T,U>(T database, TextAsset file) where U: class where T: IconDatabaseUser<U> {
buildDatabase(database);
database.iconDatabase = _icons; // NullReferenceException: Object reference not set to an instance of an object
database.TextFile = file;
}
}