Beispiel #1
0
        /// <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();
            }
        }
Beispiel #2
0
        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();
                }
            }
        }
Beispiel #3
0
        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();
                }
            }
        }