The randomizeMonster function gives a NullReferenceException: Object reference not set to an instance of an object, when it’s called from the state machine.
randomizeMonster works if i call it from the start or update functions.
I think i’ve tracked the problem to the AllMonsters array, but i don’t know how to solve it.
Help is much appreciated
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class BattleStateStart : MonoBehaviour {
public string region; //current region
public monster[] AllMonsters; //array for premade monsters
public monster enemyMonster; //the generated enemy
public monster monsterEquiped; //our monster
// Use this for initialization
void Start () {
Debug.Log(AllMonsters.Length);
randomizeMonster (); //<<<<<<<< Calling randomizeMonster in update or start works, from boths classes
}
// Update is called once per frame
void Update () {
}
public void PrepareBattle(){
Debug.Log ("Preparing for battle");
randomizeMonster ();
}
//The NullReferenceException: Object reference not set to an instance of an object is somehow caused by the
//AllMonsters array. If i change AllMonsters.Length bellow to ex. 3 then it works but then the problem jumps to the next
//place AllMonsters[] is used.
void randomizeMonster(){
List<monster> tempMonster = new List<monster>();
int randomNumber = Random.Range(0,100);
if(randomNumber==20){
for(int i=0;i<AllMonsters.Length;i++){
if(AllMonsters_.rarity==monster.Rarity.Rare && AllMonsters*.Location==region){*_
tempMonster.Add(AllMonsters*);*
}
}
}else{
for(int j=0;j<AllMonsters.Length;j++){
if(AllMonsters[j].rarity==monster.Rarity.Common && AllMonsters[j].Location==region){
tempMonster.Add(AllMonsters[j]);
}
}
}
int newRandom = Random.Range (0, tempMonster.Count);
enemyMonster = tempMonster [newRandom];
}
//Basic monster GUI
void OnGUI(){
//Enemy monster
GUI.Label (new Rect (Screen.width / 2, 100, 200, 100), “” + enemyMonster.Name);
GUI.Label (new Rect (Screen.width / 2, 110, 200, 100), "HP " + enemyMonster.curHP + “/” + enemyMonster.baseHP);
//Player monster
GUI.Label (new Rect (50, 100, 200, 100), “” + monsterEquiped.Name);
GUI.Label (new Rect (50, 110, 200, 100), "HP " + monsterEquiped.curHP + “/” + monsterEquiped.baseHP);
}
}
using UnityEngine;
using System.Collections;
public class TurnBasedCombatStateMachine : MonoBehaviour {
private BattleStateStart battleStateStartScript = new BattleStateStart();
//The different states
public enum Battlestates{
START,
PLAYERCHOICE,
ENEMYCHOICE,
LOSE,
WIN,
CALCULATEDAMAGE,
ADDSTATUSEFFECTS
}
private Battlestates currentState;
// Use this for initialization
void Start () {
currentState = Battlestates.START;
}
// Update is called once per frame
void Update () {
Debug.Log (currentState);
switch (currentState) {
case(Battlestates.START):
battleStateStartScript.PrepareBattle(); //<<<<< Calling randomizeMonster by calling PreparBattle
// doesn’t work, gives
// NullReferenceException: Object reference
// not set to an instance of an object
break;
case(Battlestates.PLAYERCHOICE):
break;
case(Battlestates.ENEMYCHOICE):
break;
case(Battlestates.CALCULATEDAMAGE):
break;
case(Battlestates.ADDSTATUSEFFECTS):
break;
case(Battlestates.LOSE):
break;
case(Battlestates.WIN):
//Add XP
break;
}
}
//Change state button
void OnGUI(){
if(GUILayout.Button(“Next State”)){
if(currentState==Battlestates.START){
currentState=Battlestates.PLAYERCHOICE;
}else if(currentState==Battlestates.PLAYERCHOICE){
currentState=Battlestates.ENEMYCHOICE;
}else if(currentState==Battlestates.ENEMYCHOICE){
currentState=Battlestates.LOSE;
}else if(currentState==Battlestates.LOSE){
currentState=Battlestates.WIN;
}else if(currentState==Battlestates.WIN){
currentState=Battlestates.START;
}
}
}
}