見出し画像

オープンソース少人数マルチプレイVR空間の開発③

前回のあらすじ

結論から言います。最低限の仕組みは!できたー!!!!!!!

言うて今のやり方だユーザーがアバターをアセットバンドルとしてUnityからビルドして、メタバース空間で会う前にお互いのデータを交換する必要がありますが。
ひとまずこれを小休止として、マルチプレイ対応VRoidhubSDKの申請待ちをしたいと思います。
とりあえず基本的なところはMultiplayer VR Templateくんがやってくれたのですが、Unityに展開したVRMファイルをMultiplayer VR Templateに対応したアセットバンドルにビルドするUnityEditor拡張スクリプトを公開したいと思います。
いうてMultiplayer VR Templateくんの方もちょっぴり弄ったのでこれだけじゃ動かないのですが、こういう考え方したよーみたいな備忘録として(次回の予定としてVroidHubSDKを導入するのでこのスクリプトはだいぶ書き換えられると思います)

というわけで上から解説をば。

using UnityEngine;
using RootMotion.FinalIK;
using UnityEditor;
using System.IO;


public class AvatarSet : EditorWindow
{
    public string SrcPath;
    public string ExportPath;
    public string AvatarName = "";
    public RuntimeAnimatorController anime_ctl;

    [MenuItem("AvatarSet/AvatarSet")]
    static void ShowWindow()
    {
        // ウィンドウを表示!
        EditorWindow.GetWindow<AvatarSet>();
    }

    void OnGUI()
    {

        if (GUILayout.Button("VRMLoad"))
        {
            VRMPath();
        }
        EditorGUILayout.LabelField("VRMPath", SrcPath);

        if (GUILayout.Button("ExportFolder"))
        {
            AvatarPath();
        }

        EditorGUILayout.LabelField("ExportPath", ExportPath);

        AvatarName = EditorGUILayout.TextField("AvatarName", AvatarName);

        EditorGUILayout.HelpBox("VRMPath、ExportPath、AvatarNameを指定してからAvatarExportを実行してください", MessageType.Info);

        if (AvatarName != null)
        {
            if (GUILayout.Button("Export"))
            {
                VRMSet();
            }
        }


    }

こんな感じのEditor拡張を出すやつ。
SrcPath、ExportPath、AvatarName 、どれか一つでもnullだったらExportボタンを表示させない設定にしたかったのですがうまくできませんでした(しろめ

    public void VRMPath()
    {
        SrcPath = EditorUtility.OpenFilePanel("Select File", "", "vrm");
        if (string.IsNullOrEmpty(SrcPath))
            return;

        Directory.Delete("Assets/MultiplayVR/AvatarSet/VRPlayer/VRMModel", true);
        Directory.CreateDirectory("Assets/MultiplayVR/AvatarSet/VRPlayer/VRMModel/");

        SrcPath = SrcPath.Replace('/', System.IO.Path.DirectorySeparatorChar);
        var fileName = System.IO.Path.GetFileName(SrcPath);
        var savePath = "Assets/MultiplayVR/AvatarSet/VRPlayer/VRMModel/AvatarModel.vrm";
        var fullDstPath = Application.dataPath.Replace("Assets", savePath).Replace('/', System.IO.Path.DirectorySeparatorChar);

        System.IO.File.Copy(SrcPath, fullDstPath);

        AssetDatabase.Refresh();
        AssetDatabase.ImportAsset(savePath);
    }

    void AvatarPath()
    {
        ExportPath = EditorUtility.OpenFolderPanel("ExportPath", "", "");
        if (string.IsNullOrEmpty(ExportPath))
            return;
    }

VRMを読み込むボタンと、出力先のパスを取得するボタンの設定。

    void VRMSet()
    {
        var PrefabPath = "Assets/MultiplayVR/AvatarSet/VRPlayer/VRPlayer.prefab";

        GameObject instanceRoot = PrefabUtility.LoadPrefabContents(PrefabPath);
        GameObject.DestroyImmediate(instanceRoot.transform.Find("AvatarModel").gameObject);

        var VRMPath = "Assets/MultiplayVR/AvatarSet/VRPlayer/VRMModel/AvatarModel.prefab";
        GameObject VRM = PrefabUtility.LoadPrefabContents(VRMPath;


(中略)

        var prefabpath = PrefabPath;
        var name = "AvatarModel";
        VRM.name = name;
        VRM.transform.SetParent(instanceRoot.transform, false);

        PrefabUtility.SaveAsPrefabAsset(instanceRoot, prefabpath);
        PrefabUtility.UnloadPrefabContents(instanceRoot);

Multiplayer VR Templateくんのデフォルトアバターを改変して、VRMモデルと入れ替え、prefabとして保存するコード。
それより下は上記のprefabをアセットバンドルとして保存するコードです。
次回以降はおそらくアセットバンドルとして保存する必然性がなくなるはずなので(未定)割愛します。

以上、メタバース開発、進捗報告でした。

この記事が気に入ったらサポートをしてみませんか?