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:
¿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.
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;// EspadaGameObject rightWeaponAlternative;// Varabool 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, destruirlaif(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 fuegoTransform magicLaunchPoint;// Punto de lanzamiento en la punta de la varavoidLoadMagic(){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.