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