/// <summary> /// プレハブアセットを上書きしてVRMプレハブにします。 /// </summary> /// <param name="prefabPath">「Assets/」で始まるプレハブアセットのパス。</param> /// <param name="prefabInstance"><see cref="PrefabUtility.LoadPrefabContents"/>で開いたプレハブインスタンス。 /// 指定されていなければ、「prefabPath」を<see cref="PrefabUtility.LoadPrefabContents"/>で開き、処理後、 /// <see cref="PrefabUtility.SaveAsPrefabAsset"/>、<see cref="PrefabUtility.UnloadPrefabContents"/>、 /// <see cref="PrefabUtility.SaveAssets"/>を実行します。</param> public static void Initialize(string prefabPath, GameObject prefabInstance = null) { var prefab = prefabInstance != null ? prefabInstance : PrefabUtility.LoadPrefabContents(prefabPath); var animator = prefab.GetComponent <Animator>(); var metaObject = ScriptableObject.CreateInstance <VRMMetaObject>(); metaObject.name = "Meta"; var meta = prefab.AddComponent <VRMMeta>(); meta.Meta = AssetUtility.Save(prefabPath, metaObject); var humanoidDescription = prefab.AddComponent <VRMHumanoidDescription>(); humanoidDescription.Avatar = animator.avatar; var blendShapeProxy = prefab.AddComponent <VRMBlendShapeProxy>(); var blendShapeAvatar = ScriptableObject.CreateInstance <BlendShapeAvatar>(); blendShapeAvatar.name = "BlendShape"; blendShapeProxy.BlendShapeAvatar = AssetUtility.Save(prefabPath, blendShapeAvatar); blendShapeProxy.BlendShapeAvatar.CreateDefaultPreset(); blendShapeAvatar.Clips = blendShapeAvatar.Clips.Select(clip => AssetUtility.Save(prefabPath, clip)).ToList(); var firstPerson = prefab.AddComponent <VRMFirstPerson>(); firstPerson.SetDefault(); firstPerson.TraverseRenderers(); prefab.AddComponent <VRMLookAtHead>(); var lookAtBoneApplyer = prefab.AddComponent <VRMLookAtBoneApplyer>(); lookAtBoneApplyer.LeftEye = OffsetOnTransform.Create(animator.GetBoneTransform(HumanBodyBones.LeftEye)); lookAtBoneApplyer.RightEye = OffsetOnTransform.Create(animator.GetBoneTransform(HumanBodyBones.RightEye)); var secondary = prefab.transform.Find("secondary"); if (secondary == null) { secondary = new GameObject("secondary").transform; secondary.SetParent(prefab.transform, false); } if (secondary.GetComponent <VRMSpringBone>() == null) { secondary.gameObject.AddComponent <VRMSpringBone>(); } if (prefabInstance == null) { PrefabUtility.SaveAsPrefabAsset(prefab, prefabPath); PrefabUtility.UnloadPrefabContents(prefab); AssetDatabase.SaveAssets(); } }
private void SetModel(ModelAsset assets) { var vrmModel = _vrmModel; vrmModel = assets.Root; // Cleanup var loaded = _loadedBvhSourceOnAvatar; _loadedBvhSourceOnAvatar = null; if (loaded != null) { Debug.LogFormat("destroy {0}", loaded); Destroy(loaded.gameObject); } if (vrmModel != null) { // Set up expressions _facialExpressionPanel.CreateDynamicObject(vrmModel); _informationUpdate.SetVRM(vrmModel); SkinnedMeshRenderer[] skinnedMeshes = vrmModel.GetComponentsInChildren <SkinnedMeshRenderer>(); foreach (var skinMesh in skinnedMeshes) { skinMesh.updateWhenOffscreen = true; } // Set up LookAt var lookAt = vrmModel.GetComponent <VRMBlendShapeProxy>(); if (lookAt != null) { _loadedBvhSourceOnAvatar = vrmModel.AddComponent <HumanPoseTransfer>(); _loadedBvhSourceOnAvatar.Source = _bvhSource; _motionControlPanel.LoadedBvhSourceOnAvatar = _loadedBvhSourceOnAvatar; if (_toggleMotionBVH.isOn) { _loadedBvhSourceOnAvatar.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer; } if (_toggleMotionTPose.isOn) { _loadedBvhSourceOnAvatar.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseClip; } if (_faceViewToggle.isOn) { _closeGameObject.FaceCameraPropertyActivateVRM(); } _motionControlPanel.AssignAutoPlay(vrmModel); if (_lookAtSphere.isOn) { lookAt.Gaze = _targetSphere.transform; } else if (_lookAtCamera.isOn) { lookAt.Gaze = _targetCamera.transform; } else { lookAt.Gaze = _referenceObject.transform; } // Check the model's LookAt type var animator = vrmModel.GetComponent <Animator>(); var leftEye = OffsetOnTransform.Create(animator.GetBoneTransform(HumanBodyBones.LeftEye)).Transform; var rightEye = OffsetOnTransform.Create(animator.GetBoneTransform(HumanBodyBones.RightEye)).Transform; if (leftEye == null && rightEye == null) { _lookAtBlendShapeFlag = true; lookAt.LookAtType = VRMBlendShapeProxy.LookAtTypes.BlendShape; } // Send information _informationUpdate.SetVRM(vrmModel); _informationUpdate.SetLookAtType(_lookAtBlendShapeFlag); } // Set up animation var animation = vrmModel.GetComponent <Animation>(); if (animation && animation.clip != null) { animation.Play(animation.clip.name); } // Show mesh foreach (var r in assets.Renderers) { r.enabled = true; } // VRMFirstPerson initialization var m_firstPerson = vrmModel.GetComponent <VRMFirstPerson>(); if (m_firstPerson != null) { m_firstPerson.Setup(); } if (_freeViewpointToggle.isOn) { _closeGameObject.EnableFirstPersonModeOption(); } } }
private void SetModel(GameObject vrmModel) { // cleanup var loaded = _loadedBvhSourceOnAvatar; _loadedBvhSourceOnAvatar = null; if (loaded != null) { Debug.LogFormat("destroy {0}", loaded); Destroy(loaded.gameObject); } if (vrmModel != null) { // Set up expressions _facialExpressionPanel.CreateDynamicObject(_vrmModel); _informationUpdate.SetVRM(vrmModel); _proxy = vrmModel.GetComponent <VRMBlendShapeProxy>(); // Set up LookAt var lookAt = vrmModel.GetComponent <VRMLookAtHead>(); if (lookAt != null) { _loadedBvhSourceOnAvatar = vrmModel.AddComponent <HumanPoseTransfer>(); _loadedBvhSourceOnAvatar.Source = _bvhSource; _motionControlPanel.LoadedBvhSourceOnAvatar = _loadedBvhSourceOnAvatar; if (_toggleMotionBVH.isOn) { _loadedBvhSourceOnAvatar.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer; } if (_toggleMotionTPose.isOn) { _loadedBvhSourceOnAvatar.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseClip; } if (_faceViewToggle.isOn) { _closeGameObject.FaceCameraPropertyActivateVRM(); } _motionControlPanel.AssignAutoPlay(vrmModel); if (_lookAtSphere.isOn) { lookAt.Target = _targetSphere.transform; } else if (_lookAtCamera.isOn) { lookAt.Target = _targetCamera.transform; } else { lookAt.Target = _targetSphere.transform; } lookAt.UpdateType = UpdateType.LateUpdate; // after HumanPoseTransfer's setPose var animator = _vrmModel.GetComponent <Animator>(); var leftEye = OffsetOnTransform.Create(animator.GetBoneTransform(HumanBodyBones.LeftEye)).Transform; var rightEye = OffsetOnTransform.Create(animator.GetBoneTransform(HumanBodyBones.RightEye)).Transform; if (!(leftEye == null || rightEye == null)) { _leftEyeSaved = leftEye; _rightEyeSaved = rightEye; _lookAtBoneFlag = true; // Send information _informationUpdate.SetVRM(_vrmModel); _informationUpdate.SetBoneEyeTransform(_leftEyeSaved, _rightEyeSaved); _informationUpdate.SetLookAtType(_lookAtBoneFlag); } else { if (_vrmModel.GetComponent <VRMLookAtBoneApplyer>() != null) { Destroy(_vrmModel.GetComponent <VRMLookAtBoneApplyer>()); _vrmModel.AddComponent <VRMLookAtBlendShapeApplyer>(); } _lookAtBoneFlag = false; // Send information _informationUpdate.SetVRM(_vrmModel); _informationUpdate.SetLookAtType(_lookAtBoneFlag); } } // Set up FirstPerson var m_firstPerson = _vrmModel.GetComponent <VRMFirstPerson>(); if (m_firstPerson != null) { m_firstPerson.Setup(); } if (_freeViewpointToggle.isOn) { _closeGameObject.EnableFirstPersonModeOption(); } } }