- Home /
Error calling enum lists
Hey, I've been following BurgZergArcade's tutorials on youtube and one thing he uses during his set up for a leveling system is create enum lists for the vitals (health, stamina and mana) and his skills (Melee offense and the like). I've been having problems when trying to modify and display the values in the script that have an index value greater than 0. Any insight as to why, or if possible how to fix it would be very appreciated.
The errors I receive when I uncomment any of the commented lines in SetupVitalModifiers(); or SetupSkillModifiers(); are all Null Reference errors.
Vital.cs:
public class Vital : ModifiedStat {
private int _curValue;
public Vital(){
_curValue = 0;
ExpToLevel = 50;
LevelModifier = 1.1f;
}
public int CurValue{
get{
if(_curValue > AdjustedBaseValue){
_curValue = AdjustedBaseValue;
}
return _curValue;
}
set{ _curValue = value;}
}
}
public enum VitalName{
Health,
Stamina,
Mana
}
Skill.cs:
public class Skill : ModifiedStat {
private bool _known;
public Skill(){
_known = false;
ExpToLevel = 25;
LevelModifier = 1.1f;
}
public bool Known {
get{ return _known;}
set{ _known = value; }
}
}
public enum SkillName{
Melee_Offence,
Melee_Defense,
Ranged_Offence,
Ranged_Defense,
Magic_Offence,
Magic_Defense
}
ModifiedStat.cs:
using System.Collections.Generic;
public class ModifiedStat : BaseStat {
private List<ModifyingAttribute> _mods; //A list of attributes that modify this stat
private int _modValue; //The amount added to the baseValue from the modifiers
public ModifiedStat(){
_mods = new List<ModifyingAttribute>();
_modValue = 0;
}
public void AddModifier(ModifyingAttribute mod){
_mods.Add(mod);
}
private void CalculateModValue(){
_modValue = 0;
if(_mods.Count > 0){
foreach(ModifyingAttribute att in _mods){
_modValue += (int)(att.attribute.AdjustedBaseValue * att.ratio);
}
}
}
public new int AdjustedBaseValue {
get{return BaseValue + BuffValue + _modValue; }
}
public void Update(){
CalculateModValue();
}
}
public struct ModifyingAttribute {
public Attribute attribute;
public float ratio;
public ModifyingAttribute(Attribute att, float rat){
attribute = att;
ratio = rat;
}
}
BaseCharacter.cs
using UnityEngine;
using System.Collections;
using System; //For access to enum class
public class BaseCharacter : MonoBehaviour {
private string _name;
private int _level;
private uint _freeExp;
private Attribute[] _primaryAttribute;
private Vital[] _vital;
private Skill[] _skill;
public void Awake(){
_name = string.Empty;
_level = 0;
_freeExp = 0;
_primaryAttribute = new Attribute[Enum.GetValues(typeof(AttributeName)).Length];
_vital = new Vital[Enum.GetValues(typeof(VitalName)).Length];
_skill = new Skill[Enum.GetValues(typeof(SkillName)).Length];
SetupPrimaryAttributes();
SetupVitals();
SetupSkills();
}
public void AddExp(uint exp) {
_freeExp += exp;
CalculateLevel();
}
public void CalculateLevel(){
//add more to this.
//Take avg of all skills and assign as player lvl
}
#region Setters and Getters
public string Name {
get{ return _name; }
set{ _name = value;}
}
public int Level {
get{return _level; }
set{ _level = value;}
}
public uint FreeExp {
get{ return _freeExp; }
set{ _freeExp = value;}
}
#endregion
#region Setup values
private void SetupPrimaryAttributes(){
for(int cnt = 0; cnt < _primaryAttribute.Length; cnt++){
_primaryAttribute[cnt] = new Attribute();
}
}
private void SetupVitals(){
for(int cnt = 0; cnt < _vital.Length; cnt++){
_vital[cnt] = new Vital();
SetupVitalModifiers();
}
}
private void SetupSkills(){
for(int cnt = 0; cnt < _skill.Length; cnt++){
_skill[cnt] = new Skill();
SetupSkillModifiers();
}
}
public Attribute GetPrimaryAttribute (int index){
return _primaryAttribute[index];
}
public Vital GetVital (int index){
return _vital[index];
}
public Skill GetSkill (int index){
return _skill[index];
}
#endregion
#region Modifiers for Vitals & Skills
private void SetupVitalModifiers(){
//health
GetVital((int)VitalName.Health).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Constitution), 2.0f));
//stamina
// GetVital((int)VitalName.Stamina).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Agility), 0.7f));
// GetVital((int)VitalName.Stamina).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Speed), 0.3f));
//mana
// GetVital((int)VitalName.Mana).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Willpower), 10.0f));
}
private void SetupSkillModifiers(){
// GetSkill((int)SkillName.Magic_Defense).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Intelligence), 0.5f));
// GetSkill((int)SkillName.Magic_Defense).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Willpower), 0.5f));
// GetSkill((int)SkillName.Magic_Offence).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Willpower), 0.5f));
// GetSkill((int)SkillName.Magic_Offence).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Charisma), 0.5f));
// GetSkill((int)SkillName.Melee_Defense).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Strength), 0.5f));
// GetSkill((int)SkillName.Melee_Defense).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Constitution), 0.5f));
GetSkill((int)SkillName.Melee_Offence).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Strength), 0.5f));
GetSkill((int)SkillName.Melee_Offence).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Speed), 0.5f));
// GetSkill((int)SkillName.Ranged_Defense).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Agility), 0.5f));
// GetSkill((int)SkillName.Ranged_Defense).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Intelligence), 0.5f));
// GetSkill((int)SkillName.Ranged_Offence).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Agility), 0.5f));
// GetSkill((int)SkillName.Ranged_Offence).AddModifier(new ModifyingAttribute(GetPrimaryAttribute((int)AttributeName.Speed), 0.5f));
}
public void StatUpdate(){
for(int cnt = 0; cnt < _vital.Length; cnt ++)
_vital[cnt].Update();
for(int cnt = 0; cnt < _skill.Length; cnt ++)
_skill[cnt].Update();
}
#endregion
}
Thanks for your time. If you need anything more please just ask.
Answer by DecipherOne · Nov 25, 2012 at 09:58 PM
It's hard to really say looking at the classes without seeing them in use. I would however stand to guess that based on what I see, it is possible that you are never initializing the variables in the arrays that hold the values for your skills. The classes the skills are based on don't seem to inherit from MonoBehavior so there is no default Update method being called for each game loop. As such, there is also no auto execution of the constructors that the skills class seems to have. Hard to say without looking more into it, but I would start there.
All things I've seen suggest using an Init() function instead of a default constructor because the execution of the constructor isn't guaranteed in it's order of execution, or that it is being invoked at all.
Your answer
Follow this Question
Related Questions
How would i use a enum? 1 Answer
Problem displaying an int 1 Answer
How come my character is moving so fast? 3 Answers
Enum change visible in editor? 1 Answer
Classes and type casting? 2 Answers