LoginSignup
4
2

More than 3 years have passed since last update.

VRMの一人称視点で影を付ける方法

Last updated at Posted at 2019-10-04

VRMはVRアプリケーション向けのアバターフォーマットなので、一人称用に便利な機能があります(VRMFirstPerson)。しかし、セットアップを実行すると一人称視点で自分の頭の影(THIRDPERSON_ONLY_LAYERの影)が見えなくなってしまうので、これを解決する方法です。

方法としては、THIRDPERSON_ONLY_LAYERCloneFIRSTPERSON_ONLY_LAYERに変更。Cast ShadowsShadows Onlyに変更することで影のみを表示するオブジェクトを一人称レイヤーに追加しています。スクリプト化すると以下のようになります。これをシーンに読み込んだVRMにアタッチすることで、一人称でも頭等の影が表示されます。

VRMFirstPersonWithShadow.cs
using UnityEngine;
using VRM;

public class VRMFirstPersonWithShadow : MonoBehaviour
{
    private VRMFirstPerson vrmFirstPerson;

    void Start()
    {
        vrmFirstPerson = GetComponent<VRMFirstPerson>();
        vrmFirstPerson.Setup();

        foreach (var renderer in GetComponentsInChildren<SkinnedMeshRenderer>(true))
        {
            if(renderer.gameObject.layer == 10){
                var obj = Instantiate(renderer.gameObject, renderer.gameObject.transform.position, renderer.gameObject.transform.rotation);
                obj.transform.parent = renderer.gameObject.transform;
                obj.gameObject.layer = 9;
                var skin = obj.GetComponent<SkinnedMeshRenderer>();
                skin.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;

                foreach (Transform child in obj.transform) {
                    GameObject.Destroy(child.gameObject);
                }
            }
        }

        foreach (var renderer in GetComponentsInChildren<MeshRenderer>(true))
        {
            if(renderer.gameObject.layer == 10){
                var obj = Instantiate(renderer.gameObject, renderer.gameObject.transform.position, renderer.gameObject.transform.rotation);
                obj.transform.parent = renderer.gameObject.transform;
                obj.gameObject.layer = 9;
                var mesh = obj.GetComponent<MeshRenderer>();
                mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;

                foreach (Transform child in obj.transform) {
                    GameObject.Destroy(child.gameObject);
                }
            }
        }
    }
}

実際の動作イメージです。一人称でも良い感じに影が出ました。
左:vrmFirstPerson.Setup();を実施
右:vrmFirstPerson.Setup();を実施後、影用のObjectをCloneしたケース。

・セットアップ参考
VRMFirstPersonの使い方

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