README first
I have multiple abilities, and each ability is of an AbilityCategory type.
Examples of AbilityCategory types are AbilityCategory_Magic, AbilityCategory_Physical, AbilityCategory_Ranged, AbilityCategory_Biological, and the list goes on...
AbilityCategories are classes derived from Ability.
Ability is a class that can only be instantiated an AbilityBaseData object is passed into its constructor.
I want to find way to link each ability to one AbilityBaseData in a Dictionary called defaultAbilityBaseDatabase.
Each ability may only be linked up to a maximum of 1 instance of AbilityBaseData in my defaultAbilityBaseDatabase.
-- AbilityBaseData.cs
[System.Serializable]
public class AbilityBaseData{
[SerializableField] Sprite abilityImage;
}
My current code structure:
-- AbilityDatabase.cs
enum EAbilityCategory_Magic{
Fireball,
IceBolt,
BlackMagic
};
enum EAbilityCategory_Physical{
SwordLance,
FearlessBlow,
RagnarokRage
};
enum EAbilityCategory_Ranged{
Snipe,
RainOfArrows,
CrossbowShot
};
enum EAbilityCategory_Biological{
VirusUnleash,
SuperBug
};
enum Eblabla{};
enum Eevenmore{};
... There are many more abilities ...
...
Dictionary<EAbilityCategory_Magic,AbilityBaseData> defaultMagicAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Physical,AbilityBaseData> defaultPhysicalAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Ranged,AbilityBaseData> defaultRangedAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Biological,AbilityBaseData> defaultBiologicalAbilityBaseDataDatabase;
... list keeps going on...
Code structure looking for:
-- AbilityDatabase.cs
enum class EAbility{}
enum EAbilityCategory_Magic : EAbility{
Fireball,
IceBolt,
BlackMagic
};
enum EAbilityCategory_Physical : EAbility{
SwordLance,
FearlessBlow,
RagnarokRage
};
enum EAbilityCategory_Ranged : EAbility{
Snipe,
RainOfArrows,
CrossbowShot
};
enum EAbilityCategory_Biological : EAbility{
VirusUnleash,
SuperBug
};
... There are many more abilities ...
...
Dictionary<EAbility,AbilityBaseData> defaultAbilityBaseDataDatabase;
This is the workaround I tried to use after encountering this problem
What variable type should I use to store types of a non sealed class or interface?
In which could have been like this:
//I can remove all enumerations have such a clean, one-line code
Dictionary<typeof(Ability),AbilityBaseData> defaultAbilityBaseDataDatabase;
I cannot combine all abilities like this:
enum EAbility{
Fireball,IceBolt,BlackMagic,SwordLance,FearlessBlow,RagnarokRage,Snipe,.....
};
because it will prevent me from doing this:
-- MagicAbilityFactory.cs
AbilityCategory_Magic Create(EAbilityCategory_Magic magicAbilityCategory, AbilityBaseData defaultAbilityBaseData){
switch(magicAbilityCategory){
case Fireball:
return new AbilityCategory_Magic_Fireball(abilityBaseData,other parameters);
case blabla:
}
return null;
}
This might be an option https://stackoverflow.com/posts/3460047/revisions but the problem is that I would rather find a clean solution which doesn't need me to add so many lines of code since I have thousands of abilities..