VirtualYoutuber始めました

最近流行りのVirtualYoutuber
趣味でUnityを触っている身としては、技術的に面白そうな内容だったので自分でもやってみました。

Youtubeチャンネルはこちら

Youtubeの収益条件が変更になったので、しばらくは広告なしで快適に見れるかと思います。

さて、VirtualYoutuberはバイクに変わる新しい趣味として始めたのですが、「自身のUnity力アップ」ということも兼ねています。
ということで、VirtualYoutuberを作成することで得られた内容なんかをブログでフィードバックできればいいなと。
今回はHTC Viveを利用して、Unityちゃんの手を動かすところまで作ってみたいと思います。

今回の環境
Unity 2017.3
HTC Vive

プロジェクトセットアップ
空のプロジェクトを作成し、以下のアセットを取り込み
“Unity-chan!” Model
SteamVR Plugin

上記2つのアセットを取り込んだ状態

SteamVRアセットからPrefabsフォルダ内の[CameraRig]、[Status]プレハブをシーンに設置

Unity-chanアセットよりModelsフォルダ内のUnitychanモデルをシーンに配置

最初からシーンに存在している「Main Camera」は不要になるので削除します

ここまでの状態で再生ボタンでプレビューすれば、VR空間内でUnity-chanモデルを閲覧することが出来ます。

IKセットアップ
キャラクタの制御はIKで行うため、その設定を行います。

手順は
1.新規の「Animator COntroller」を作成
2.unitychanモデルにアタッチされている「Animator」コンポーネントのControllerプロパティに1で作成したAnimator Controllerをアタッチ
3.Animatorウィンドウを開き、Layes > Base Layerを選択
4.歯車アイコンをクリックし、IK Passにチェックを入れる。
ここまでの作業で、以下の画面になっているはずです

スクリプト作成
HTC Viveのコントローラに、左右の手が追従するよう、スクリプトを作成します
スクリプトについては、こちらを参考にさせていただきました。
http://sat-box.hatenablog.jp/entry/2017/04/24/191705

IKController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IKController : MonoBehaviour
{

    [Header("HandAnchors")]
    [SerializeField]
    private Transform rightHandAnchor = null;
    [SerializeField]
    private Transform leftHandAnchor = null;

    private Animator animator;

    // Use this for initialization
    void Start()
    {
        animator = GetComponent<animator>();
    }

    void OnAnimatorIK()
    {
        // 右手コントロール
        if (rightHandAnchor != null)
        {
            animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
            animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);

            animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandAnchor.localPosition);
            animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandAnchor.rotation);
        }

        // 左手コントロール
        if (leftHandAnchor != null)
        {
            animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
            animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);

            animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandAnchor.localPosition);
            animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandAnchor.rotation);
        }
    }
}

作成したプログラムはunitychanモデルにアタッチし、それぞれのフィールドにViveコントローラを割り当てます

ひとまず以上
この状態で再生ボタンを押してプレビューすれば、Viveコントローラに追従してUnityちゃんの腕が動きます

こんな感じで、ほとんどプログラムも書かず、キャラクタを制御することが出来ました。
他のブログ等を参照してみると、Final IKを利用されている方が多いみたいですが、結構お値段します。
とりあえず手を動かす程度であれば、あまりコード量も多くないので、凝った演出をしたくなったらいろいろ買い足していけばよいと思います。


記事内のスクリーンショットはユニティちゃんライセンス条項の元に提供されています