From a4b67a1cff4253091ececf8c9947b2eaf2943f06 Mon Sep 17 00:00:00 2001 From: bd_ Date: Sun, 13 Apr 2025 18:28:56 -0700 Subject: [PATCH] fix: transform lookthrough logic was broken and could result in deleted curves (#1558) Closes: #1550 --- CHANGELOG-PRERELEASE-jp.md | 1 + CHANGELOG-PRERELEASE.md | 1 + CHANGELOG-jp.md | 1 + CHANGELOG.md | 1 + Editor/MergeArmatureHook.cs | 9 +- Editor/MeshRetargeter.cs | 7 +- .../MergeAnimatorTests/MergeSingleTests.cs | 5 + .../MergeArmatureTests/MergeArmatureTests.cs | 35 +- .../TransformLookthrough.meta | 8 + .../RetainsTransformLookthroughCurves.prefab | 613 ++++++++++++++++++ ...ainsTransformLookthroughCurves.prefab.meta | 7 + .../TransformLookthrough/ac.controller | 72 ++ .../TransformLookthrough/ac.controller.meta | 8 + .../TransformLookthrough/test.anim | 192 ++++++ .../TransformLookthrough/test.anim.meta | 8 + 15 files changed, 961 insertions(+), 7 deletions(-) create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough.meta create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab.meta create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller.meta create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim create mode 100644 UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim.meta diff --git a/CHANGELOG-PRERELEASE-jp.md b/CHANGELOG-PRERELEASE-jp.md index caa5d7f4..edaa6a51 100644 --- a/CHANGELOG-PRERELEASE-jp.md +++ b/CHANGELOG-PRERELEASE-jp.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Fixed +- [#1558] Merge AnimatorでベースアバターのArmature内のTransformをアニメーションさせると壊れる問題を修正 ### Changed diff --git a/CHANGELOG-PRERELEASE.md b/CHANGELOG-PRERELEASE.md index 46aadf29..bfdfe29e 100644 --- a/CHANGELOG-PRERELEASE.md +++ b/CHANGELOG-PRERELEASE.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Fixed +- [#1558] Fixed an issue where Merge Animators animating transforms in the base avatar's armature would break. ### Changed diff --git a/CHANGELOG-jp.md b/CHANGELOG-jp.md index 139bc38b..c11a8c15 100644 --- a/CHANGELOG-jp.md +++ b/CHANGELOG-jp.md @@ -15,6 +15,7 @@ Modular Avatarの主な変更点をこのファイルで記録しています。 コンポーネントとマージされた場合、指定されたオブジェクトが存在しないことを検出し、参照を絶対パスとして扱うように修正 - 対象のパスにオブジェクトがある場合は、相対パスとして扱われます。安定性向上のためMerge Animatorコンポーネントと同じ  指定方法を使用することをお勧めします。 +- [#1558] Merge AnimatorでベースアバターのArmature内のTransformをアニメーションさせると壊れる問題を修正 ### Changed diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ba0180a..405efbc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Note that if there is an object in the target path, then it will be treated as a relative path. Using addressing for Play Audio behaviors consistent with Merge Animator settings is therefore recommended as it will be more robust. +- [#1558] Fixed an issue where Merge Animators animating transforms in the base avatar's armature would break. ### Changed diff --git a/Editor/MergeArmatureHook.cs b/Editor/MergeArmatureHook.cs index 48c1ee7a..28f9ce15 100644 --- a/Editor/MergeArmatureHook.cs +++ b/Editor/MergeArmatureHook.cs @@ -164,9 +164,12 @@ namespace nadena.dev.modular_avatar.core.editor { var newPath = GetReplacementPath(binding.path); - var newBinding = EditorCurveBinding.FloatCurve(newPath, binding.type, binding.propertyName); - clip.SetFloatCurve(newBinding, clip.GetFloatCurve(binding)); - clip.SetFloatCurve(binding, null); + if (newPath != binding.path) + { + var newBinding = EditorCurveBinding.FloatCurve(newPath, binding.type, binding.propertyName); + clip.SetFloatCurve(newBinding, clip.GetFloatCurve(binding)); + clip.SetFloatCurve(binding, null); + } } } } diff --git a/Editor/MeshRetargeter.cs b/Editor/MeshRetargeter.cs index 3a1e34cc..d761bb3b 100644 --- a/Editor/MeshRetargeter.cs +++ b/Editor/MeshRetargeter.cs @@ -22,13 +22,14 @@ * SOFTWARE. */ +using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; -using nadena.dev.modular_avatar.animation; using nadena.dev.modular_avatar.editor.ErrorReporting; using nadena.dev.ndmf.animator; using UnityEngine; +using Object = UnityEngine.Object; namespace nadena.dev.modular_avatar.core.editor { @@ -158,7 +159,7 @@ namespace nadena.dev.modular_avatar.core.editor // Remap any animation clips that reference this bone into its parent _pathRemapper.ReplaceObject(sourceBone.gameObject, sourceBone.transform.parent.gameObject); - UnityEngine.Object.DestroyImmediate(sourceBone.gameObject); + Object.DestroyImmediate(sourceBone.gameObject); } } } @@ -185,7 +186,7 @@ namespace nadena.dev.modular_avatar.core.editor public Mesh Retarget() { var avatarTransform = RuntimeUtil.FindAvatarTransformInParents(renderer.transform); - if (avatarTransform == null) throw new System.Exception("Could not find avatar in parents of " + renderer.name); + if (avatarTransform == null) throw new Exception("Could not find avatar in parents of " + renderer.name); var avPos = avatarTransform.position; var avRot = avatarTransform.rotation; diff --git a/UnitTests~/MergeAnimatorTests/MergeSingleTests.cs b/UnitTests~/MergeAnimatorTests/MergeSingleTests.cs index 56c10b75..8603e14a 100644 --- a/UnitTests~/MergeAnimatorTests/MergeSingleTests.cs +++ b/UnitTests~/MergeAnimatorTests/MergeSingleTests.cs @@ -1,5 +1,8 @@ #if MA_VRCSDK3_AVATARS +using System; +using System.Collections.Generic; +using System.Linq; using modular_avatar_tests; using nadena.dev.modular_avatar.animation; using nadena.dev.modular_avatar.core; @@ -7,9 +10,11 @@ using nadena.dev.modular_avatar.core.editor; using nadena.dev.ndmf; using nadena.dev.ndmf.animator; using NUnit.Framework; +using UnityEditor; using UnityEditor.Animations; using UnityEngine; using VRC.SDK3.Avatars.Components; +using AvatarProcessor = nadena.dev.ndmf.AvatarProcessor; using BuildContext = nadena.dev.ndmf.BuildContext; namespace UnitTests.MergeAnimatorTests diff --git a/UnitTests~/MergeArmatureTests/MergeArmatureTests.cs b/UnitTests~/MergeArmatureTests/MergeArmatureTests.cs index e2eed89c..e03e45a6 100644 --- a/UnitTests~/MergeArmatureTests/MergeArmatureTests.cs +++ b/UnitTests~/MergeArmatureTests/MergeArmatureTests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using modular_avatar_tests; using nadena.dev.modular_avatar.core.editor; using NUnit.Framework; @@ -7,6 +8,8 @@ using UnityEngine; using ModularAvatarMergeArmature = nadena.dev.modular_avatar.core.ModularAvatarMergeArmature; #if MA_VRCSDK3_AVATARS +using System; +using nadena.dev.modular_avatar.core; using VRC.SDK3.Avatars.Components; using VRC.SDK3.Dynamics.PhysBone.Components; #endif @@ -100,6 +103,36 @@ public class MergeArmatureTests : TestBase } } + [Test] + public void RetainsTransformLookthroughTest() + { + var root = CreatePrefab("TransformLookthrough/RetainsTransformLookthroughCurves.prefab"); + + AvatarProcessor.ProcessAvatar(root); + + var testLayer = findFxLayer(root, "test"); + var motion = (AnimationClip)testLayer.stateMachine.defaultState.motion; + + var subArmature = root.transform.GetChild(0).GetChild(0).GetChild(0); + var armaturePath = RuntimeUtil.AvatarRootPath(subArmature.gameObject); + var hipsPath = "Armature/Hips"; + + var curves = AnimationUtility.GetCurveBindings(motion) + .Select(ecb => (ecb.path, ecb.type, ecb.propertyName)) + .ToHashSet(); + var expectedCurves = new HashSet<(string, Type, string)>() + { + (armaturePath, typeof(GameObject), "m_IsActive"), + (hipsPath, typeof(Transform), "m_LocalScale.x"), + (hipsPath, typeof(Transform), "m_LocalScale.y"), + (hipsPath, typeof(Transform), "m_LocalScale.z"), + // It's not clear if we should be animating the root Armature object here, but this matches the pre-1.12 + // behavior and is therefore probably best from a compatibility perspective + ("Armature", typeof(GameObject), "m_IsActive") + }; + + Assert.That(expectedCurves, Is.EquivalentTo(curves)); + } #endif private static GameObject LoadShapell() diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough.meta b/UnitTests~/MergeArmatureTests/TransformLookthrough.meta new file mode 100644 index 00000000..d91d2324 --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: faccb10b1d8ed17468b90c521387216e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab b/UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab new file mode 100644 index 00000000..c7e9bfdc --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab @@ -0,0 +1,613 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1843281456015346592 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6463641812474994547} + m_Layer: 0 + m_Name: Hips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6463641812474994547 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843281456015346592} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3374381971321939395} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &3758816284294005516 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1946172178019366251} + - component: {fileID: 2719738530465120336} + m_Layer: 0 + m_Name: Hips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1946172178019366251 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3758816284294005516} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8614448739494005333} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &2719738530465120336 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3758816284294005516} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!1 &4031479947288985074 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4831129360975791387} + - component: {fileID: 1311080927487844401} + - component: {fileID: 2689763916510653291} + m_Layer: 0 + m_Name: Merge + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4831129360975791387 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4031479947288985074} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8614448739494005333} + m_Father: {fileID: 7077471747533883274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1311080927487844401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4031479947288985074} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3} + m_Name: + m_EditorClassIdentifier: + animator: {fileID: 9100000, guid: 19d8bfd755e0f6b4581b4da4cfd2cc70, type: 2} + layerType: 5 + deleteAttachedAnimator: 1 + pathMode: 0 + matchAvatarWriteDefaults: 0 + relativePathRoot: + referencePath: + targetObject: {fileID: 0} + layerPriority: 0 + mergeAnimatorMode: 0 +--- !u!95 &2689763916510653291 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4031479947288985074} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 19d8bfd755e0f6b4581b4da4cfd2cc70, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7548675428724350735 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8614448739494005333} + - component: {fileID: 5161307179301238676} + m_Layer: 0 + m_Name: Armature.1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8614448739494005333 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7548675428724350735} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1946172178019366251} + m_Father: {fileID: 4831129360975791387} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5161307179301238676 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7548675428724350735} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2df373bf91cf30b4bbd495e11cb1a2ec, type: 3} + m_Name: + m_EditorClassIdentifier: + mergeTarget: + referencePath: Armature + targetObject: {fileID: 8076956779391437068} + prefix: + suffix: + legacyLocked: 0 + LockMode: 2 + mangleNames: 1 +--- !u!1 &8076956779391437068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3374381971321939395} + m_Layer: 0 + m_Name: Armature + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3374381971321939395 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8076956779391437068} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6463641812474994547} + m_Father: {fileID: 7077471747533883274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &9053292826705437702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7077471747533883274} + - component: {fileID: 635084532505951628} + - component: {fileID: 6421879640933021628} + - component: {fileID: 5677554079973629394} + m_Layer: 0 + m_Name: RetainsTransformLookthroughCurves + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7077471747533883274 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9053292826705437702} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.12184324, y: 0.7495848, z: -0.22149613} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3374381971321939395} + - {fileID: 4831129360975791387} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &635084532505951628 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9053292826705437702} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &6421879640933021628 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9053292826705437702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: + ViewPosition: {x: 0, y: 1.6, z: 0.2} + Animations: 0 + ScaleIPD: 1 + lipSync: 0 + lipSyncJawBone: {fileID: 0} + lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1} + lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1} + VisemeSkinnedMesh: {fileID: 0} + MouthOpenBlendShapeName: Facial_Blends.Jaw_Down + VisemeBlendShapes: [] + unityVersion: + portraitCameraPositionOffset: {x: 0, y: 0, z: 0} + portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} + networkIDs: [] + customExpressions: 0 + expressionsMenu: {fileID: 0} + expressionParameters: {fileID: 0} + enableEyeLook: 0 + customEyeLookSettings: + eyeMovement: + confidence: 0.5 + excitement: 0.5 + leftEye: {fileID: 0} + rightEye: {fileID: 0} + eyesLookingStraight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingUp: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingDown: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingLeft: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingRight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidType: 0 + upperLeftEyelid: {fileID: 0} + upperRightEyelid: {fileID: 0} + lowerLeftEyelid: {fileID: 0} + lowerRightEyelid: {fileID: 0} + eyelidsDefault: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsClosed: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingUp: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingDown: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsSkinnedMesh: {fileID: 0} + eyelidsBlendshapes: + customizeAnimationLayers: 0 + baseAnimationLayers: + - isEnabled: 0 + type: 0 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 4 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 5 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + specialAnimationLayers: + - isEnabled: 0 + type: 6 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 7 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 8 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + AnimationPreset: {fileID: 0} + animationHashSet: [] + autoFootsteps: 1 + autoLocomotion: 1 + collider_head: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_torso: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} +--- !u!114 &5677554079973629394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9053292826705437702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + launchedFromSDKPipeline: 0 + completedSDKPipeline: 0 + blueprintId: + contentType: 0 + assetBundleUnityVersion: + fallbackStatus: 0 diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab.meta b/UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab.meta new file mode 100644 index 00000000..bac9ef1d --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough/RetainsTransformLookthroughCurves.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5d7fbba0f7a314c4ba0cb0dcd455dd5b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller b/UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller new file mode 100644 index 00000000..4d637e6b --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller @@ -0,0 +1,72 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-1268133539673746559 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: test + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 72c58dde7ac8c6741b333a51e1aff2c4, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ac + serializedVersion: 5 + m_AnimatorParameters: [] + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: test + m_StateMachine: {fileID: 5303123724936942604} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &5303123724936942604 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: test + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -1268133539673746559} + m_Position: {x: 440, y: 110, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -1268133539673746559} diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller.meta b/UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller.meta new file mode 100644 index 00000000..a3850a9c --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough/ac.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 19d8bfd755e0f6b4581b4da4cfd2cc70 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim b/UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim new file mode 100644 index 00000000..07268baf --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim @@ -0,0 +1,192 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: test + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0.5, y: 0.5, z: 0.5} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Armature.1/Hips + m_FloatCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_IsActive + path: Armature.1 + classID: 1 + script: {fileID: 0} + flags: 0 + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 1593464098 + attribute: 2086281974 + script: {fileID: 0} + typeID: 1 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2711589869 + attribute: 3 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_IsActive + path: Armature.1 + classID: 1 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.5 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalScale.x + path: Armature.1/Hips + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.5 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalScale.y + path: Armature.1/Hips + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.5 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalScale.z + path: Armature.1/Hips + classID: 4 + script: {fileID: 0} + flags: 0 + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim.meta b/UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim.meta new file mode 100644 index 00000000..46b83452 --- /dev/null +++ b/UnitTests~/MergeArmatureTests/TransformLookthrough/test.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 72c58dde7ac8c6741b333a51e1aff2c4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: