I'm using the newest version of unity and I have a class with property public AllStats BaseStats { get; set; }
, where the class AllStats is implemented like this:
public class AllStats : IEnumerable<Stats>
{
private MagicPower magicPower;
public MagicPower MagicPower
{
get { return magicPower; }
set
{
magicPower = value;
Add("Magic Power", magicPower);
}
}
private DebuffDuration debuffDuration;
public DebuffDuration DebuffDuration
{
get { return debuffDuration; }
set
{
debuffDuration = value;
Add("Debuff Duration", debuffDuration);
}
}
private Defense defense;
public Defense Defense
{
get { return defense; }
set
{
defense = value;
Add("Defense", defense);
}
}
private MagicDefense magicDefense;
public MagicDefense MagicDefense
{
get { return magicDefense; }
set
{
magicDefense = value;
Add("Magic Defense", magicDefense);
}
}
private CriticalPower criticalPower;
public CriticalPower CriticalPower
{
get { return criticalPower; }
set
{
criticalPower = value;
Add("Critical Power", criticalPower);
}
}
private CriticalChance criticalChance;
public CriticalChance CriticalChance
{
get { return criticalChance; }
set
{
criticalChance = value;
Add("Critical Chance", criticalChance);
}
}
private Multistrike multistrike;
public Multistrike Multistrike
{
get { return multistrike; }
set
{
multistrike = value;
Add("Multistrike", multistrike);
}
}
private CooldownReduction cooldownReduction;
public CooldownReduction CooldownReduction
{
get { return cooldownReduction; }
set
{
cooldownReduction = value;
Add("Cooldown Reduction", cooldownReduction);
}
}
private Evasion evasion;
public Evasion Evasion
{
get { return evasion; }
set
{
evasion = value;
Add("Evasion", evasion);
}
}
private Resistance resistance;
public Resistance Resistance
{
get { return resistance; }
set
{
resistance = value;
Add("Resistance", resistance);
}
}
private readonly Dictionary<string, Stats> _items = new Dictionary<string, Stats>();
public void Add(string element, Stats config)
{
_items[element] = config;
}
public Stats this[string element]
{
get { return _items.ContainsKey(element) ? _items[element] : null; }
set { _items[element] = value; }
}
public IEnumerator<Stats> GetEnumerator()
{
return _items.Values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _items.Values.GetEnumerator();
}
}
However, when I try to create new instance of this class like this :
BaseStats = new AllStats()
{
MagicPower = new MagicPower(Level.CurrentLevel),
DebuffDuration = new DebuffDuration(Level.CurrentLevel),
Defense = new Defense(Level.CurrentLevel),
MagicDefense = new MagicDefense(Level.CurrentLevel),
CriticalPower = new CriticalPower(1),
CriticalChance = new CriticalChance(1),
Multistrike = new Multistrike(1),
CooldownReduction = new CooldownReduction(1),
Evasion = new Evasion(1),
Resistance = new Resistance(1)
};
I get null reference exception. Why is that ? This used to work in normal visual studio, but it seems like the older version of unity is causing some problems. How can I fix this ?
Here is the Stats
Class :
public enum StatsOrders
{
MagicPower,
DebuffDuration,
Defense,
MagicDefense,
CriticalPower,
CriticalChance,
Multistrike,
CooldownReduction,
Evasion,
Resistance
}
public abstract class Stats : IStats
{
public double PointsInStats { get; set; }
public bool IsSuccessfulHit(double baseStats)
{
return Increase(baseStats)*10 >= new RngCrypto().Next(1, 1001);
}
public double Increase(double baseInput)
{
return CalculateIncreament(baseInput, PointsInStats);
}
protected abstract double percentageIncrease { get; set; }
protected Stats(double pointsInStats)
{
PointsInStats = pointsInStats;
}
protected double CalculateIncreament(double baseInput, double pointsInStats)
{
string a = (baseInput * (pointsInStats / percentageIncrease)).ToString("N1");
return double.Parse(a);
}
}
The enum is used whenever you level up you get a small window of notification which includes the updated stats and this enum helps keep them in order.
Also the IStats
interface :
public interface IStats
{
double PointsInStats { get; set; }
bool IsSuccessfulHit(double baseStats);
double Increase(double input);
}