/// <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); }