LoginSignup
2
0

XR Interaction ToolkitでFinalIKを使わず一人称視点でのVRMアバターの自然な歩行を実装してみる。

Posted at

はじめに

自分用のメモ。

oculus integrationを使わずXR Interaction Toolkitで動かしたい。
@4sk様の記事を大いに参考にさせていただいた。AvatarAnimationController.csの実装までは以下の点以外はたぶん一緒。

環境

  • Windows11
  • Oculus Link対応GPU搭載PC
  • Unity version: 2021.3.15f1
  • XR Interaction Toolkit Version 2.5.2

実装

AvatarAnimationController.csはoculus integrationを使っているので、XR Interaction Toolkitのみを使うように次のように変更。

AvatarAnimationController.cs
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class AvatarAnimationController : MonoBehaviour
{
    private Animator controller;
    public ActionBasedContinuousMoveProvider moveProvider;

    void Start()
    {
        controller = GetComponent<Animator>();
        ResetAnimation();
        controller.SetTrigger("stop");
    }

    void ResetAnimation()
    {
        controller.ResetTrigger("walkF");
        controller.ResetTrigger("walkB");
        controller.ResetTrigger("walkR");
        controller.ResetTrigger("walkL");
    }

    void Update()
    {
        // moveProviderからVector2型の値を取得
        Vector2 inputVector = moveProvider.leftHandMoveAction.action.ReadValue<Vector2>();
        float forwardMovement = inputVector.y;
        float sidewaysMovement = inputVector.x;

        // 前進Animation
        if (forwardMovement > 0.1f)
        {
            ResetAnimation();
            controller.SetTrigger("walkF");
        }
        // 後退Animation
        else if (forwardMovement < -0.1f)
        {
            ResetAnimation();
            controller.SetTrigger("walkB");
        }
        // 右横歩き
        else if (sidewaysMovement > 0.1f)
        {
            ResetAnimation();
            controller.SetTrigger("walkR");
        }
        // 左横歩き
        else if (sidewaysMovement < -0.1f)
        {
            ResetAnimation();
            controller.SetTrigger("walkL");
        }
        // idle状態
        else if (Mathf.Approximately(forwardMovement, 0f) && Mathf.Approximately(sidewaysMovement, 0f))
        {
            ResetAnimation();
            controller.SetTrigger("stop");
        }
    }
}

あとはインスペクターにContinuousMoveProvider枠があるはずだからそこにContinuousMoveProviderコンポーネント挿してるオブジェクトをぶち込むだけ。

結果

無題の動画 ‐ Clipchampで作成.gif

立ち止まると沈んだ。よくわからん。あとは一応想定内の動作かな。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0