Edited at

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

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の使い方