Controles VR: grip y gatillo en Unity

Clase 15 de 33Curso de VR con Unity

Resumen

La interacción en VR gana vida cuando el control es claro y consistente. Aquí verás cómo en Unity y con controladores HTC Vive se gestionan el gatillo y el grip lateral para cubrirse con el escudo, alternar entre espada y vara y cargar magia en la punta de la vara, usando un cooldown sencillo y el patrón de toggle con SetActive y activeInHierarchy.

¿Qué acciones de input controlan escudo y armas en Unity?

El flujo se apoya en dos botones: el gatillo para cubrirse con el escudo y el grip lateral para mostrar u ocultar armas. Los mapeos de botones provienen del plugin en los input settings de Unity; basta con usar el nombre de cada parámetro y su código de entrada.

  • Gatillo izquierdo: cubrirse con el escudo si el escudo está activo en la jerarquía.
  • Grip izquierdo: mostrar u ocultar el escudo con cooldown para evitar cambios rápidos.
  • Grip derecho: alternar entre espada y vara; si activas la vara, se carga magia.

Ejemplo de la condición del gatillo y el escudo con AND lógico y consulta de jerarquía:

// Variables ilustrativas
bool shieldActive;
GameObject leftWeapon; // Escudo (brazo izquierdo)
bool leftTriggerPressed;

if (leftTriggerPressed && leftWeapon.activeInHierarchy)
{
    shieldActive = true;
}
else
{
    shieldActive = false;
}

¿Cómo implementar el toggle con cooldown en las armas?

Para mostrar/ocultar armas se usa un toggle: invertir el estado con SetActive(!obj.activeInHierarchy). Además, se aplica un tiempo mínimo de refresco (weapon cooldown) antes de permitir otro cambio. Al cambiar, el contador se reinicia a cero.

¿Cómo se muestra u oculta el escudo con grip izquierdo?

  • Dos restricciones: grip izquierdo pulsado AND weaponCooldown > weaponCooldownTime.
  • Reiniciar el contador tras el cambio.
  • Invertir el estado del escudo con SetActive.
float weaponCooldown;
float weaponCooldownTime;
bool leftGripPressed;

if (leftGripPressed && weaponCooldown > weaponCooldownTime)
{
    weaponCooldown = 0f; // Reinicio del cooldown
    leftWeapon.SetActive(!leftWeapon.activeInHierarchy);
}

¿Cómo alternar espada y vara con grip derecho?

  • Misma lógica de cooldown y toggle aplicada a dos objetos.
  • Si la vara queda activa, cargar magia. Si no, destruir la magia actual.
GameObject rightWeapon;                // Espada
GameObject rightWeaponAlternative;     // Vara
bool rightGripPressed;
GameObject currentMagic;               // Magia actual cargada (puede ser null)

if (rightGripPressed && weaponCooldown > weaponCooldownTime)
{
    weaponCooldown = 0f;

    // Toggle de espada y vara
    rightWeapon.SetActive(!rightWeapon.activeInHierarchy);
    rightWeaponAlternative.SetActive(!rightWeaponAlternative.activeInHierarchy);

    // Si la vara quedó activa, cargar magia; si no, destruirla
    if (rightWeaponAlternative.activeInHierarchy)
    {
        LoadMagic();
    }
    else
    {
        if (currentMagic != null) Destroy(currentMagic);
    }
}

Puntos clave del patrón: - AND lógico para combinar botón y cooldown. - Toggle con !obj.activeInHierarchy. - Reinicio del cooldown tras cada cambio.

¿Cómo cargar y destruir la magia en la vara?

La magia se gestiona con un prefab (por ejemplo, fireMagic) y una referencia al punto de lanzamiento (magicLaunchPoint). Antes de instanciar, se elimina cualquier magia previa para evitar duplicados. Si todavía no está configurada la magia, es normal ver un error en consola; se resolverá al asignar el prefab correspondiente.

GameObject fireMagic;      // Prefab de la magia de fuego
Transform magicLaunchPoint; // Punto de lanzamiento en la punta de la vara

void LoadMagic()
{
    if (currentMagic != null)
    {
        Destroy(currentMagic); // Evitar magias superpuestas
    }

    // Instancia una nueva magia como hija del punto de lanzamiento
    currentMagic = Instantiate(fireMagic, magicLaunchPoint.transform);
}

Conceptos y habilidades trabajadas: - Uso de input settings del plugin para mapear botones. - Evaluación de estado con activeInHierarchy y activación con SetActive. - Control de ritmo con weapon cooldown para evitar cambios excesivos. - Alternancia de objetos (espada/vara) mediante toggle. - Gestión de prefabs con Instantiate y limpieza con Destroy. - Referencias de escena: GameObject y Transform para posicionar la magia en el magic launch point.

¿Te gustaría que profundicemos en el disparo de fuego con el gatillo derecho y efectos visuales de la magia? Deja tus preguntas o ideas y seguimos afinando el sistema.