Menu
CoddyTech

Mostrar y ocultar

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 48 de 85.

SetActive(false) desactiva un GameObject completo: no se dibuja, deja de colisionar, los scripts que contiene dejan de recibir llamadas a Update() y sus objetos secundarios también se desactivan. SetActive(true) lo reactiva todo, y activeSelf indica si está activo. Este script, colocado en un botón, oculta la puerta indicada en su campo door al hacer clic con el ratón:

public GameObject door;

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        door.SetActive(false);
    }
}

Un script que oculta su propio objeto con gameObject.SetActive(false) no puede volver a activarlo, porque Update() deja de ejecutarse. Por eso, el interruptor está en otro objeto, que tiene una referencia al objeto que muestra y oculta.

enabled desactiva un componente y deja intacto el resto del objeto. GetComponent<Renderer>().enabled = false vuelve invisible un objeto, pero su collider sigue bloqueando cosas: es una pared invisible. Un script con enabled = false deja de recibir llamadas a Update(), pero el objeto permanece en la escena, sigue dibujándose y colisionando, y sus otros componentes siguen funcionando.

challenge icon

Desafío

Intermedio

Haz que la barra espaciadora oculte el puente y lo vuelva a mostrar.

  1. En Update(), cuando se pulse Input.GetKeyDown(KeyCode.Space), llama a bridge.SetActive(...) para activar o desactivar todo el puente, incluido el colisionador.
  2. Pasa el estado opuesto: bridge.SetActive(!bridge.activeSelf);.

Pulsa «Jugar» y pulsa la barra espaciadora unas cuantas veces: el puente desaparece y vuelve a aparecer. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class BridgeSwitch : MonoBehaviour
{
    public GameObject bridge;

    void Update()
    {
        // Space oculta el puente y, al pulsarla de nuevo, vuelve a mostrarlo
    }
}

Todas las lecciones de Fundamentos de scripting en Unity

Practica por tu cuenta: Playground de Unity