Version: 2017.4
Variables y el Inspector
Event Functions (Funciones de Evento)

Controlar GameObjects utilizando componentes

En el Editor de Unity, usted realiza cambios en las propiedades del componente usando el Inspector. Por lo tanto, los cambios en los valores de posición del componente Transform darán como resultado un cambio en la posición del GameObject. Del mismo modo, puede cambiar el color del material de un Renderer o la masa de un Rigidbody con un efecto correspondiente sobre la apariencia o comportamiento del GameObject. En la mayor parte, los scripts también tratan de modificar las propiedades de los componentes para manipular GameObjects. La diferencia, sin embargo, es que un script puede variar el valor de una propiedad gradualmente a lo largo del tiempo o en respuesta al input del usuario. Al cambiar, crear y destruir objetos en el momento correcto, se puede implementar cualquier tipo de juego.

Accediendo los componentes

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.

Acceder a otros objetos

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.

Referenciar GameObjects con variables

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.

Encontrar GameObjects hijo

A veces, una escena de juego utiliza una cantidad de GameObjects del mismo tipo, como enemigos, puntos de referencia y obstáculos. Es posible que sea necesario rastrearlos mediante un script que los supervise o reaccione ante ellos (por ejemplo, es posible que todos los puntos de referencia estén disponibles para un script de pathfinding). El uso de variables para referenciar estos GameObjects es una posibilidad, pero hace que el proceso de diseño sea tedioso si cada nuevo punto de referenciatiene que arrastrarse a una variable en un script. Del mismo modo, si se borra un punto de referencia, entonces es una molestia tener que eliminar la referencia de la variable al GameObject que falta. En casos como este, a menudo es mejor administrar un conjunto de GameObjects haciéndolos todos hijos de un GameObject principal. Los GameObjectshijo se pueden recuperar utilizando el componente Transform del padre (porque todos los GameObjects implícitamente 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.

Encontrando GameObjects por Nombre o Tag (etiqueta)

Siempre es posible localizar GameObjects en cualquier lugar de la jerarquía de escena, siempre que tenga información para identificarlos. Los objetos individuales se pueden recuperar por nombre usando 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"); 
}

Variables y el Inspector
Event Functions (Funciones de Evento)