Implémentation de déplacement au joystick pour Pico Neo 3 dans Unity

Dans les projets VR nécessitant un streaming vers le casque Pico Neo 3, le système de déplacement traditionnnel conçu pour le pavé tactile HTC s'avère inadapté. Voici une solution technique pour implémenter un déplacement analogique via le joystick du contrôleur Pico.

using UnityEngine;
using HTC.UnityPlugin.Vive;

public class GestionRotation : MonoBehaviour
{
    public Transform cameraRig;
    public GameObject indicateurLaser;
    private bool rotationActive = true;
    private const float SEUIL_ROTATION = 0.65f;

    void MiseAJour()
    {
        Vector2 axeJoystick = ViveInput.GetPadAxis(HandRole.RightHand);

        if (rotationActive && Mathf.Abs(axeJoystick.x) > SEUIL_ROTATION)
        {
            indicateurLaser.SetActive(false);
            rotationActive = false;
            Invoke("ReinitialiserRotation", 0.8f);
            
            float angleRotation = axeJoystick.x > 0 ? 30f : -30f;
            cameraRig.rotation = Quaternion.AngleAxis(angleRotation, Vector3.up) * cameraRig.rotation;
        }
    }
    
    void ReinitialiserRotation()
    {
        rotationActive = true;
        indicateurLaser.SetActive(true);
    }
}

L'adaptation du système de téléportation nécessite des modifications du script de gestion des déplacements. La solution implique la reconfiguration du système d'entrées pour utiliser le touchpad comme déclencheur.

using HTC.UnityPlugin.Vive;
using UnityEngine;
using UnityEngine.EventSystems;

public class SystemeTeleportation : MonoBehaviour, IPointerExitHandler
{
    public enum BoutonTeleport { PadTouch, Declencheur, Poignee }
    public BoutonTeleport modeActivation = BoutonTeleport.PadTouch;
    public Transform cibleDeplacement;
    public Transform pointPivot;
    public float dureeFondu = 0.4f;

    private ControllerButton BoutonCorrespondant()
    {
        switch (modeActivation)
        {
            case BoutonTeleport.Poignee: return ControllerButton.Grip;
            case BoutonTeleport.Declencheur: return ControllerButton.Trigger;
            default: return ControllerButton.PadTouch;
        }
    }

    public void OnPointerExit(PointerEventData donnees)
    {
        if (!donnees.pointerCurrentRaycast.isValid) return;
        
        Vector3 decalageVertical = Vector3.ProjectOnPlane(
            pointPivot.position - cibleDeplacement.position, 
            cibleDeplacement.up
        );
        
        Vector3 destination = donnees.pointerCurrentRaycast.worldPosition - decalageVertical;
        StartCoroutine(ExecuterTeleportation(destination, dureeFondu));
    }

    private IEnumerator ExecuterTeleportation(Vector3 position, float duree)
    {
        float moitieDuree = duree * 0.5f;
        yield return new WaitForEndOfFrame();
        
        #if VIU_STEAMVR
        SteamVR_Fade.Start(Color.black, moitieDuree);
        yield return new WaitForSeconds(moitieDuree);
        #endif
        
        cibleDeplacement.position = position;
        
        #if VIU_STEAMVR
        SteamVR_Fade.Start(Color.clear, moitieDuree);
        yield return new WaitForSeconds(moitieDuree);
        #endif
    }
}

Étiquettes: Unity3D VR PicoNeo3 HTCVive DéveloppementJeux

Publié le 12 juin à 22h52