En el editor de Unity, usted hace cambios a las propiedades del Componente utilizando el Inspector. Entonces, por ejemplo, los cambios a los valores de posición del Componente Transform resultarán en un cambio en la posición del GameObject. Similarmente, usted puede cambiar el color del material del Renderer o la masa del Rigidbody con un efecto correspondiente en la apariencia o comportamiento del GameObject. Para la mayoría de veces, scripting también modifica las propiedades del Componente para manipular GameObjects. La diferencia, en cambio, es que un script puede variar un valor de una propiedad gradualmente en el tiempo o en respuesta al input del usuario. Al cambiar, crear y destruir objetos en el momento indicado, cualquier tipo de gameplay puede ser aplicado.
El caso más simple y común es dónde un script necesita acceder otros Componentes adjuntados al mismo GameObject. Como es mencionado en la sección de Introducción, un Componente es una instancia de una clase por lo que el primer paso es coger una referencia a la instancia del Componente con el cual usted quiere trabajar. Esto se hace con la función GetComponent. Típicamente, usted quiere asignarle al objeto Componente a una variable la cual está hecha en C# utilizando la siguiente sintaxis:
void Start () {
Rigidbody rb = GetComponent<Rigidbody>();
}
En UnityScript, la sintaxis es un poco diferente:
function Start () {
var rb = GetComponent.<Rigidbody>();
}
Una vez usted tenga una referencia a la instancia del Componente, usted puede configurar los valores de sus propiedades como usted quiera en el Inspector:
void Start () {
Rigidbody rb = GetComponent<Rigidbody>();
// Cambie la mase del Rigidbody del objeto.
rb.mass = 10f;
}
Una característica extra que no está disponible en el Inspector es la posibilidad de llamar funciones o instancias de Componente:
void Start () {
Rigidbody rb = GetComponent<Rigidbody>();
// Agregue una fuerza al Rigidbody.
rb.AddForce(Vector3.up * 10f);
}
Tenga en cuenta que no hay razón para que usted no pueda tener más de un script personalizado adjunto al mismo objeto. Si usted necesita acceder un script desde otro, usted puede utilizar GetComponente y simplemente utilizar el nombre de la clase script (o nombre del archivo) para especificar el tipo de Componente que usted quiere.
Si usted intenta recuperar un Componente que no ha sido agregado al GameObjecto entonces GetComponent va a devolveré null; usted va a obtener una referencia nula de error en el tiempo de ejecución si usted intentar cambiar cualquier valor en el objeto nulo.
Aunque a veces operan en aislamiento, es común para script de mantener registro de otros objetos. Por ejemplo, un enemigo que está persiguiendo podría necesitar saber la posición del jugador. Unity proporciona un número de diferente formas de recuperar otros objetos, cada una apropiada a ciertas situaciones.
La manera más directa de encontrar un GameObject relacionado es agregar una variable public GameObject a un script:
public class Enemy : MonoBehaviour {
public GameObject player;
// Otras variables y funciones...
}
Esta variable estará visible en el Inspector como cualquier otra:
Usted puede ahora arrastrar un objeto desde la escena o panel de Jerarquía a esta variable para asignarlo. La función GetComponent y las variables de acceso a Componentes están disponibles para este objeto como cualquier otro, entonces usted puede utilizar código como el siguiente:
public class Enemy : MonoBehaviour {
public GameObject player;
void Start() {
// Comience el enemigo a diez unidades detrás del personaje jugador.
transform.position = player.transform.position - Vector3.forward * 10f;
}
}
Adicionalmente, si una variable public es declarada de un tipo de Componente en su script, usted puede arrastrar cualquier GameObject que tiene un Componente adjunto. Esto va a acceder el componente directamente en vez del GameObject en sí mismo.
public Transform playerTransform;
Enlazar objetos juntos con variables es de gran ayuda cuando usted está tratando con objetos individuales que tienen conexiones permanentes. Usted puede utilizar una variable array para enlazar varios objetos del mismo tipo, pero la conexión debe todavía estar hecha en el editor de Unity en vez que sea en el tiempo de ejecución. A veces es más conveniente ubicar objetos en el tiempo de ejecución y Unity proporciona dos maneras básicas para hacer esto, como es descrito abajo.
A veces, una escena de juego hará uso de un número de objetos del mismo tipo, como lo son los enemigos, puntos de interés, y obstáculos. Estos pueden necesitar ser rastreados por un script en particular que supervise o reaccione a estos (eg, todos los puntos de interés pueden necesitar estar disponible para un script pathfinding). Utilizar variables para vincular estos objetos es una posibilidad pero eso hará que el proceso de diseño sea tedioso si cada nuevo punto de interés tiene que ser arrastrado a una variable en una script. Del mismo modo, si un punto de interés es eliminado entonces es una molestia tener que quitar la variable que referencia al objeto que falta. En casos como estos, a veces es mejor manejar el conjunto de objetos al hacerlos todos hijos de un objeto padre. Los objetos hijos pueden recuperarse utilizando el Componente del Transform del padre ( ya que todos los GameObjects implicitamente tienen un Transform):
using UnityEngine;
public class WaypointManager : MonoBehaviour {
public Transform[] waypoints;
void Start() {
waypoints = new Transform[transform.childCount];
int i = 0;
foreach (Transform t in transform) {
waypoints[i++] = t;
}
}
}
Usted también puede ubicar un objeto hijo especifico por el nombre utilizando la función Transform.Find :
transform.Find("Gun");
Esto puede ayudar cuando un objeto tiene un hijo que puede ser agregado y quitado durante el tiempo de juego. Un arma que puede ser recogida y dejada en el suelo es un buen ejemplo de esto.
Siempre es posible ubicar GameObjects dónde sea en la Jerarquía de la escena mientras usted tenga alguna información para identificarlos. Objetos individuales pueden ser recuperados por nombre utilizando la función GameObject.Find.
GameObject player;
void Start() {
player = GameObject.Find("MainHeroCharacter");
}
Un objeto o una colección de objetos también pueden ser ubicadas por su tag (etiqueta) utilizando las funciones GameObject.FindWithTag y GameObject.FindGameObjectsWithTag .
GameObject player;
GameObject[] enemies;
void Start() {
player = GameObject.FindWithTag("Player"); enemies = GameObject.FindGameObjectsWithTag("Enemy");
}