I have an error:
NullReferenceException
Shop.MakeShopWindow (.PlayerWeapon _weapon, UnityEngine.UI.Button _btn) (at Assets/Scripts/Menu/Shop.cs:58)
Shop.Start () (at Assets/Scripts/Menu/Shop.cs:29)
I looked through the internet everywhere but I couldn't find it.
I tried looking at all my code in three scripts which all are being used in my shop but I couldn't find anything. My main script for the in-game store Shop.cs
:
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
public class Shop : MonoBehaviour {
public PlayerWeapon[] weapons;
public GameObject[] graphics;
public Button[] buttons;
public Button backButton;
public int money;
void Start()
{
addWeaponsToArray();
backButton.onClick.AddListener(delegate ()
{
SwitchScene.MainMenu();
});
for(int i = 0; i < weapons.Length; i++)
{
if (buttons[i] == null)
Debug.LogError("Shop: No button referenced in screen for index " + i + ".");
else
{
MakeShopWindow(weapons[i], buttons[i]);
if (!weapons[i].purchased && weapons[i].cost > money || weapons[i].active)
{
buttons[i].enabled = false;
}
buttons[i].onClick.AddListener(delegate ()
{
if (weapons[i].purchased)
{
foreach(PlayerWeapon _weapon in weapons)
{
_weapon.active = false;
}
foreach (Button _btn in buttons)
{
_btn.enabled = true;
}
weapons[i].active = true;
buttons[i].enabled = false;
}
else if (weapons[i].cost <= money)
{
if (EditorUtility.DisplayDialog("Buy the " + weapons[i].name + "?", "Are you sure you would like to by the " + weapons[i].weaponName + " for " + weapons[i].cost + " points?", "YES! LET'S DO IT!", "no. maybe later"))
{
foreach (PlayerWeapon _w in weapons)
{
_w.active = false;
}
foreach (Button _btn in buttons)
{
_btn.enabled = true;
}
weapons[i].purchased = true;
weapons[i].active = true;
buttons[i].enabled = false;
}
}
});
}
}
}
void MakeShopWindow(PlayerWeapon _weapon, Button _btn)
{
//Title
GUIText title = new GUIText();
title.text = _weapon.weaponName;
title.fontSize = 50;
title.transform.parent = _btn.transform;
title.transform.position = new Vector3(0, 500);
//Description
GUIText description = new GUIText();
description.text = _weapon.description;
description.transform.parent = _btn.transform;
description.transform.position = Vector3.zero;
//Cost
GUIText cost = new GUIText();
cost.text = _weapon.cost.ToString();
cost.transform.parent = _btn.transform;
cost.transform.position = new Vector3(0, 500);
}
//Format:
//weapons.setValue(CreateWeapon.newWeapon(<Name>, <Price>, <Description>, <Damage>, <Fire Rate>, <Inaccuracy>, [Range], [Purchased or not], [If it's active]), weapons.Length)
void addWeaponsToArray()
{
weapons.SetValue(CreateWeapon.newWeapon("Rotofury", 1, "3 words: brute, forceful, and inacurate", 100, 0.77f, 50), 0);
}
}
Then I have my script for creating weapons CreateWeaopn.cs
:
using UnityEngine;
public class CreateWeapon {
public static PlayerWeapon newWeapon(string _name, int _cost, string _description, int _damage, float _fireRate, int _inaccuracy, int _range = 100, bool _purchased = false, bool _active = true, GameObject _graphics = null)
{
PlayerWeapon _weapon = new PlayerWeapon();
_weapon.weaponName = _name;
_weapon.cost = _cost;
_weapon.description = _description;
_weapon.damage = _damage;
_weapon.fireRate = _fireRate;
_weapon.range = _range;
_weapon.purchased = _purchased;
_weapon.active = _active;
_weapon.inaccuracy = _inaccuracy;
_weapon.graphics = _graphics;
return _weapon;
}
}
and my weapon script PlayerWeapon.cs
:
using UnityEngine;
public class PlayerWeapon : MonoBehaviour {
public string weaponName;
public int cost;
public string description;
public int damage;
public float range;
public float fireRate;
public bool purchased;
public bool active;
public int inaccuracy;
public GameObject graphics;
}
Here are a few pictures of my unity project:
The part of the inspector for the Shop.cs
is in (It's part of the Canvas'
inspector):
To try to fix this, I tried copying all the code into a new script, and the same error happened.