Open3

VRMでのVRまたは1人称視点時の頭や髪の非表示について

fogfog

前提

2種類のカメラがあるという想定

  • VRカメラまたは1人称視点カメラ
  • 3人称視点カメラ

GameObjectのLayerの設定

  • VRMFirstPersonOnly
  • VRMThirdPersonOnly
    • このレイヤーを設定すべきGameObjectは Avatarの頭、髪、頭にあるアクセサリ等

VRカメラまたは1人称視点カメラの設定

VRMFirstPersonOnlyをCollingMaskに設定する

3人称視点カメラの設定

VRMThirdPersonOnlyをCollingMaskに設定する

参考資料

https://vrm.dev/api/vrm1_firstperson/

fogfog

Runtime読み込みしたVRMに対して非表示にするには?

読み込まれたVRMのGameObject内のVRMInstanceを選択する。

頭はThirdPersonOnlyを設定
体はBothを設定

Autoの場合の挙動

VRMFirstPerson.Setupをプログラムから実行することで、BothまたはThirdPersonOnlyに自動で設定される。

https://vrm.dev/api/vrm1_firstperson/#runtime-に-firstperson-機能を有効にする

https://vrm.dev/univrm/firstperson/univrm_firstperson/#autoの可視設定

fogfog

Vrm.FirstPerson.SetupAsyncについて

var vrmInstance = GetComponent<Vrm10Instance>();
var awaitCaller = new UniTaskAwaitCaller();
await vrmInstance.Vrm.FirstPerson.SetupAsync(vrmInstance.gameObject, awaitCaller).AsUniTask();

awaitCallerについては、LLMにコードを作ってもらった

private class UniTaskAwaitCaller : IAwaitCaller
{
    public async Task NextFrame()
    {
        await UniTask.Yield(PlayerLoopTiming.Update);
    }

    public async Task Run(Action action)
    {
        action();
        await UniTask.Yield(PlayerLoopTiming.Update);
    }

    public async Task<T> Run<T>(Func<T> action)
    {
        var result = action();
        await UniTask.Yield(PlayerLoopTiming.Update);
        return result;
    }

    public async Task NextFrameIfTimedOut()
    {
        await UniTask.Yield(PlayerLoopTiming.Update);
    }
}