Instanciar

Contactar con el profesor

Instanciar un GameObject y añadirle propiedades dinámicamente

El siguiente ejemplo instancia una imagen en pantalla ubicada dentro de la carpeta Resources.

public class SpriteGenerator : MonoBehaviour{
    public SpriteGenerator(int n){
        this.n = n;
        GameObject objetoContenedor = new GameObject("Nuevo objeto");
        SpriteRenderer spr = objetoContenedor.AddComponent();
        spr.sprite = Resources.Load("pieces/gafas");

    }
}

Instanciar un prefab

¿Qué es un prefab?

Un prefab es un GameObject que puede agrupar a su vez varios GameObjects, Scripts, assets, etc y que está empaquetado y prepararado para ser reusado.

Técnicamente, un prefab debe ser un único objeto, por lo que si quisieramos que el prefab constase de varios objetos, deberíamos agruparlos en un empty.

Para crear el prefab, lo arrastraremos del panel de jerarquía, donde lo hemos estado elaborando, hasta el panel de proyecto.

Si tengo varias instancias de un prefab y modifico una de ellas, pulsando el botón apply en el panel inspector, estas modificaciones se aplicarán al resto de prefabs. Si no pulso aplicar, la modificación será únicamente para ese prefab.

Crearemos un prefab arrastrando el objeto deseado desde el panel de jerarquía hasta el panel de proyecto.

Dos formas de instanciar un prefab

  • Crear una propiedad pública de tipo GameObject en un script vinculado a un objeto y arrastrar el prefab desde el panel de proyecto al panel de jerarquí en el que se encuentra dicha propiedad. GameObject nuevoMisil = Instantiate(prefabMisil, new Vector2(2,2), Quaternion.identity);
  • Almacenar el prefab en la carpeta Resources y utilizar su nombre para instanciarlo:
GameObject word1 = Instantiate(Resources.Load("RandomWord"), new Vector2(0.1f, 0.1f), Quaternion.identity) as GameObject;

Coordenadas en jerarquías

Cuando tenemos una jerarquía (al hacer un prefab, por ejemplo) en la que hay un padre no visual (un empty, por ejemplo) y uno o varios hijos que si se ven (un cubo, por ejemplo), intentamos siempre ubicar al padre el centro de los hijos.

  • Si sólo hay un hijo, este estará en sus coordenadas 0,0,0.
  • Si hay varios hijos, deberían orbitar alrededor del punto 0,0,0 del padre.
Alinear objetos
Alinear objetos
Alinear objetos

Instanciar un misil en una posición horizontal aleatoria

int pos = Random.Range(-4, 4);
GameObject nuevoMisil = Instantiate(prefabMisil, new Vector2(pos,4), Quaternion.identity);

Detectar colisiones

El jugador perderá cuando un misil desaparezca por la parte inferior de la pantalla.

Para detectar esto:

  1. Ponemos un cubo en la parte inferior de la pantalla y lo estiramos para que ocupe toda su longitud.
  2. Asignamos Box Collider 2D al cubo, en lugar del Box Collider que tenía. Para detectar la colisión entre dos entidades, estas deben tener el mismo tipo de Box Collider.
  3. En el componente Box Collider 2D del GameObject AreaInferior, activamos la check isTrigger.
  4. Vinculamos el siguiente Script al cubo inferior
Instanciar 1
public class AreaInferior : MonoBehaviour{
	void OnTriggerEnter2D(Collider2D col){
		Debug.Log("colision");
	}
}

Diferencia entre marcar o no marcar la check isTrigger de un BoxCollider.

  • Cuando la check está marcada, los objetos que colisionan se superponen durante la colisión, pasando uno por encima de otro. El código que usamos para gestionar estas colisiones es similar a este:
void OnTriggerEnter2D(Collider2D col){
}
  • Cuando la check no está marcada, los objetos que colisionan impactan entre sí.
void OnCollisionEnter2D(Collision2D col){
}

Perder vidas

Cada vez que se produzca la colisión anterior, el usuario perderá una vida.

public class AreaInferior : MonoBehaviour
{
    private int marcador = 3;
    public Sprite corazonNegro;
    void OnCollisionEnter2D(Collision2D col)
    {
        marcador--;

        if(marcador == 2)
        {
            GameObject.Find("vida3").GetComponent<SpriteRenderer>().sprite = corazonNegro;
corazon negro

Perder el juego

Si el marcador de vidas llegase a cero, el jugador habrá perdido la partida y lanzaremos la escena correspondiente.

Te recuerdo el código para cambiar de escena que ya vimos en el juego de Elige tu propia aventura.

using UnityEngine.SceneManagement;
SceneManager.LoadScene ("Muerte");
← Poner una imagen de fondo
Galería de tiro con Unity3D →

Aviso Legal | Política de privacidad