So many thread about this problem. But I can't find how to fix it. Can anyone tell me where do I go wrong in my code?
NullReferenceException: Object reference not set to an instance of an object PlayerWeaponController.EquipWeapon (.Item itemToEquip(atAssets/Scripts/PlayerWeaponController.cs:33) InventoryController.Update ((atAssets/Scripts/Inventory/InventoryController.cs:61)
And here is the code for player weapon controller
using UnityEngine;
using System.Collections;
public class PlayerWeaponController : MonoBehaviour {
public GameObject playerHand;
public GameObject EquippedWeapon { get; set; }
IWeapon equippedWeapon;
CharacterStats characterStats;
void Start()
{
characterStats = GetComponent<CharacterStats>();
}
public void EquipWeapon(Item itemToEquip)
{
if (EquippedWeapon != null)
{
characterStats.RemoveStatBonus(EquippedWeapon.GetComponent<IWeapon>().Stats);
Destroy(playerHand.transform.GetChild(0).gameObject);
}
EquippedWeapon = (GameObject)Instantiate(Resources.Load<GameObject>("Weapons/" + itemToEquip.ObjectSlug),
playerHand.transform.position, playerHand.transform.rotation);
equippedWeapon = EquippedWeapon.GetComponent<IWeapon>();
equippedWeapon.Stats = itemToEquip.Stats;
EquippedWeapon.transform.SetParent(playerHand.transform);
characterStats.AddStatBonus(itemToEquip.Stats);
Debug.Log(equippedWeapon.Stats[0]);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.X))
PerformWeaponAttack();
//if (Input.GetKeyDown(KeyCode.Z))
//PerformWeaponSpecialAttack();
}
public void PerformWeaponAttack()
{
equippedWeapon.PerformAttack();
}
}
and here is the code for inventory controller
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
public class InventoryController : MonoBehaviour {
public PlayerWeaponController playerWeaponController;
public List<Item> playerItems = new List<Item>();
public Item sword;
void Start()
{
playerWeaponController = GetComponent<PlayerWeaponController>();
List<BaseStat> swordStats = new List<BaseStat>();
swordStats.Add(new BaseStat(6, "Power", "Your power level."));
sword = new Item(swordStats, "sword");
}
public void EquipItem(Item itemToEquip)
{
playerWeaponController.EquipWeapon(itemToEquip);
}
void Update()
{
if(Input.GetKeyDown(KeyCode.V))
{
playerWeaponController.EquipWeapon(sword);
}
}
}
and here is the item
using UnityEngine;
using System.Collections.Generic;
public class Item {
public List<BaseStat> Stats { get; set; }
public string ObjectSlug { get; set; }
public Item(List<BaseStat> _Stats, string _ObjectSlug)
{
this.Stats = _Stats;
this.ObjectSlug = _ObjectSlug;
}
}
this the basestat
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class BaseStat
{
public List<StatBonus> BaseAdditives { get; set; }
public int BaseValue { get; set; }
public string StatName { get; set; }
public string StatDescription { get; set; }
public int FinalValue { get; set; }
public BaseStat(int baseValue, string statName, string statDescription)
{
this.BaseAdditives = new List<StatBonus>();
this.BaseValue = baseValue;
this.StatName = statName;
this.StatDescription = statDescription;
}
public void AddStatBonus(StatBonus statBonus)
{
this.BaseAdditives.Add(statBonus);
}
public void RemoveStatBonus(StatBonus statBonus)
{
this.BaseAdditives.Remove(BaseAdditives.Find(x=> x.BonusValue == statBonus.BonusValue));
}
public int GetCalculatedStatValue()
{
this.FinalValue = 0;
this.BaseAdditives.ForEach(x => this.FinalValue += x.BonusValue);
this.FinalValue += BaseValue;
return FinalValue;
}
}
and this characterstat
using UnityEngine;
using System.Collections.Generic;
public class CharacterStats: MonoBehaviour {
public List<BaseStat> stats = new List<BaseStat>();
private void Start()
{
stats.Add(new BaseStat(4, "Power", "Your power level."));
stats.Add(new BaseStat(2, "Vitality", "Your vitality level."));
}
public void AddStatBonus(List<BaseStat> statBonuses)
{
foreach(BaseStat statBonus in statBonuses)
{
stats.Find(x=> x.StatName == statBonus.StatName).AddStatBonus(new StatBonus(statBonus.BaseValue));
}
}
public void RemoveStatBonus(List<BaseStat> statBonuses)
{
foreach (BaseStat statBonus in statBonuses)
{
stats.Find(x => x.StatName == statBonus.StatName).RemoveStatBonus(new StatBonus(statBonus.BaseValue));
}
}
}
Thanks in advance
It solved, I'm not inserting sword script to sword object. sorry and thanks for all