Jump to content
UnitySpain
unOOld

Error : Object reference not set to an instance of an object

Recommended Posts

Hola a todos!!, he estado trabajando en un guardado automatico para un juego de estilo novela visual, he podido guardar las escenas automaticamente y ahora estoy intentando guardar el dialogo exacto en donde quedo el jugador antes de salir del juego, para eso tuve que comunicar variables entre script para decirle al playerprefs que cada ves que hiciera click el jugador para cambiar de dialogo guardara el dialogo y el dialogo esta en otra script, sin embargo cuando reproduzco el juego me sale el error :

 Object reference not set to an instance of an object  

nose como solucionarlo

PD: el que dice dialogue es el string que saque del otro script dialoguemanager y el que contiene el dialogo del juego que quiero guardar

 

MUCHAS GRACIAS POR LEER. 

public class savegame : MonoBehaviour
{
    public DialogueManager manager;
    static public int level;

    // Use this for initialization
    public void OnGUI()
    {
        DialogueManager manager;
        string dialogo;
         manager = GameObject.Find("DialogueManager").GetComponent<DialogueManager>();
        dialogo = manager.dialogue;

        if (Input.GetMouseButtonDown(0))
        {
            PlayerPrefs.GetString("llave", dialogo);
        }

 

Edited by unOOld

Share this post


Link to post
Share on other sites

Ese error se da cuando intentas acceder a algo que no existe, por ejemplo:

usas GameObject.Find("X"); para intentar encontrar un objeto llamado X, si no hay ningun objeto con el nombre X te saldra ese error.

Ahora deberias de intentar buscar que variable es nula

 

PD: para mejorar la optimizacion mueve la linea de manager = GameObject.Find().........; al start ( void Start () ) o al awake ( void Awake () ) y la linea de dialogo = manager.dialogue; muevela dentro del if(Input.GetMouseButtonDown(0))

Share this post


Link to post
Share on other sites
hace 4 minutos, Jose134 said:

Ese error se da cuando intentas acceder a algo que no existe, por ejemplo:

usas GameObject.Find("X"); para intentar encontrar un objeto llamado X, si no hay ningun objeto con el nombre X te saldra ese error.

Ahora deberias de intentar buscar que variable es nula

 

PD: para mejorar la optimizacion mueve la linea de manager = GameObject.Find().........; al start ( void Start () ) o al awake ( void Awake () ) y la linea de dialogo = manager.dialogue; muevela dentro del if(Input.GetMouseButtonDown(0))

gracias por responder, el error me lo da con la linea  manager = GameObject.Find("DialogueManager").GetComponent<DialogueManager>();  y si quito esa me da error con la siguiente lo cual no entiendo ya que en visual studio no detecta ningun error y el script dialoguemanager si existe 

Share this post


Link to post
Share on other sites

vale, me acabo de dar cuenta de que tienes otro fallo que tal vez este causando ese error. Tienes dos manager en el script, uno al principio y otro dentro de la funcion OnGUI

public class savegame : MonoBehaviour
{
    public DialogueManager manager; //1
    static public int level;

    // Use this for initialization
    public void OnGUI()
    {
        DialogueManager manager; //2
        string dialogo;
         manager = GameObject.Find("DialogueManager").GetComponent<DialogueManager>();
        dialogo = manager.dialogue;

        if (Input.GetMouseButtonDown(0))
        {
            PlayerPrefs.GetString("llave", dialogo);
        }
    }
}

borra el de la funcion OnGUI, tambien puedes hacer la otra privada ya que la declaras mediante el script asi tienes la ventana de Inspector algo mas limpia.

Tambien me he fijado que tienes puesto PlayerPrefs.GetString(); eso es para cargar una string, ya que lo que quieres hacer es guardar cambialo por PlayerPrefs.SetString();

 

Codigo corregido:

using UnityEngine;
using System.Collections;

public class savegame : MonoBehaviour {
	
	private DialogueManager manager;
	static int level;

	void Awake () {
		manager = GameObject.Find("DialogueManager").GetComponent<DialogueManager>();
	}
          
    void OnGUI () {
    	if (Input.GetMouseButtonDown("0")) {
        	string dialogue = manager.dialogue;
          	PlayerPrefs.SetString("llave", dialogue);
       	}
    }
}

 

Edited by Jose134

Share this post


Link to post
Share on other sites

no se si resolviste el problema, y supongo que por la fecha, ya ni debe importar, pero comento por las dudas de que otro tenga el mismo error...

 

manager = GameObject.Find("DialogueManager").GetComponent<DialogueManager>();

cuando llamas un GameObject.Find("algo") el GameObject debe estar en la escena y activo [.setActive(true)]. si no, nunca te va a encontrar el objeto... conviene arrastrar el objeto a la variable publica y quitar el .Find("algo")... al ser publica no es necesario que tengas que hacer un .Find, salvo que a "manager" le asignes distintos objetos en distintas situaciones...

Share this post


Link to post
Share on other sites

×
×
  • Create New...