LoginSignup
7
7

OVR + VRM + Photonを用いたマルチプレイ対応アバターシステム

Last updated at Posted at 2023-06-25

はじめに

Unityでアバターを使用する方法は様々あると思いますが(Meta Avatars SDKなど),今回はVRMをもちいて開発をおこないます.
自分が研究ではOculusをもちいてVRApp開発をしていたので,Oculus IntegrationにPhoton(PUN2)を利用してマルチプレイ対応Appの基盤的なものを作成します.
Unity初めて1年程度なので,もっといい方法があったら情報提供おねがいします!!!

開発環境

  • Windows10
  • Oculus Link対応GPU搭載PC
  • Unity version: 2021.3.26f1

目次

1. 完成イメージ
2. VRMのimport
3. Final IKの導入
4. Oculus integrationの導入
5. photonの導入
6. Avatarの設定
7. 実行結果
8. 自然な歩行を可能にする方法(2023/11/11追記)
9. おわりに

以上の流れで内容を書いていきます.

完成イメージ

こんな感じでマルチプレイができます.
vr_avatar_system.gif

VRMのimport

VRMをUnityへimportするためのunitypackageがあります.
これに関しては,以下の記事を参考に行うとよいかと思います.
また,VRMをアバターとして用いる際には,FinalIK(有料アセット)を使用します.

VRMに関しては,VRM0系とVRM1系がありますが,それぞれ使いたいVRMの種類によって追加するunitypackageをimportしてください.
自分の所感ですが,最近のVRoid HubはVRM1系が多い気がします.(詳しい方情報お願いします!!!)

自作できる方はBlender?などを用いてVRMアバターを作成してもいいですが,気軽にVRMアバターを使用したいならVRoid Hubをおすすめします.
今回は,以下のアバターを用いてマルチプレイ対応VRAppを作成します.

ダウンロードしたVRMファイルをUnityにドラッグ&ドロップすれば正常にimportされるはずです.

↓こんな感じ↓
image.png

FinalIKの導入

Final IKを購入後,Package ManagerのMy Assetsからimport

Oculus integrationの導入

これに関してはネット上にたくさん情報があふれているかと思います.
今回はOculus Linkを使用して開発をしています.Linkに関する設定も他の記事を見てください.
OculusでLinkを立ち上げ,Unityでゲーム再生したときにVRのAppが立ち上がれば大丈夫です.(もちろんOVRCameraRig等をシーン内に配置したときに)

photonの導入

以下の記事を見ながら基本的には設定をすれば大丈夫です.

以下に設定手順をざっくり書いていきます

  1. 公式サイトから,アカウント登録,サインインする
  2. アプリケーションを作成する
    1. image.png
    2. image.png
    3. photon_sample_app.png
    4. 上画像のアプリケーションIDが必要となります(添付画像では消してあります)
    5. AssetストアからphotonをUnityプロジェクトにimport
    6. PUN Wizardが開いたら,アプリケーションIDを入れて,setup
    7. PUN2の設定ファイル(PhotonServerSettings)の設定

次に,PhotonManager.csを作成

PhotonManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;

public class PhotonManager : MonoBehaviourPunCallbacks
{
    [SerializeField] string avatarName = "AvatarSample_A";
    [SerializeField] Transform spawnpoint;


    private void Start()
    {
        PhotonNetwork.ConnectUsingSettings();
    }

    public override void OnConnectedToMaster()
    {
        PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
    }

    public override void OnJoinedRoom()
    {
        Vector3 position = spawnpoint.position;
        PhotonNetwork.Instantiate(avatarName, position, Quaternion.identity);
    }
}
  • scene内に,PhotonManager(空オブジェクト)を作成,PhtonManager.csをアタッチ
  • SpawnPoint(空オブジェクト)を任意の場所に作成
  • PhotonManagerコンポーネントにおいて,Inspector内からSpawnPointを設定
  • image.png

Avatarの設定

  • 一般的なVRMアバターの利用方法は,OVRPlayerControllerの子オブジェクトとし,VRIKによって,頭,両手を追従させることです

  • image.png

  • しかし,このVRM込みのOVRPlayerControllerをPhotonサーバー接続時に生成してしまうと,OVRManager周りのエラーが出ます

  • かつ,Avatar操作周りをマルチプレイと切り分けたほうが,OVRPlayerContorollerに変更を加えずにすみます

    • これにより,マルチプレイを気にせずに世にあふれているOVR周りの開発が容易になります
    • よって,以下でその切り分け方について説明します

OVRとPhotonまわりをどうやって切り分けるか

  • VRMアバターを,以下の構成に変更を変更します

  • image.png

  • prefabになっているAvatarSample_AがVRM,他はすべて空オブジェクト

  • これにより,以下のようにネットワークオブジェクトとローカルオブジェクトを切り分けられます

  • image.png

  • Photonによって共有されるTransformは,OVRPlayerControllerの座標ではなく,新しく作成したAvatarSample_Aの各オブジェクトの座標となり,OVR系統はphotonとは無関係のオブジェクトにできます.(各オブジェクトの詳細な設定は後述)

  • 次に,ネットワークオブジェクトの追従設定のためのTagを用意します

  • image.png

  • それぞれシーン内の,OVRPlayerController,OVRCameraRig,TrackingSpace,LHandTargetAnchor,RHandTargetAnchorにタグ付けします

  • 以下のCreatePhotonAvatar.csを作成ます(VRMオブジェクトににアタッチします)

CreatePhotonAvatar.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RootMotion.FinalIK;
using Photon.Pun;

public class CreatePhotonAvatar : MonoBehaviourPunCallbacks
{ 
    private GameObject masterPlayerObject;
    private GameObject[] rootTargets = new GameObject[7];

    [SerializeField] GameObject[] Targets = new GameObject[7];

    private bool isCreated = false;


    private void OnCreate()
    {
        masterPlayerObject = GameObject.FindGameObjectWithTag("MasterPlayer");
        rootTargets[0] = GameObject.FindGameObjectWithTag("CameraRig");
        rootTargets[1] = GameObject.FindGameObjectWithTag("TrackingSpace");
        rootTargets[2] = GameObject.FindGameObjectWithTag("MainCamera");
        rootTargets[3] = GameObject.FindGameObjectWithTag("LHandTargetAnchor");
        rootTargets[4] = GameObject.FindGameObjectWithTag("RHandTargetAnchor");
        for(int i = 0; i < 5; i++)
        {
            if(rootTargets[i] == null)
            {
                Debug.Log(i);
                Debug.LogError("Target is not found");
            }
        }

        isCreated = true; 
    }

    private void OnEnable()
    {
        if(photonView.IsMine)
        {
            OnCreate();
        }
    }

    void Update()
    {
        if(isCreated)
        {
            this.transform.position = masterPlayerObject.transform.position;
            this.transform.rotation = masterPlayerObject.transform.rotation;

            for(int i = 0; i < 5; i++)
            {
                Targets[i].transform.localPosition = rootTargets[i].transform.localPosition;
                Targets[i].transform.localRotation = rootTargets[i].transform.localRotation;
            }

        }
    }
}

SampleAvatar_Aの各種設定

  1. image.png

  2. image.png

  3. image.png

  4. HeadTargetAmchor,RHandTargetAnchor,LHandTargetAnchorすべてに以下の設定

    • image.png
    • それぞれのTransformは以下
    • image.png
    • image.png
    • image.png
  5. AvatarSample(VRMのほう)にVRIKをアタッチ

    • tramsform設定はこれ
      image.png
  6. VRIK内の設定

    • image.png
    • image.png
    • image.png

これで完成です!!!

実行結果

image.png

vr_avatar_system.gif

歩き方がだいぶ不自然なので,以下の記事を参考にVRIKの設定をいじっていい感じにしましょう.
Final IK の VRIK の Solver にある各値の説明

自然な歩行を可能にする方法(2023/11/11追記)

新しくFinal IKを使った自然な歩行アニメーションを実現する方法についての記事を書きました.参考までに.
FinalIKを使用したVRMアバターの自然な歩行を実現する方法

おわりに

今回はOVR, VRMとphotonをもちいてアバターシステムの作成方法を紹介しました.
初投稿で,拙い点が多いと思いますが,許してください!!!
様々な先人の知恵をお借りしながら作成しました.この記事内でも沢山リンクをはらせていただいております.ありがとうございます.
まだまだ開発途中で,よりよい方法があるかと思いますが.少しでも助けになればと思います.

7
7
0

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
7
7