hyoromoのブログ

iOS/AndroidもしくはUnityネタを書いています

VRChat向けにVoxel Importerを使ってAvatar作成する

f:id:hyoromo:20210131233651j:plain
VoxelモデルのAvatarをVRChatへアップするところまでを書きます。
年に1回くらいしかAvatar作成しないせいで毎回忘れちゃうためメモレベルですが書き残しておきます。
AvatarのアップロードにはVRChatアカウントのTrust LevelがNew User以上でなければ行えません。

環境

  • Unity2018.4.20f1
  • VRC Avatar 3.0
  • Voxel Impoter 1.2.1

Unity Asset Storeにある有名なVoxelインポートツールは2つあり、本エントリーではその内の一つであるVoel Impoterを使ってUnityへインポートします。
assetstore.unity.com

VRC SDK3.0準備

Unity2018.4.20.f1VRC SDK3.0をインストールし、Unity新規プロジェクトを3Dテンプレートで作成してVRC SDK3.0をimportします。

モデルの事前用意


Voxelデータを予め作成しておきます。
MagicaVoxelかQubicle Voxel Editorで作成してください。前者がオススメで使い方は以前書きました。
hyoromo.hatenablog.com

Voxelデータの取り込み

  1. SceneへGameObjectを新規作成
  2. GameObjectへ VoxelSkinnedAnimationObject コンポーネントを追加
    以降の作業は追加コンポーネント上での設定となります
  3. Voxel FileのOpenをクリックし、追加したいMagicaVoxelデータ(.vox)ファイルを選択
    f:id:hyoromo:20210131203101j:plain
  4. Settings > Import Scale を調整
    粗めのドットであれば 0.1 くらいが丁度良いです
  5. AnimationのCreateボタンを押下し、Plugins > VoxelImporter > Editor > BoneTemplates > Maximum Humanoid (Mecanim).asset を選択
    ここで Minimum Humanoid を選択してしまうとVRC Avatarに必要なRigが不足しているためアップロード時にエラーになります
    f:id:hyoromo:20210131203158j:plain
  6. Rig > Animation Type を Humanoid に変更

ボーン設定

Humanoidの編集

先程 Humanoid を選択したことで、人型のボーンが自動生成されています。
自動生成されたボーンとモデルの位置と重みを設定していきます。

  1. Hierarchyビューにいる追加したGameObjectの子Objである Hips を選択
  2. VoxelSkinnedAnimationObjectBoneコンポーネントのEdit Bone Positionボタンを押下
    するとSceneビュー上にボーン表示とBone Position Editorが表示されます
  3. Sceneビュー上のBone Position Editorの Scaling All を表示されているモデルとボーンを見比べて適切な値に変更する
    一旦「Voxelデータの取り込み」の (4) で設定した Import Scale と同じ値を設定すれば近い大きさとなります
    あとはボーンの座標や長さを調整し、モデルに合わせていく
    f:id:hyoromo:20210131203413j:plain
    f:id:hyoromo:20210131203433j:plain
  4. VoxelSkinnedAnimationObjectBoneコンポーネントのEdit Bone Weightボタンを押下
    すると関節駆動時に影響するポリゴン(部位)をSceneビュー上で設定出来るUIが表示されます
    f:id:hyoromo:20210201001204j:plain
  5. 関節を曲げた時に追随するポリゴンの設定になりますが、Voxelモデルだと 首/肩/肘/股関節/膝 にそれぞれWeight 1で設定。動かしてみて気になるところを+/-でWeight値の調整や、設定する関節を増やすのが楽な気がします

確認はいくつかありますが、簡単な方法だと以下が行いやすいです。

  • それぞれの関節部のGameObjectを選択し、InspectorビューのTransform > Rotationで回してみる
  • Unity-chan! Asset等に同梱されているAnimatorを設定し、PlayModeさせる
ボーンの追加

Humanoid以外のボーンは手動で追加します。

  1. 「Humanoidの編集」の(2)を行いSceneビューでボーン表示させる
  2. ボーンを生やしたいボーンをSceneビュー上で選択
    Hierarchyビューで対象ボーンのGameObjectが選択されている事を確認
  3. Inspectorビューの VoxelSkinnedAnimationObjectBoneコンポーネントのAdd Child Boneボタンを押下
    (2)の子にボーンが追加される事を確認
  4. Sceneビューで追加されたボーンの位置を変更
    f:id:hyoromo:20210201002254j:plain
  5. 「Humanoidの編集」の(4)以降の操作を追加ボーンに対しても行う

VRCコンポーネント追加

VRChat上でAvatarとして動作するのに必要なコンポーネントを追加する必要があります。

  1. Hierarchyビューで今回追加したモデルのGameObjectを選択
  2. VRCAvatarDescriptor コンポーネントを追加
  3. VRC Avatar Descriptor コンポーネントの View > View Position > Editボタン押下で、VR視点時の座標を設定
    両目の間くらい & 少しモデルから離した位置にし、Returnボタンを押下

もし過去にアップロードしたAvatarを上書きしたい場合は Pipeline Manager コンポーネントの Blueprint ID に対象AvatarのIDを設定して Attachボタン押下します。

アニメーション変更

標準アニメーションの変更はしたこと無いので分からないです。
ここでは以下の方法だけ書きます。

常に尻尾を振り続けるアニメーション設定

尻尾といったHumanoidには無いボーンをアニメーションし続ける方法となります。ボーン生成時に作られたボーンでは無く、追加で生やしたボーンを対象にしています。
なお、この方法が正しい方法かについてはよく分かっていません。

  1. Projectビューの適当な場所へAnimatorとAnimationを新規作成
  2. メニュー > Windows > Animation > Animator からビューを開いて先程のAnimatorを選択
  3. 先程追加したAnimationをD&Dし、Entryを右クリックしてDefault Stateとして設定しておく
    f:id:hyoromo:20210131204449j:plain
  4. Hierarchyビューで今回追加したモデルのGameObjectを選択
  5. InspectorビューのAnimatorコンポーネントにあるControllerに、先程作成したAnimatorを設定
  6. (4)を行い、Animationビューの Add Propertyボタン押下して動かしたいボーンのRotationを追加してアニメーションを作成
    f:id:hyoromo:20210131213134j:plain
  7. アニメーションをループさせ続けるために、InspectorビューからAnimationのLoop Timeにチェックを付ける
    f:id:hyoromo:20210131232510j:plain
  8. (4)を行い、InspectorビューのPlayble Layersボタンを押下
  9. Base > FX > Default Non-Transformボタンを押下し、先程作成したAnimatorを設定
    f:id:hyoromo:20210131213159j:plain

Voxel Importerコンポーネントを削除

Voxel Impoterを利用するとモデルの各所にVRChatへアップロード不可のコンポーネントが追加されます。
なので、アップロードする前に各所に設定されているコンポーネントの削除を行います。なお、削除するとVoxel Impoterで行えるモデル編集が行えなくなるので注意が必要です。

削除対象は以下です。Scriptでコンポーネント削除すると楽です。

  • VoxelSkinnedAnimationObject
  • VoxelSkinnedAnimationObjectBone

以下のソースコードをEditorフォルダに作成し、UnityEditorのメニューから削除出来るようにするのも手です。

using UnityEngine;
using UnityEditor;
using VoxelImporter;

public class RemoveComponents : MonoBehaviour
{
    [MenuItem("Tools/Hierarchy上のVoxelImpoterコンポーネントを全削除")]
    private static void RemoveComponentAllVoxelImpoter()
    {
        foreach (GameObject obj in UnityEngine.Object.FindObjectsOfType(typeof(GameObject))) {
            if (obj.activeInHierarchy) {
                RemoveComponent<VoxelSkinnedAnimationObject>(obj);
                RemoveComponent<VoxelSkinnedAnimationObjectBone>(obj);
            }
        }
    }

    private static void RemoveComponent<T>(GameObject obj)
    {
        var component = obj.GetComponent<T>();
        if (component != null) {
            GameObject.DestroyImmediate(component as UnityEngine.Object);
        }
    }
}

VRChatへのアップロード

アップロードはWindows/Oculus Quest向けに行えます。
もし片方しかアップロードしていない場合、アップロードされていないプラットフォームで着ることが出来ない & 該当プラットフォームからは簡易表示されるため、可能であればQuest向けにもアップロードしておきたいです。

Windows向けにアップロード
  1. UnityEditorのメニューにて、VRChat SDK > Show Control Panel を選択
  2. VRChat SDKビューにて、AuthenticationタブでVRChatにログイン
  3. BuilderタブでActive Build Targetが StandaloneWindows64 になっているか確認。他の名称になっていたら Switch Build Target to Windowsボタンを押下
  4. Build & Publish for Windowsボタン押下
    押下出来ない時はエラーが発生しているので、少し上の所に何か表示されていないかを確認する
  5. GameビューにアップロードするAvatar情報が表示されるので、必要項目を設定
    サムネイルであるUpload ImageはHierarchyビューに追加された VRCCam のアングル調整でサムネイル内容が変わります
  6. 各内容に問題無ければ「The above infomation (省略)」にチェックを入れ、Uploadボタンを押下
    f:id:hyoromo:20210131222727j:plain
Oculus Quest向けにアップロード

Windowsの(3)から(4)までの手順だけ異なり、以下のようになります。

3. BuilderタブでActive Build Targetが Android になっているか確認。
 他の名称になっていたら Switch Build Target to Androidボタンを押下
4. Build & Publish for Windowsボタン押下
 押下出来ない時はエラーが発生しているので、少し上の所に何か表示されていないかを確認する

Quest向けにアップロードするにはいくつか制約があります。
一番大きいのがShaderです。VRChat/Mobile 以下にあるものしか使えません。それ以外の制約についてはこちらを確認ください。

MaterialをQuest向けに対応する方法は以下のようになります。

  1. Hierarchyビューで今回追加したモデルのGameObjectを選択
  2. Inspectorビューの Skinned Mesh Renderer の Materials > Element0 に設定されているMaterialを選択する事で、Projectビューの対象Materialが選択される
  3. Materialを複製(Ctrl+D)
  4. 複製したMaterialを選択し、InspectorビューからShaderを VRChat/Mobile 以下のものに変更
    元モデルのShaderを変更していない(Standard)のであれば、Standard Lite にしておけば良いです
  5. (1)を行い、Inspectorビューの Skinned Mesh Renderer の Materials > Element0 に設定されているMaterialを複製したものに変更

VRChat上で確認

Avatarの大きさ、着心地を確認します。
あとはプラットフォーム対応が問題なさそうか確認します。
それぞれのプラットフォームでログインして確認するのがベストですが、以下のように簡易確認可能です。

f:id:hyoromo:20210131233356j:plain
Windows/Quest両方に対応した場合は上図の右上に「Windows(青色)」「Quest(緑色)」の両マークが付きます。

f:id:hyoromo:20210131233758j:plain
もしWindowsのみ対応していた場合は上図のように青色マークだけ付きます。