Jump to content
Null

[Duda] Maneras de acceder a variable desde otro script

Recommended Posts

Hola :12_slight_smile:

Resulta que tengo un script que controla mi player,
y otro que controla el FOV de la cámara.

Y tengo una variable en el script del player,
a la cual accedo en el script de la cámara de esta manera:

// ScriptDelPlayer
public static bool puedeCorrer = true;

// ...

==========================================================

// ScriptDeLaCamara
if (ScriptDelPlayer.puedeCorrer)
{
  // ...
}

// ...

Y funcionaba, el IF cumplía su función y el FOV también.

Pero el tema del FOV no es lo importante.
A lo que me refiero, es que accedí a la variable "puedeCorrer" de esa manera en concreto.

 

Pero luego, quise probar a acceder a ella de esta otra manera:

// ScriptDelPlayer
[SerializeField]
private bool _puedeCorrer = true;

public bool PuedeCorrer
{
  get { return _puedeCorrer; }
  set { _puedeCorrer = value; }
}

==========================================================

// ScriptDeLaCamara
private GameObject _jugador;

void Awake()
{
  _jugador = Resources.Load("PlayerPrefab") as GameObject;  // <--- Obviamante metí el prefab del player en una carpeta llamada 'Resources' para que esto funcione.
}
void Update()
{
  FOV();
}

void FOV()
{
  if (_jugador.GetComponent<ScriptDelPlayer>().PuedeCorrer)
  {
    // ...
  }
}

Y ya no funcionaba más el FOV, como si la condición IF
no se evaluara correctamente, y en la consola de Unity no sale ningún error, ni nada.
Y realmente no sé si es que lo hago mal, o es que no es así... lo cual es 100% seguro xd

 

También probé con esto otro:

// ScriptDelJugador
[SerializeField]
private bool _puedeCorrer = true;

public bool PuedeCorrer
{
  get { return _puedeCorrer; }
  set { _puedeCorrer = value; }
}

// ...

==========================================================

// ScriptDeLaCamara
private ScriptDelJugador _scriptJugador;

void Awake()
{
  _scriptJugador = GetComponent<ScriptDelJugador>();
}
void Update()
{
  FOV();
}

void FOV()
{
  if (_scriptJugador.PuedeCorrer)
  {
    // ...
  }
}

Y tampoco funcionaba, el FOV no aumentaba ni disminuía, ni nada.
Realmente la única manera con la que me funcionó fue con la primera, que es la más """"normal"""".

 

 

LA DUDA ENTONCES ES:

Existen otras maneras de acceder
a una variable desde otro script que no sean estas?
Simplemente curiosidad :d


PD.: Soy medio novato, quiéranme.

Share this post


Link to post
Share on other sites

Buenas, si existen otras maneras, mas que eso la manera que utilizas no es ni mucho menos la mas recomendable. Utilizas una variable estática, por lo cual no necesitas la instancia del objeto para acceder a ella accedes directamente a traves de la clase, esto te funciona bien por que solo tienes un GameObject con esa clase, pero que vas hacer cuando tengas por ejemplo una clase enemigo que se repetirá muchas veces, en el caso de la clase enemigo compartirán la misma variable todos los enemigos y lo mas seguro que eso no te interese.

Lo que tienes que hacer es acceder a la instancia del objeto player, eso se puede hacer de varias formas yo normalmente lo hago por medio del nombre dentro de la jerarquía o por medio del Tag, imaginemos que en la jerarquía el GameObject que contiene este script se llama "Player" entonces el código te quedaría así:

 

// ScriptDelPlayer
[SerializeField]
private bool _puedeCorrer = true;

public bool PuedeCorrer
{
  get { return _puedeCorrer; }
  set { _puedeCorrer = value; }
}

==========================================================

// ScriptDeLaCamara
private ScriptDelPlayer _jugador;

void Awake()
{
  _jugador = GameObject.Find("Player").GetComponent<ScriptDelPlayer>();  // pedimos primero la instancia al GameObject del jugador y despues pedimos el script 
}
void Update()
{
  FOV();
}

void FOV()
{
  //if (_jugador.GetComponent<ScriptDelPlayer>().PuedeCorrer) // Intenta no hacer GetComponents en zonas que se esten llamando continuamente.
  if (_jugador.PuedeCorrer)
  {
    // ...
  }
}

 

Esto lo explique en otro post hace no mucho, te insto a que lo leas por que estabas mas extendido que lo que te cuento aqui:

 

Share this post


Link to post
Share on other sites
hace 5 horas, Null said:

 


_jugador = Resources.Load("PlayerPrefab") as GameObject;  // <--- Obviamante metí el prefab del player en una carpeta llamada 'Resources' para que esto funcione.

 


// ScriptDeLaCamara
private ScriptDelJugador _scriptJugador;

void Awake()
{
  _scriptJugador = GetComponent<ScriptDelJugador>();
}

En el primer script, donde utilizas Resources.Load, no funciona porque Resources.Load no te devuelve una referencia a una instancia de GameObject, te devuelve una referencia a un asset. El asset no es una instancia, es decir, no existe, es solo un nombre. Tu puedes acceder a los elementos del asset igual que a los elementos de una instancia. Diferencia entre asset e instancia:

1) El asset se encuentra en la carpeta de recursos del juego. La instancia se encuentra en la escena(ventana de jerarquía).

2) La instancia se crea mediante Instantiate: https://docs.unity3d.com/ScriptReference/Object.Instantiate.html y se agrega al escenario. El asset es un nombre, no existe en la escena.

3) Si modificas algún elemento del asset modificas todas las instancias de dicho asset en la escena. Si modificas una instancia solo modificas dicho elemento, el resto de instancias no se ven afectadas.

Diferenciar entre asset e instancia genera confusión al principio de utilizar Unity.

_____________________________

Y en el segundo script, buscas el componente ScriptDelJugador en el GameObject de la cámara, cuando se supone que debe estar en el GameObject del jugador.

 

Share this post


Link to post
Share on other sites

esr:

Muchas gracias por tu respuesta.
Me pasé por el otro post y verdad es que me sirvió
bastante ver esa forma de hacerlo.


Ya que tengo entendido que usar variables static no es muy bueno,
como tú mismo pusiste el ejemplo de los enemigos.

___________

kaito:

Información muy valiosa.
Lo tendré en cuenta.
Muchas gracias a ti también! ^ -^

 

hace 11 horas, kaito said:

Y en el segundo script, buscas el componente ScriptDelJugador en el GameObject de la cámara, cuando se supone que debe estar en el GameObject del jugador.

No había prestado atención a eso, qué fail.

 

Pero bueno, de nuevo, muchas gracias a ambos!

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...