- Home /
C# NullReferenceException
Hi,
When I start my game I get this error:
NullReferenceException: Object reference not set to an instance of an object PlayerAttack.Start () (at Assets/Standard Assets/Scripts/PlayerAttack.cs:19)
And I don't know why. I don't have much experience in programming, so it might be a very noobish question :P
Basically I am trying to get a List from another script (PlayerKnowledge), then copy the content into a new List<>Knowledge here in the PlayerAttack script, so I can later on iterate through the content, and if something is equal to a specific string, then a specific attack should happen.
Here is the code:
public class PlayerAttack : MonoBehaviour {
private PlayerKnowledge playerKnowledge;
private List<string> knowledge = new List<string>();
// Use this for initialization
void Start () {
//This is the line where the error occurs
var know = playerKnowledge.knownNames;
//And if someone knows how to print out content of a List,
// I would be grateful to know :P
Debug.Log("know returns" + know);
if(know != null){
knowledge.AddRange(know);
Debug.Log("knowledge !null returns: " + knowledge);
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlayerKnowledge : MonoBehaviour {
public List<string> knownNames;
public GameObject item;
private GameObject book;
// Use this for initialization
void Start () {
var knownNames = new List<string>();
knownNames.Add("Test");
Debug.Log("PlayerKnowledge Start: " + knownNames);
}
// Update is called once per frame
void Update () {
if(Input.GetKey(KeyCode.R)) {
readBook();
}
}
//reads the targeted book
private void readBook() {
BookFolklore bf = (BookFolklore)item.GetComponent("BookFolklore");
string name = bf.bookName;
knownNames.Add (name);
}
}
Anyone who can help me with this? Let me know if you need more information.
Answer by Landern · Oct 30, 2012 at 07:40 PM
First, use awake to instantiate the list. Second, you made knownNames a local in Start, i would have figured it would have complained(unity console), but i guess it didn't.
public class PlayerKnowledge : MonoBehaviour {
public List<string> knownNames;
public GameObject item;
private GameObject book;
void Awake() {
knownNames = new List<string>();
}
// Use this for initialization
void Start () {
knownNames.Add("Test");
Debug.Log("PlayerKnowledge Start: " + knownNames);
}
// Update is called once per frame
void Update () {
if(Input.GetKey(KeyCode.R)) {
readBook();
}
}
//reads the targeted book
private void readBook() {
BookFolklore bf = (BookFolklore)item.GetComponent("BookFolklore");
string name = bf.bookName;
knownNames.Add (name);
}
}
Answer by DaveA · Oct 28, 2012 at 04:05 AM
You are using playerKnowledge before setting it to anything. Either drag something onto it in the Insector (an object with one of those on it) or use GameObject.Find and/or GetComponent to get an instance of it.
But Player$$anonymous$$nowledge is just a script attached to the Player where I start up a en empty List that should eventually be filled up with strings each time the player reads a book. What should I then try setting player$$anonymous$$nowledge to? =/
In this script you can either use the Inspector to drag the object onto itself, or in code:
void Start() { player$$anonymous$$nowledge = GetComponent<Player$$anonymous$$nowledge>();
Your answer
Follow this Question
Related Questions
Why do I keep getting NullReferenceException in Unity while iterating over a List (in OnDrawGizmos)? 2 Answers
A node in a childnode? 1 Answer
My Project doesn't work - Generic.List throws NullReferenceException ?! 0 Answers
How to null-reference check a Collider2D that's been destroyed 1 Answer
C# NullReferenceException 1 Answer