Exemple #1
0
        /// <summary>
        /// プレハブをVRChatへアップロード可能な状態にします。
        /// </summary>
        /// <param name="prefabInstance">現在のシーンに存在するプレハブのインスタンス。</param>
        /// <param name="clips"><see cref="VRMUtility.GetAllVRMBlendShapeClips"/>の戻り値。</param>
        /// <param name="swayingObjectsConverterSetting">揺れ物を変換するか否かの設定。<c>forQuest</c> が <c>true</c> の場合は無視されます。</param>
        /// <param name="takingOverSwayingParameters">揺れ物のパラメータを変換せずDynamic Boneのデフォルト値を利用するなら<c>false</c>。</param>
        /// <param name="swayingParametersConverter"></param>
        /// <param name="enableAutoEyeMovement">【SDK2のみ】オートアイムーブメントを有効化するなら<c>true</c>、無効化するなら<c>false</c>。</param>
        /// <param name="addedShouldersPositionY">VRChat上でモデルがなで肩・いかり肩になる問題について、Shoulder/UpperArmボーンのPositionのYに加算する値。</param>
        /// <param name="moveEyeBoneToFrontForEyeMovement">【SDK2のみ】オートアイムーブメント有効化時、目ボーンのPositionのZに加算する値。</param>
        /// <param name="forQuest">Quest版用アバター向けに変換するなら <c>true</c>。</param>
        /// <param name="addedArmaturePositionY">VRChat上で足が沈む問題について、Hipsボーンの一つ上のオブジェクトのPositionのYに加算する値。</param>
        /// <param name="useAnimatorForBlinks">【SDK2のみ】まばたきにAnimatorコンポーネントを利用するなら <c>true</c>。
        ///     <c>forQuest</c> が <c>false</c> の場合、常にAnimatorコンポーネントが利用され、このパラメータは無視されます。</param>
        /// <param name="useShapeKeyNormalsAndTangents"><c>false</c> の場合、シェイプキーの法線・接線を削除します。</param>
        /// <param name="vrmBlendShapeForFINGERPOINT">FINGERPOINTへ割り当てる表情。</param>
        /// <returns>変換中に発生したメッセージ。</returns>
        public static IEnumerable <Converter.Message> Convert(
            GameObject prefabInstance,
            IEnumerable <VRMBlendShapeClip> clips,
            SwayingObjectsConverterSetting swayingObjectsConverterSetting = default,
            bool takingOverSwayingParameters = true,
            SwayingParametersConverter swayingParametersConverter = null,
            bool enableAutoEyeMovement             = true,
            float addedShouldersPositionY          = 0.0f,
            float moveEyeBoneToFrontForEyeMovement = 0.0f,
            bool forQuest = false,
            float addedArmaturePositionY                  = 0.0f,
            bool useAnimatorForBlinks                     = true,
            bool useShapeKeyNormalsAndTangents            = false,
            VRMBlendShapeClip vrmBlendShapeForFINGERPOINT = null
            )
        {
#if VRC_SDK_VRCSDK2
            prefabInstance.AddComponent <VRC_AvatarDescriptor>();
#elif VRC_SDK_VRCSDK3
            prefabInstance.AddComponent <VRCAvatarDescriptor>();
#else
            throw new PlatformNotSupportedException("VRChat SDK2 or SDK3 has not been imported.");
#endif
#if VRC_SDK_VRCSDK2 || VRC_SDK_VRCSDK3
            prefabInstance.GetOrAddComponent <PipelineManager>();
#endif
            var messages = new List <Converter.Message>();
            messages.AddRange(GeometryCorrector.Apply(avatar: prefabInstance));
            messages.AddRange(BlendShapeReplacer.Apply(
                                  avatar: prefabInstance,
                                  clips: clips,
                                  useAnimatorForBlinks: forQuest ? useAnimatorForBlinks : true,
                                  useShapeKeyNormalsAndTangents,
                                  vrmBlendShapeForFINGERPOINT
                                  ));
            messages.AddRange(ComponentsReplacer.Apply(
                                  avatar: prefabInstance,
                                  swayingObjectsConverterSetting: forQuest
                    ? SwayingObjectsConverterSetting.RemoveSwayingObjects
                    : swayingObjectsConverterSetting,
                                  swayingParametersConverter: takingOverSwayingParameters
                    ? swayingParametersConverter ?? DefaultSwayingParametersConverter
                    : null
                                  ));
            messages.AddRange(VRChatsBugsWorkaround.Apply(
                                  avatar: prefabInstance,
                                  enableAutoEyeMovement: enableAutoEyeMovement,
                                  addedShouldersPositionY: addedShouldersPositionY,
                                  addedArmaturePositionY: addedArmaturePositionY,
                                  moveEyeBoneToFrontForEyeMovement: moveEyeBoneToFrontForEyeMovement,
                                  forQuest: forQuest
                                  ));
            ComponentsRemover.Apply(avatar: prefabInstance);
            Undo.RegisterCreatedObjectUndo(prefabInstance, "Convert VRM for VRChat");
            return(messages);
        }
        /// <summary>
        /// プレハブをVRChatへアップロード可能な状態にします。
        /// </summary>
        /// <param name="prefabInstance">現在のシーンに存在するプレハブのインスタンス。</param>
        /// <param name="clips"><see cref="VRMUtility.GetAllVRMBlendShapeClips"/>の戻り値。</param>
        /// <param name="forQuest">Quest版用アバター向けに変換するなら <c>true</c>。</param>
        /// <param name="swayingObjectsConverterSetting">揺れ物を変換するか否かの設定。<c>forQuest</c> が <c>true</c> の場合は無視されます。</param>
        /// <param name="takingOverSwayingParameters">揺れ物のパラメータを変換せずDynamic Boneのデフォルト値を利用するなら<c>false</c>。</param>
        /// <param name="swayingParametersConverter"></param>
        /// <param name="swayingParametersConverter"></param>
        /// <param name="addedShouldersPositionY">VRChat上でモデルがなで肩・いかり肩になる問題について、Shoulder/UpperArmボーンのPositionのYに加算する値。</param>
        /// <param name="addedArmaturePositionY">VRChat上で足が沈む問題について、Hipsボーンの一つ上のオブジェクトのPositionのYに加算する値。</param>
        /// <param name="useShapeKeyNormalsAndTangents"><c>false</c> の場合、シェイプキーの法線・接線を削除します。</param>
        /// <returns>変換中に発生したメッセージ。</returns>
        public static IEnumerable <(string message, MessageType type)> Convert(
            GameObject prefabInstance,
            IEnumerable <VRMBlendShapeClip> clips,
            bool forQuest,
            SwayingObjectsConverterSetting swayingObjectsConverterSetting,
            bool takingOverSwayingParameters = true,
            VRMSpringBonesToDynamicBonesConverter.ParametersConverter swayingParametersConverter = null,
            VRMBlendShapeClip vrmBlendShapeForFINGERPOINT = null,
            bool keepingUpperChest             = false,
            float addedShouldersPositionY      = 0.0f,
            float addedArmaturePositionY       = 0.0f,
            bool useShapeKeyNormalsAndTangents = false
            )
        {
            AssetDatabase.SaveAssets();

#if VRC_SDK_VRCSDK3
            prefabInstance.AddComponent <VRCAvatarDescriptor>();
            prefabInstance.GetOrAddComponent <PipelineManager>();
#else
            throw new PlatformNotSupportedException("VRChat SDK3-Avatars has not been imported.");
#endif

            var messages = new List <(string, MessageType)>();
            messages.AddRange(GeometryCorrector.Apply(avatar: prefabInstance));
            BlendShapeReplacer.Apply(
                avatar: prefabInstance,
                clips: clips,
                useShapeKeyNormalsAndTangents,
                vrmBlendShapeForFINGERPOINT
                );
            messages.AddRange(ComponentsReplacer.Apply(
                                  avatar: prefabInstance,
                                  swayingObjectsConverterSetting: forQuest
                    ? SwayingObjectsConverterSetting.RemoveSwayingObjects
                    : swayingObjectsConverterSetting,
                                  swayingParametersConverter: takingOverSwayingParameters
                    ? swayingParametersConverter
                    : null
                                  ));
            messages.AddRange(VRChatsBugsWorkaround.Apply(
                                  avatar: prefabInstance,
                                  keepingUpperChest,
                                  addedShouldersPositionY: addedShouldersPositionY,
                                  addedArmaturePositionY: addedArmaturePositionY
                                  ));
            VRChatUtility.RemoveBlockedComponents(prefabInstance, forQuest);
            Undo.RegisterCreatedObjectUndo(prefabInstance, "Convert VRM for VRChat");

            AssetDatabase.SaveAssets();
            return(messages);
        }