chore: Add AnimateAddedBones test

This commit is contained in:
bd_ 2023-01-06 23:45:10 +09:00
parent 85676c5fbf
commit f64f00e2d3
12 changed files with 122 additions and 37 deletions

View File

@ -7,7 +7,7 @@ AnimatorStateMachine:
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: Base Layer m_Name: merged
m_ChildStates: m_ChildStates:
- serializedVersion: 1 - serializedVersion: 1
m_State: {fileID: 2149298753904408782} m_State: {fileID: 2149298753904408782}
@ -33,7 +33,7 @@ AnimatorController:
m_AnimatorParameters: [] m_AnimatorParameters: []
m_AnimatorLayers: m_AnimatorLayers:
- serializedVersion: 5 - serializedVersion: 5
m_Name: Base Layer m_Name: merged
m_StateMachine: {fileID: -9015797059024545987} m_StateMachine: {fileID: -9015797059024545987}
m_Mask: {fileID: 0} m_Mask: {fileID: 0}
m_Motions: [] m_Motions: []

View File

@ -0,0 +1,48 @@
using System.Linq;
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
namespace modular_avatar_tests.AnimateAddedBones
{
/// <summary>
/// This test verifies that merged animations which affect a bone newly added to an armature by Merge Armature
/// are properly adjusted for the new bone path.
/// </summary>
public class AnimateAddedBones : TestBase
{
[Test]
public void AnimatesAddedBones()
{
var prefab = CreatePrefab("AnimateAddedBones.prefab");
AvatarProcessor.ProcessAvatar(prefab);
var fx = prefab.GetComponent<VRCAvatarDescriptor>().baseAnimationLayers
.FirstOrDefault(l => l.type == VRCAvatarDescriptor.AnimLayerType.FX);
Assert.NotNull(fx);
var ac = fx.animatorController as AnimatorController;
Assert.NotNull(ac);
Assert.False(fx.isDefault);
var layer = ac.layers.FirstOrDefault(l => l.name == "merged");
Assert.NotNull(layer);
var state = layer.stateMachine.states[0].state;
Assert.NotNull(state);
var motion = state.motion as AnimationClip;
Assert.NotNull(motion);
var cubeObject = prefab.transform.Find("Armature/Hips").GetChild(0).gameObject;
Assert.True(cubeObject.name.StartsWith("Cube$"));
var binding =
EditorCurveBinding.FloatCurve("Armature/Hips/" + cubeObject.name, typeof(Transform),
"localEulerAnglesRaw.x");
Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding));
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ef5030710e5f4bcca49b82ef9307fb11
timeCreated: 1673015480

View File

@ -9,42 +9,8 @@ using VRC.SDK3.Avatars.Components;
namespace modular_avatar_tests namespace modular_avatar_tests
{ {
public class PathMappingTest public class PathMappingTest : TestBase
{ {
private List<GameObject> objects;
[SetUp]
public void Setup()
{
objects = new List<GameObject>();
}
[TearDown]
public void Teardown()
{
foreach (var obj in objects)
{
Object.DestroyImmediate(obj);
}
}
GameObject CreateRoot(string name)
{
var go = new GameObject(name);
objects.Add(go);
// Needed for avatar path finding functions to work properly
go.AddComponent(typeof(VRCAvatarDescriptor));
return go;
}
GameObject CreateChild(GameObject parent, string name)
{
var go = new GameObject(name);
go.transform.parent = parent.transform;
objects.Add(go);
return go;
}
[Test] [Test]
public void TracksSimpleRenames() public void TracksSimpleRenames()
{ {

View File

@ -0,0 +1,65 @@
using System.Collections.Generic;
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
namespace modular_avatar_tests
{
public class TestBase
{
private List<GameObject> objects;
[SetUp]
public void Setup()
{
objects = new List<GameObject>();
}
[TearDown]
public void Teardown()
{
foreach (var obj in objects)
{
Object.DestroyImmediate(obj);
}
}
[OneTimeTearDown]
void Cleanup()
{
Util.DeleteTemporaryAssets();
}
protected GameObject CreateRoot(string name)
{
var go = new GameObject(name);
objects.Add(go);
// Needed for avatar path finding functions to work properly
go.AddComponent(typeof(VRCAvatarDescriptor));
return go;
}
protected GameObject CreateChild(GameObject parent, string name)
{
var go = new GameObject(name);
go.transform.parent = parent.transform;
objects.Add(go);
return go;
}
protected GameObject CreatePrefab(string relPath)
{
var prefabRoot = "Assets/_ModularAvatar/EditModeTests/" + GetType().Name + "/";
var prefabPath = prefabRoot + relPath;
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
Assert.NotNull(prefab, "Missing test prefab {0}", prefabPath);
var go = Object.Instantiate(prefab);
objects.Add(go);
return go;
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d3babb39034641909c515570601d049f
timeCreated: 1673015522