Hi everyone. Well, i’m trying to make a game with RPG elements which the player have to select 3 characters, one of each type (Fighter, Especialist, Caster), but i’m having trouble trying to make the characters receive their stats when they are instanciated on the character selection screen to show them to the player.
So, here is the CharacterStats.js Script:
#pragma strict
import System.Collections.Generic;
class CharacterBaseStats{
var maxHealth: float;
var maxMP: float;
var Health: float;
var MP: float;
var baseATK: float;
var baseMagicATK: float;
var baseDEF: float;
var baseMagResistence: float;
}
public enum FighterCharacterType{
Warrior = 0,
Paladin = 1,
Barbarian = 2
}
class FighterCharacterTypeStats{
var basicStats = CharacterBaseStats();
var characterClass: FighterCharacterType;
}
var listFighterCharacterStats = List.<FighterCharacterTypeStats>();
public static var instance: CharacterStats;
static function GetFighterType(){
var classID: int = PlayerPrefs.GetInt("FighterClassType");
if (classID == 0){
return FighterCharacterType.Warrior;
} else if (classID == 1){
return FighterCharacterType.Paladin;
} else if (classID == 2){
return FighterCharacterType.Barbarian;
}
}
static function SetFighterType(characterClass: int){
PlayerPrefs.SetInt("FighterClassType", characterClass);
}
static function GetFighterBaseStats(fighterTypeCharacter: FighterCharacterType){
for (var info: FighterCharacterTypeStats in instance.listFighterCharacterStats){
if(info.characterClass == fighterTypeCharacter){
return info.basicStats;
}
}
return instance.listFighterCharacterStats[0].basicStats;
}
I filled out the listFighterCharacterStats on the Inspector.
CharacterSelection.js:
#pragma strict
import System.Collections.Generic;
var listFighters = List.<GameObject>();
var listEspecialists = List.<GameObject>();
var listCasters = List.<GameObject>();
var characterFighter : GameObject;
var characterEspecialist : GameObject;
var characterCaster : GameObject;
var i : int;
var iFighter : int;
var iEspecialist : int;
var iCaster : int;
function Start () {
i = 0;
iFighter = 0;
iEspecialist = 0;
iCaster = 0;
}
function Update () {
switch(i){
case 0 :
SelectFighter();
break;
case 1 :
SelectEspecialist();
break;
case 2 :
SelectCaster();
break;
}
if (Input.GetKeyDown(KeyCode.UpArrow)){
i--;
if (i < 0){
i = listFighters.Count-1;
}
} else if (Input.GetKeyDown(KeyCode.DownArrow)){
i++;
if (i >= listFighters.Count){
i = 0;
}
}
}
function SelectFighter(){
if (!characterFighter){
CharacterStats.SetFighterType(iFighter);
characterFighter = Instantiate(listFighters[iFighter], new Vector3(0, 5, transform.position.z), Quaternion.identity);
characterFighter.AddComponent.<Fighter>();
characterFighter.GetComponent(Rigidbody).useGravity = false;
characterFighter.transform.LookAt(transform);
}else{
characterFighter.transform.Rotate(0, 90*Time.deltaTime, 0);
}
if (Input.GetKeyDown(KeyCode.LeftArrow)){
iFighter--;
if (iFighter < 0){
iFighter = listFighters.Count-1;
}
Destroy(characterFighter);
} else if (Input.GetKeyDown(KeyCode.RightArrow)){
iFighter++;
if (iFighter >= listFighters.Count){
iFighter = 0;
}
Destroy(characterFighter);
}
}
The SelectEspecialist() and SelectCaster() works the SelectFighter() function.
Well, both Scripts above are in the same gameObject on the scene.
This is the code attached to the prefabs that are instantiated on the CharacterSelection Script:
Fighter.js
#pragma strict
var class: FighterCharacterType;
var stats: CharacterBaseStats;
function Start () {
class = CharacterStats.GetFighterType();
stats = CharacterStats.GetFighterBaseStats(class);
}
And when this code runs, Unity give me the error:
NullReferenceException: Object reference not set to an instance of an object
CharacterStats.GetFighterBaseStats (FighterCharacterType fighterTypeCharacter) (at Assets/Scripts/CharacterStats.js:48)
Fighter.Start () (at Assets/Scripts/Fighter.js:8)
I don’t understand what’s going on for the error to happens, so i need help.
Sorry for any english error and any formatation error, i’m new to the forum.
Thanks for the attention.