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);
}
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))
Cita de: Jose134 date=1464197077Ese 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
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);
}
}
}
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...