propiedades metodos esperaba espaƱol descriptores declarar como clases atributos acceso c# unity3d unityscript

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).