見出し画像

Modular Avatar拡張の書き方(これで良いかは分からないけど一応動いたので書き残しておく的な感じ)


概要

こちらを作る際に人型関節ボーンごとに処理をしたくてModular Avatar拡張?を書きました。エディタ拡張でも良いと思ったんですが、時代は最早MAという事で、慣れてみようと思い試してみました。

前提(言い訳)

前述で「Modular Avatar拡張?」としたように、あまり自信がありません。一応動いているので、一例程度で捉えて頂ければと思います。公式の案内を見ただけではピンと来なかったので、検索してみたのですが関連記事も見つからず、情報がないのでは?と思い、であれば怪しくても一応記事を書こうかな、程度です。(既に広く普及済みで分かってる人からしたら当然の内容、とかだったらコメントに「死ね」って書いておいてください。)

参考

極論としては公式読めば分かるだろ?案件なのだとは思います。

あとはNDMFのサンプルですね。

こちらのREADMEにあるリンクの先が案内どおり参考になります。
https://github.com/bdunderscore/ndmf/blob/main/Editor/Samples~/SetViewpointPlugin.cs

作例

MAとNDMFのサンプルを雰囲気で合体させた例が以下です。

using UnityEngine;

public class Sample : nadena.dev.modular_avatar.core.AvatarTagComponent
{
    public string Text;
    public GameObject Object;
}
#region

using nadena.dev.ndmf;
using nadena.dev.ndmf.sample;
using UnityEngine;

#endregion

[assembly: ExportsPlugin(typeof(Sample_Plugin))]

namespace nadena.dev.ndmf.sample
{
    public class Sample_Plugin : Plugin<Sample_Plugin>
    {
        protected override void Configure()
        {
            InPhase(BuildPhase.Generating)
                .BeforePlugin("nadena.dev.modular-avatar")
                .Run("Do something", ctx => {
                    var obj = ctx.AvatarRootObject.GetComponentInChildren<Sample>();
                    if (obj != null)
                    {
                        Debug.Log(obj.Text);
                        Animator anim = ctx.AvatarRootObject.GetComponent<Animator>();
                        var go = GameObject.Instantiate(obj.Object);
                        go.transform.parent = anim.GetBoneTransform(HumanBodyBones.Head);
                        go.transform.localPosition = Vector3.zero;
                    }
                });
        }
    }
}

一つ目のスクリプトをアバターに仕込むprefab等にアタッチし、二つ目のスクリプトは".\Assets\Editor"以下に置きます。一つ目のスクリプトで必要情報を持っておき、二つ目のスクリプトで本処理をする想定です。

訂正

先述の一つ目のスクリプトですが、継承すべきはAvatarTagComponentではなく、MonoBehaviour, IEditorOnlyとのことです。ご本家様よりご指摘頂いた原文を以下に引用します。

先述の一つ目のスクリプトを直すと、以下のようになると思います。

using UnityEngine;
using VRC.SDKBase;

public class Sample : MonoBehaviour, IEditorOnly
{
    public string Text;
    public GameObject Object;
}

じゃあ何故私はAvatarTagComponentを継承したんだろう?何も覚えていない……、さらに言えば本処理は別に一つ目に書いても良いのでは?エディタに見せるメンバをpublicにするのはイマイチなのでは?なんもわからん……

補足

一つ目のスクリプトはNDMFのサンプルが参照しているクラスを参考にしています。
https://github.com/bdunderscore/ndmf/blob/main/Runtime/Samples~/SetViewpoint.cs

二つ目のスクリプトはMAとNDMFのサンプルを参考にしています。二つ目のスクリプトがMAから呼ばれて、処理対象アバターのroot以下に一つ目のスクリプトがあった場合に、自分が処理したい内容を書くのだと思います。

今回の例では、コンソールにTextの内容をデバッグ表示して、Objectが指す対象を複製してアバターの頭に付けています。余談ですが、頭を親にした後にローカル0にしないと位置が合わないです。この辺りの書き方は、通常のエディタ拡張と同様だと思われます。

動作確認ですが、通常どおりアップロード手順を踏めば確実ですが、処理対象アバターを右クリックしてModularAvatarからManual bake avatarで、シーン内に処理後のオブジェクトが生成されるようです。

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