metodos - propiedades get c#
Acceder a variables/funciones desde otro script (3)
Cómo acceder a variables / funciones desde otra clase.
La variable o función a la que desea acceder o llamar debe ser
public
no
private
.
public class ScriptA : MonoBehaviour{
public int playerScore = 0;
void Start()
{
}
public void doSomething()
{
}
}
Acceda a la variable
playerScore
en
ScriptA
desde
ScriptB
.
Primero, encuentre el GameObject al que está asociado el script o componente con la función
GameObject.Find
, luego use la función
GetComponent
para recuperar ese script o componente que está adjunto.
public class ScriptB : MonoBehaviour{
ScriptA scriptInstance = null;
void Start()
{
GameObject tempObj = GameObject.Find("NameOfGameObjectScriptAIsAttachedTo");
scriptInstance = tempObj.GetComponent<ScriptA>();
//Access playerScore variable from ScriptA
scriptInstance.playerScore = 5;
//Call doSomething() function from ScriptA
scriptInstance.doSomething();
}
}
Así que estoy tratando de cambiar una variable en otro script tocando un cubo. Configuración actual
- 1x jugador
- 1x enemigo
Cada uno con su propio script
Enemy_Stats
&
Character_Stats
Como puede ver en este pequeño fragmento, es una solución alternativa para acceder a la variable desde otro script.
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Enemy")
{
collision.gameObject.GetComponent<Enemy_Stats>().Health =
collision.gameObject.GetComponent<Enemy_Stats>().Health
- gameObject.GetComponent<Character_Stats>().AttackDamage;
if (collision.gameObject.GetComponent<Enemy_Stats>().Health <= 0)
{
Destroy(collision.gameObject);
}
}
}
Soy nuevo en Unity, pero no hay una manera de referirlo con algo como:
collision.Health
¿
collision.Health
?
Lo primero para hacer esto más corto (y eventualmente más rápido) sería almacenar esto:
gameObject.GetComponent<Character_Stats>()
en
Start()
en una variable privada (debe evitar llamar a GetComponent con frecuencia si puede evitarlo) .
Para la variable Salud, una forma de evitar
GetComponent
llamadas
GetComponent
podría ser el almacenamiento en caché: crea un
Dictionary<GameObject, Enemy_Stats>
y lee de él tan pronto como este objeto del juego colisionó una vez
No, ya que la
Health
no es parte del objeto de colisión, sino
Enemy_Stats
.
Puede almacenar en caché un
Component
(eso es Enemy_Stats) si lo usa varias veces para ahorrar algo de escritura (y algo de rendimiento, pero eso es bastante marginal para este ejemplo).
También puede almacenar en caché componentes "conocidos" como en este caso
Player_Stats
.
Puede hacer esto, por ejemplo, en
Start
o con una variable pública y el inspector.
Sin embargo, lo que probablemente deberías hacer es hacer que el enemigo sea responsable de su vida y no del jugador, así que mueve la parte de
Destroy
a
Enemy_Stats
(para ser exactos en la propiedad de Salud).