Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Problemas con Countdown Timer

Iniciado por Anibal91, Marzo 21, 2018, 07:03:22 PM

Tema anterior - Siguiente tema
Hola buenas a todos,
 
Soy mas o menos nuevo en Unity y estoy realizando un proyecto VR para Oculus en el que estoy implementando un Countdown Timer en un Canvas que va en el arma del personaje. El problema que tengo es que no logro acceder a mi variable private float tiempo = 60f; desde otro Script que esta en un EmptyGameObject que contendra la logica(Game Over Manager). Puedo resolver esto? 
 
Hasta ahora intente cambiar la variable a public pero esto me da un error (UnassignedReferenceException: The variable contador of GameOverManager has not been assigned).

Buenas ¿acabas de empezar así del tirón con esto o te has visto los tutoriales de Unity? Es altamente recomendable que te veas los tutoriales de Unity para empezar a entender de como funcionan los scripts y familiarizarte.

puf.... se ve que estas muy verde.....
 
el error significa: excepcion de referencia no asignada: la variable "contador" de "gameOverManager" no esta (no ha sido) asignada.
 
si es una variable publica estilo:
 

public GameObject contador;

 
deverias asignarla en el editor (pinchar, arratrar el objeto a la casilla y soltar)
 
si es private, deberias buscarlo/asignarlo en la funcion start...
 

private GameObject contador;
void Start() {
   contador = GameObject.Find("contador");
}
//suponiendo que el objeto se llame asi...

 
 
 
....mas cosas...
 
para acceder a una variable de otro script tienes que tener acceso al gameObject que contiene ese script...
 

objetoConOtroScrit.GetComponente<miOtroScript>().miVariable = 5;

 
 
 
si es una variable "private" no puedes acceder directamente, y ese otro script deveria tener una funcion "get"
 

//si quieres que la funcion sea accesible desde "fuera" tiene que ser public
//suponiendo que la variable es un "float" y se llama "miVariable"
public float getMiVariable() {  
   return miVariable;
}

 
 
 
perocreo que te estas complicando mucho para hacer un contador....
 
puedes acceder mejor al componente "Text" de tu texto contador del canvas desde tu emptyGameObject "gameOverManager" y cambiarle la variable "text"...
 

iclude Unity.UI;
public class gameOverManager : monoBeha... {
      
   public Text textoContado;  
   private int vidas = 3;
}
y luego accedes a el con...
textoContador.text = "vidas restantes: " + vidas;

 
espero haberte sido de ayuda...

Marzo 21, 2018, 08:26:50 PM #3 Ultima modificación: Marzo 21, 2018, 08:28:57 PM por Anibal91
si aun hay cosas que no entiendo mucho en programacion pero bueno por algo se parte, mira estos son mis script y la herencia de los objetos.
 
*el Objeto "Controlador" en la herencia al final es el que tiene el Script CountdownTimer. 
 

 

 

vale, me faltaria ver la "pestaña" "inspector" del objeto gameOverManager..... porque creo que lo que falta es asignar "contador" en el objeto "gameOverManager"...
 
arrastrar el gameObject contador dentro del "campo" (casilla) (variable) contadorTiempo (en el "inspector" teniendo selecionado el objeto gameOverManager) 
 
pero creo que seria mas sencillo hacerlo todo desde el objeto gameOverManager.... poniendole el public Text contador y el public float tiempo en el... y haciendo la cuenta tambien en el.... 
 
pero creo que es porque comence con "basic" que no habia objetos... y tenias que hacer todo el codigo en uno... miles y miles de lines de codigo de tiron.... y me parece que hacer objetos (scripts) tan "pequeños" (como un contador de tiempo) es ya pasarse.... tiendo a agrupar scripts... suelo hacer un script "gameSystem" que se encarga de todo... de contar tiempos, vidas, puntos, abrir menus, poner y quita el "pause", salir al menu principar, volver a cargar escena, determinar si te has pasado la escena, contar los items que recojes, o incluso "spawnear" enemigos, o cosas que se considerarian mas de gameplay... como ver si el player se ha "caido" del escenario... esa clase de cosas... (abalorios, bagatelas)
 
intento hacer que la escena funcione con pocos scripts...
 
pero eso ya es el estilo de cada uno...

Marzo 21, 2018, 10:39:30 PM #5 Ultima modificación: Marzo 21, 2018, 11:24:46 PM por lightbug
De seguro pienses que con solo tener la clase ya está, pero la clase no es más que una "plantilla de creación" si se quiere, yo soy una instancia de humano, no significa que yo represente a los humanos, se entiende? soy un producto, aca es parecido, hasta no tener la instancia no vas a poder obtener tu variable que es única de dicha instancia.(Salvo que sea una variable static)
 
 
 
Cita de: Anibal91 date=1521655402UnassignedReferenceException: The variable contador of GameOverManager has not been assigned
   


Te falta la referencia, lo dice el error. Tenés dos grandes tipos de datos en C#, los valores y las referencias,
 
mira este vid:
 


   
eature=oembed" width="480">

 
 
 
un int es un valor, un GameObject es una referencia por ej. Lo demás lo estás haciendo bien, aunque nunca usaría un public así como está, hay peligros que ahora no los ves pero que están ahí, por ej, si un programador de tu equipo desde un script llama a la referencia y te modifica el timer todo termina en desastre, podés recurrir a algunos trucos de proteccion, por ej usar un getter y que hacer a la variable de solo lectura (para extraños) pero que la propia clase pueda modificarla (se llama también "get / private set")
 
 
 

//Una variable pública
// Cualquier puede referencia a la instancia y modificar el tiempo!
// un programador inepto del equipo o vos por error, o whatever...
// También podés modificarla en el editor, incluso en runtime ... malo!
public float m_tuVariable;
// Una variable pública que no se ve en editor
// Idem, no podés modificarla en editor
[HideInInspector] public float m_tuVariable;
// Un método público
private float m_tuVariable;
public float getVariable(){ return m_tuVariable; }
// Un getter (más bonito creo yo)
// solo de lectura
private float m_tuVariable;
public float tuVariable { get{ return m_tuVariable; } }

 
Entonces, tenés tu ref a la instancia de la clase de interés que tiene a la variable privada con el getter (la arrastraste, usaste FInd, etc) , usas el getter ("tuVariable") y ya tenés el valor que buscás. (algo así como lo tenés planteado en "GameOverManager")
 
 

Cita de: Igor date=1521661910vale, me faltaria ver la "pestaña" "inspector" del objeto gameOverManager..... porque creo que lo que falta es asignar "contador" en el objeto "gameOverManager"...
   


Adjunte las imágenes del inspector, en el objeto GameOverManager me repite el contador y creo q no necesito q se repita ya que esta en el objeto Controlador.
 
Creo que me falta por aprender mucho de crear estructuras para el proyecto y no solo crear script a la suerte :(
 


no, no creo que sea necesario repetir la variable "contador (Text)" en ambos objetos...
 
no entiendo muy bien la gerarquia... pero la variable contadorTime (que se supone que es Type CountdownTimer tiene asignado "OVRPlayerControler".... supongo que ese es el objeto que contiene el script CountdownTimer... creo que deveria funcionar...
 
pero creo que es mas facil hacer la cuenta en el script gameOverManager... 
 
cojes el "contador (Text)" tambien ahi, en el gameOverManager, (que parece que ya lo tienes, repe)
 
y entonves no te haria falta es script CountdownTimer...
 
aunque esta bien que lo intentes primero asi... para aprender a acceder a otros objetos, y usar funciones de otros scrupts y tal...
 
 

Etiquetas: