(PACKAGING) Change the folder structure for package format
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad91af824b32bed4c8a08541bef67cfe
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f30100b4c328384b893342ed6dcdb02
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c745f3802e61ded458735b8e5cf42e16
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "AacEditModeTests",
|
||||
"references": [
|
||||
"UnityEngine.TestRunner",
|
||||
"UnityEditor.TestRunner",
|
||||
"AnimatorAsCode.V1"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": true,
|
||||
"precompiledReferences": [
|
||||
"nunit.framework.dll",
|
||||
"VRCSDKBase.dll",
|
||||
"VRCSDK3A.dll"
|
||||
],
|
||||
"autoReferenced": false,
|
||||
"defineConstraints": [
|
||||
"UNITY_INCLUDE_TESTS"
|
||||
],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2a8152e7670c1814abad041ff22b7994
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using AnimatorAsCode.V1;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1.EditMode
|
||||
{
|
||||
public abstract class AbstractSimpleSingleLayerAnimatorInternalEditModeAC
|
||||
{
|
||||
protected GameObject _root;
|
||||
private AnimatorController _container;
|
||||
private string _containerPath;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_root = new GameObject("Root");
|
||||
_container = new AnimatorController();
|
||||
_containerPath = $"Assets/temp_aac_test__{Guid.NewGuid()}.asset";
|
||||
AssetDatabase.CreateAsset(_container, _containerPath);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
Object.DestroyImmediate(_root);
|
||||
AssetDatabase.DeleteAsset(_containerPath);
|
||||
_root = null;
|
||||
_container = null;
|
||||
_containerPath = null;
|
||||
}
|
||||
|
||||
protected AacFlBase TestAac()
|
||||
{
|
||||
return AacV1.Create(new AacConfiguration
|
||||
{
|
||||
AnimatorRoot = _root.transform,
|
||||
AssetContainer = _container,
|
||||
AssetKey = "None",
|
||||
DefaultsProvider = new AacDefaultsProvider(),
|
||||
SystemName = "Test",
|
||||
DefaultValueRoot = _root.transform
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 16d5c7dc8b974daf8719f0d02f1e3fb3
|
||||
timeCreated: 1671470027
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4640dd95c9fe21e43b64f04e582c080d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d910756d511fe0b4996d2626cf6fd301
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+96
@@ -0,0 +1,96 @@
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Assert = UnityEngine.Assertions.Assert;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode
|
||||
{
|
||||
public class AIACAnimatorWideTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_should_override_bool()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBool = fx.BoolParameter("MyBool");
|
||||
first.TransitionsTo(second).When(myBool.IsTrue());
|
||||
fx.OverrideValue(myBool, true);
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_override_int()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myInt = fx.IntParameter("MyInt");
|
||||
first.TransitionsTo(second).When(myInt.IsGreaterThan(1));
|
||||
fx.OverrideValue(myInt, 2);
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_override_float()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myFloat = fx.FloatParameter("MyFloat");
|
||||
first.TransitionsTo(second).When(myFloat.IsGreaterThan(0.49f));
|
||||
fx.OverrideValue(myFloat, 0.5f);
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
private static AnimatorStateInfo Info0(Animator animator)
|
||||
{
|
||||
return animator.GetCurrentAnimatorStateInfo(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4b1c43dad69a46c697e2aa9ed5055e63
|
||||
timeCreated: 1671493684
|
||||
+407
@@ -0,0 +1,407 @@
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Assert = UnityEngine.Assertions.Assert;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode
|
||||
{
|
||||
public class AIACBoolTransitionTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_should_transition_when_bool_is_true()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBool = fx.BoolParameter("MyBool");
|
||||
first.TransitionsTo(second).When(myBool.IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBool", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_bool_is_false()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBool = fx.BoolParameter("MyBool");
|
||||
first.TransitionsTo(second).When(myBool.IsFalse());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBool", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBool", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_both_bools_are_true()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBoolOne = fx.BoolParameter("MyBoolOne");
|
||||
var myBoolTwo = fx.BoolParameter("MyBoolTwo");
|
||||
first.TransitionsTo(second).When(myBoolOne.IsTrue()).And(myBoolTwo.IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolOne", false);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 3
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_second_bool_is_true()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBoolOne = fx.BoolParameter("MyBoolOne");
|
||||
var myBoolTwo = fx.BoolParameter("MyBoolTwo");
|
||||
first.TransitionsTo(second).When(myBoolOne.IsTrue()).Or().When(myBoolTwo.IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_group_of_bools_are_true()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo");
|
||||
first.TransitionsTo(second).When(myBools.AreTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_group_of_bools_are_false()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo");
|
||||
first.TransitionsTo(second).When(myBools.AreFalse());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolOne", false);
|
||||
animator.SetBool("MyBoolTwo", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_group_of_bools_are_true_except_one_of_them()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo", "MyBoolThree");
|
||||
first.TransitionsTo(second).When(myBools.AreTrueExcept(fx.BoolParameter("MyBoolThree")));
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.SetBool("MyBoolThree", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.SetBool("MyBoolThree", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_group_of_bools_are_true_except_another_group_of_them()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo", "MyBoolThree", "MyBoolFour");
|
||||
first.TransitionsTo(second).When(myBools.AreTrueExcept(fx.BoolParameters("MyBoolThree", "MyBoolFour")));
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.SetBool("MyBoolThree", true);
|
||||
animator.SetBool("MyBoolFour", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.SetBool("MyBoolThree", false);
|
||||
animator.SetBool("MyBoolFour", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_any_of_group_of_bools_is_true()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo");
|
||||
first.TransitionsTo(second).When(myBools.IsAnyTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_any_of_group_of_bools_is_false()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo");
|
||||
first.TransitionsTo(second).When(myBools.IsAnyFalse());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolTwo", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_when_any_of_group_of_bools_is_true_and_another_bool_is_also_true()
|
||||
{
|
||||
var controller = new AnimatorController();
|
||||
var aac = TestAac();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var myBools = fx.BoolParameters("MyBoolOne", "MyBoolTwo");
|
||||
var myMandatoryBool = fx.BoolParameter("MyBoolMandatory");
|
||||
first.TransitionsTo(second).When(myBools.IsAnyTrue()).And(myMandatoryBool.IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 2
|
||||
animator.SetBool("MyBoolOne", true);
|
||||
animator.SetBool("MyBoolTwo", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 3
|
||||
animator.SetBool("MyBoolOne", false);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 4
|
||||
animator.SetBool("MyBoolOne", false);
|
||||
animator.SetBool("MyBoolTwo", false);
|
||||
animator.SetBool("MyBoolMandatory", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 5
|
||||
animator.SetBool("MyBoolOne", false);
|
||||
animator.SetBool("MyBoolTwo", true);
|
||||
animator.SetBool("MyBoolMandatory", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
private static AnimatorStateInfo Info0(Animator animator)
|
||||
{
|
||||
return animator.GetCurrentAnimatorStateInfo(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 922049111725f1a4ebdd237cddadd542
|
||||
timeCreated: 1671448209
|
||||
+198
@@ -0,0 +1,198 @@
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Assert = UnityEngine.Assertions.Assert;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode
|
||||
{
|
||||
public class AIACStateTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_should_create_layer_with_state()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var init = fx.NewState("Init");
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
|
||||
// Verify
|
||||
Assert.AreEqual(1, animator.layerCount);
|
||||
var info = animator.GetCurrentAnimatorStateInfo(0);
|
||||
Assert.IsTrue(info.IsName("Init"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_cause_write_defaults_OFF_to_preserve_animated_object_state()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var child = new GameObject
|
||||
{
|
||||
name = "Child",
|
||||
transform = { parent = _root.transform }
|
||||
};
|
||||
var first = fx.NewState("First")
|
||||
.WithWriteDefaultsSetTo(false)
|
||||
.WithAnimation(aac.NewClip().Toggling(child, false));
|
||||
var second = fx.NewState("Second")
|
||||
.WithWriteDefaultsSetTo(false);
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
animator.Update(0f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
Assert.IsFalse(child.gameObject.activeSelf);
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
Assert.IsFalse(child.gameObject.activeSelf);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_cause_write_defaults_ON_to_revert_animated_object_state()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var child = new GameObject
|
||||
{
|
||||
name = "Child",
|
||||
transform = { parent = _root.transform }
|
||||
};
|
||||
var first = fx.NewState("First")
|
||||
.WithWriteDefaultsSetTo(true)
|
||||
.WithAnimation(aac.NewClip().Toggling(child, false));
|
||||
var second = fx.NewState("Second")
|
||||
.WithWriteDefaultsSetTo(true);
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
animator.Update(0f);
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
Assert.IsFalse(child.gameObject.activeSelf);
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
Assert.IsTrue(child.gameObject.activeSelf); // The object turns back on
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_apply_motion_time()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var child = new GameObject
|
||||
{
|
||||
name = "Child",
|
||||
transform = { parent = _root.transform }
|
||||
};
|
||||
fx.NewState("First")
|
||||
.WithAnimation(aac.NewClip().Animating(clip =>
|
||||
{
|
||||
clip.Animates(child.transform, "m_LocalScale.x").WithSecondsUnit(keyframes => keyframes.Linear(0f, 0f).Linear(1f, 10f));
|
||||
}))
|
||||
.MotionTime(fx.FloatParameter("MyFloat"));
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
animator.SetFloat("MyFloat", 0.5f);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.AreEqual(5f, child.transform.localScale.x);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_apply_speed()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var child = new GameObject
|
||||
{
|
||||
name = "Child",
|
||||
transform = { parent = _root.transform }
|
||||
};
|
||||
fx.NewState("First")
|
||||
.WithAnimation(aac.NewClip().Animating(clip =>
|
||||
{
|
||||
clip.Animates(child.transform, "m_LocalScale.x").WithSecondsUnit(keyframes => keyframes.Linear(0f, 0f).Linear(1f, 10f));
|
||||
}))
|
||||
.WithSpeed(fx.FloatParameter("MyFloat"));
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
animator.SetFloat("MyFloat", 2f); // At double the speed
|
||||
animator.Update(15 / 60f); // Advance by a quarter of a second
|
||||
Assert.AreEqual(5f, child.transform.localScale.x);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_apply_speed_set_to_constant()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var child = new GameObject
|
||||
{
|
||||
name = "Child",
|
||||
transform = { parent = _root.transform }
|
||||
};
|
||||
fx.NewState("First")
|
||||
.WithAnimation(aac.NewClip().Animating(clip =>
|
||||
{
|
||||
clip.Animates(child.transform, "m_LocalScale.x").WithSecondsUnit(keyframes => keyframes.Linear(0f, 0f).Linear(1f, 10f));
|
||||
}))
|
||||
.WithSpeedSetTo(2f); // At double the speed
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
animator.Update(15 / 60f); // Advance by a quarter of a second
|
||||
Assert.AreEqual(5f, child.transform.localScale.x);
|
||||
}
|
||||
|
||||
private static AnimatorStateInfo Info0(Animator animator)
|
||||
{
|
||||
return animator.GetCurrentAnimatorStateInfo(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 82960f1d631a8964f8ae1d774c729625
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+205
@@ -0,0 +1,205 @@
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Assert = UnityEngine.Assertions.Assert;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode
|
||||
{
|
||||
public class AIACSubStateMachineTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_should_transition_to_a_SSM()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var ssm = fx.NewSubStateMachine("SSM");
|
||||
ssm.NewState("SSM One");
|
||||
|
||||
first.TransitionsTo(ssm).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM One"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_exit_out_of_a_SSM()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
var ssm = fx.NewSubStateMachine("SSM");
|
||||
var one = ssm.NewState("SSM One");
|
||||
|
||||
first.TransitionsTo(ssm).AfterAnimationFinishes();
|
||||
one.Exits().AfterAnimationFinishes();
|
||||
ssm.TransitionsTo(second);
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM One"));
|
||||
|
||||
// Frame 2
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_restart_the_SSM()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var ssm = fx.NewSubStateMachine("SSM");
|
||||
var one = ssm.NewState("SSM One");
|
||||
var two = ssm.NewState("SSM Two");
|
||||
|
||||
first.TransitionsTo(ssm).AfterAnimationFinishes();
|
||||
one.TransitionsTo(two).AfterAnimationFinishes();
|
||||
two.Exits().AfterAnimationFinishes();
|
||||
ssm.Restarts();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM One"));
|
||||
|
||||
// Frame 2
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM Two"));
|
||||
|
||||
// Frame 3
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM One"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_enter_a_SSM_conditionally__Entry_created_through_SSM_instance()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var ssm = fx.NewSubStateMachine("SSM");
|
||||
ssm.NewState("SSM One");
|
||||
|
||||
var two = ssm.NewState("SSM Two");
|
||||
first.TransitionsTo(ssm).AfterAnimationFinishes();
|
||||
ssm.EntryTransitionsTo(two).When(fx.BoolParameter("MyBool").IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBool", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM Two"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_enter_a_SSM_conditionally__Entry_created_through_state_instance()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var ssm = fx.NewSubStateMachine("SSM");
|
||||
ssm.NewState("SSM One");
|
||||
|
||||
var two = ssm.NewState("SSM Two");
|
||||
first.TransitionsTo(ssm).AfterAnimationFinishes();
|
||||
two.TransitionsFromEntry().When(fx.BoolParameter("MyBool").IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBool", true);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM Two"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_enter_the_default_SSM_entry_state_when_conditions_do_not_pass()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var ssm = fx.NewSubStateMachine("SSM");
|
||||
ssm.NewState("SSM One");
|
||||
|
||||
var two = ssm.NewState("SSM Two");
|
||||
first.TransitionsTo(ssm).AfterAnimationFinishes();
|
||||
ssm.EntryTransitionsTo(two).When(fx.BoolParameter("MyBool").IsTrue());
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.SetBool("MyBool", false);
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("SSM One"));
|
||||
}
|
||||
|
||||
private static AnimatorStateInfo Info0(Animator animator)
|
||||
{
|
||||
return animator.GetCurrentAnimatorStateInfo(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f4c7c62171d461fb2618bc0c52ba098
|
||||
timeCreated: 1671454674
|
||||
+158
@@ -0,0 +1,158 @@
|
||||
using AnimatorAsCode.V1;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Assert = UnityEngine.Assertions.Assert;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode
|
||||
{
|
||||
public class AIACTransitionFunctionsTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_should_transition_after_animation_finishes()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var second = fx.NewState("Second");
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0
|
||||
Assert.IsTrue(Info0(animator).IsName("First"));
|
||||
|
||||
// Frame 1
|
||||
animator.Update(1 / 60f);
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_after_animation_finishes_in_2_frames()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.WithAnimation(aac.DummyClipLasting(2, AacFlUnit.Frames));
|
||||
var second = fx.NewState("Second");
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame 0 & 1
|
||||
for (var iter = 0; iter < 2; iter++)
|
||||
{
|
||||
Assert.IsTrue(Info0(animator).IsName("First"), $"In iteration {iter}");
|
||||
animator.Update(1 / 60f);
|
||||
}
|
||||
|
||||
// Frame 2
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_after_animation_finishes_in_3_frames()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.WithAnimation(aac.DummyClipLasting(3, AacFlUnit.Frames));
|
||||
var second = fx.NewState("Second");
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frames [0:2]
|
||||
for (var iter = 0; iter < 3; iter++)
|
||||
{
|
||||
Assert.IsTrue(Info0(animator).IsName("First"), $"In iteration {iter}");
|
||||
animator.Update(1 / 60f);
|
||||
}
|
||||
|
||||
// Frame 3
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_after_animation_finishes_in_59_frames()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.WithAnimation(aac.DummyClipLasting(59, AacFlUnit.Frames));
|
||||
var second = fx.NewState("Second");
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame [0:59]
|
||||
for (var iter = 0; iter < 59; iter++)
|
||||
{
|
||||
Assert.IsTrue(Info0(animator).IsName("First"), $"In iteration {iter}");
|
||||
animator.Update(1 / 60f);
|
||||
}
|
||||
|
||||
// Frame 60
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_should_transition_after_animation_finishes_in_60_frames_with_plus_one_error()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = new AnimatorController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.WithAnimation(aac.DummyClipLasting(60, AacFlUnit.Frames));
|
||||
var second = fx.NewState("Second");
|
||||
first.TransitionsTo(second).AfterAnimationFinishes();
|
||||
|
||||
var animator = _root.AddComponent<Animator>();
|
||||
animator.runtimeAnimatorController = controller;
|
||||
animator.enabled = false;
|
||||
|
||||
// Verify
|
||||
// Frame [0:61] (!!! !!!)
|
||||
var error = 1;
|
||||
for (var iter = 0; iter < 60 + error; iter++)
|
||||
{
|
||||
Assert.IsTrue(Info0(animator).IsName("First"), $"In iteration {iter}");
|
||||
animator.Update(1 / 60f);
|
||||
}
|
||||
|
||||
// Frame 62
|
||||
Assert.IsTrue(Info0(animator).IsName("Second"));
|
||||
}
|
||||
|
||||
private static AnimatorStateInfo Info0(Animator animator)
|
||||
{
|
||||
return animator.GetCurrentAnimatorStateInfo(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1cef528fbc6d417d8fa3514caf3ed5c1
|
||||
timeCreated: 1671447626
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "AacPlayModeTests",
|
||||
"references": [
|
||||
"UnityEngine.TestRunner",
|
||||
"UnityEditor.TestRunner",
|
||||
"AnimatorAsCode.V1",
|
||||
"AnimatorAsCode.V1.VRC"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": true,
|
||||
"precompiledReferences": [
|
||||
"nunit.framework.dll",
|
||||
"VRCSDKBase.dll",
|
||||
"VRCSDK3A.dll"
|
||||
],
|
||||
"autoReferenced": false,
|
||||
"defineConstraints": [
|
||||
"UNITY_INCLUDE_TESTS"
|
||||
],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 22f62403ac909d54983bb7a357420cfe
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using AnimatorAsCode.V1;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode
|
||||
{
|
||||
public abstract class AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
protected GameObject _root;
|
||||
private AnimatorController _container;
|
||||
private string _containerPath;
|
||||
private AnimatorController _controller;
|
||||
private string _controllerPath;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_root = new GameObject("Root");
|
||||
_container = new AnimatorController();
|
||||
_containerPath = $"Assets/temp_aac_test__container_{Guid.NewGuid()}.asset";
|
||||
AssetDatabase.CreateAsset(_container, _containerPath);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
Object.Destroy(_root);
|
||||
AssetDatabase.DeleteAsset(_containerPath);
|
||||
if (_controllerPath != null) AssetDatabase.DeleteAsset(_controllerPath);
|
||||
_root = null;
|
||||
_container = null;
|
||||
_containerPath = null;
|
||||
_controller = null;
|
||||
_controllerPath = null;
|
||||
}
|
||||
|
||||
protected AnimatorController NewPersistentController()
|
||||
{
|
||||
_controller = new AnimatorController();
|
||||
_controllerPath = $"Assets/temp_aac_test__ctrl_{Guid.NewGuid()}.asset";
|
||||
AssetDatabase.CreateAsset(_controller, _controllerPath);
|
||||
return _controller;
|
||||
}
|
||||
|
||||
protected AacFlBase TestAac()
|
||||
{
|
||||
return AacV1.Create(new AacConfiguration
|
||||
{
|
||||
AnimatorRoot = _root.transform,
|
||||
AssetContainer = _container,
|
||||
AssetKey = "None",
|
||||
DefaultsProvider = new AacDefaultsProvider(),
|
||||
SystemName = "Test",
|
||||
DefaultValueRoot = _root.transform
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f1941d210754dfd911bed075ed1b01d
|
||||
timeCreated: 1671447669
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e7156157f9fa4cb289a54f1b57f39f3f
|
||||
timeCreated: 1671471108
|
||||
+430
@@ -0,0 +1,430 @@
|
||||
using AnimatorAsCode.V1.VRC;
|
||||
using NUnit.Framework;
|
||||
using VRC.SDK3.Avatars.Components;
|
||||
using VRC.SDKBase;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode.GenerationTests
|
||||
{
|
||||
public class AIACVRCExtensionsDriverGenerationTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_sets_bool_to_true()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.Drives(fx.BoolParameter("MyBool"), true);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyBool", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Set, eParameter.type);
|
||||
Assert.AreEqual(1f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_sets_bool_to_false()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.Drives(fx.BoolParameter("MyBool"), false);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyBool", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Set, eParameter.type);
|
||||
Assert.AreEqual(0f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_sets_int_to_300()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.Drives(fx.IntParameter("MyInt"), 300);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyInt", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Set, eParameter.type);
|
||||
Assert.AreEqual(300f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_sets_float_to_400_point_56()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.Drives(fx.FloatParameter("MyFloat"), 400.56f);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloat", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Set, eParameter.type);
|
||||
Assert.AreEqual(400.56f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_increases_int_by_2()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingIncreases(fx.IntParameter("MyInt"), 2);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyInt", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Add, eParameter.type);
|
||||
Assert.AreEqual(2f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_decreases_int_by_2_through_adding_its_opposite()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingDecreases(fx.IntParameter("MyInt"), 2);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyInt", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Add, eParameter.type);
|
||||
Assert.AreEqual(-2f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_increases_float_by_3_point_4()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingIncreases(fx.FloatParameter("MyFloat"), 3.4f);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloat", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Add, eParameter.type);
|
||||
Assert.AreEqual(3.4f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_decreases_float_by_3_point_4_through_adding_its_opposite()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingDecreases(fx.FloatParameter("MyFloat"), 3.4f);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloat", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Add, eParameter.type);
|
||||
Assert.AreEqual(-3.4f, eParameter.value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_copies_a_bool_to_another_bool()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingCopies(fx.BoolParameter("MyBoolSource"), fx.BoolParameter("MyBoolDestination"));
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyBoolDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsFalse(eParameter.convertRange);
|
||||
Assert.AreEqual("MyBoolSource", eParameter.source);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_copies_a_bool_to_an_int()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingCopies(fx.BoolParameter("MyBoolSource"), fx.IntParameter("MyIntDestination"));
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyIntDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsFalse(eParameter.convertRange);
|
||||
Assert.AreEqual("MyBoolSource", eParameter.source);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_copies_a_bool_to_a_float()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingCopies(fx.BoolParameter("MyBoolSource"), fx.FloatParameter("MyFloatDestination"));
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloatDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsFalse(eParameter.convertRange);
|
||||
Assert.AreEqual("MyBoolSource", eParameter.source);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_copies_an_int_to_another_int()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingCopies(fx.IntParameter("MyIntSource"), fx.IntParameter("MyIntDestination"));
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyIntDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsFalse(eParameter.convertRange);
|
||||
Assert.AreEqual("MyIntSource", eParameter.source);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_copies_a_float_to_another_float()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingCopies(fx.FloatParameter("MyFloatSource"), fx.FloatParameter("MyFloatDestination"));
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloatDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsFalse(eParameter.convertRange);
|
||||
Assert.AreEqual("MyFloatSource", eParameter.source);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_remaps_a_bool_to_another_bool_to_invert_its_value()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingRemaps(fx.BoolParameter("MyBoolSource"), false, true, fx.BoolParameter("MyBoolDestination"), true, false);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyBoolDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsTrue(eParameter.convertRange);
|
||||
Assert.AreEqual("MyBoolSource", eParameter.source);
|
||||
Assert.AreEqual(0f, eParameter.sourceMin);
|
||||
Assert.AreEqual(1f, eParameter.sourceMax);
|
||||
Assert.AreEqual(1f, eParameter.destMin);
|
||||
Assert.AreEqual(0f, eParameter.destMax);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_remaps_an_int_percentage_to_a_joystick_float()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingRemaps(fx.IntParameter("MyIntSource"), 0, 100, fx.FloatParameter("MyFloatDestination"), -1f, 1f);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloatDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsTrue(eParameter.convertRange);
|
||||
Assert.AreEqual("MyIntSource", eParameter.source);
|
||||
Assert.AreEqual(0f, eParameter.sourceMin);
|
||||
Assert.AreEqual(100f, eParameter.sourceMax);
|
||||
Assert.AreEqual(-1f, eParameter.destMin);
|
||||
Assert.AreEqual(1f, eParameter.destMax);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_driver_that_remaps_an_analog_float_to_an_inverse_joystick_float()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.DrivingRemaps(fx.FloatParameter("MyFloatSource"), 0, 1f, fx.FloatParameter("MyFloatDestination"), 1f, -1f);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAvatarParameterDriver)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAvatarParameterDriver), eBehaviour.GetType());
|
||||
Assert.AreEqual(1, eBehaviour.parameters.Count);
|
||||
|
||||
var eParameter = eBehaviour.parameters[0];
|
||||
Assert.AreEqual("MyFloatDestination", eParameter.name);
|
||||
Assert.AreEqual(VRC_AvatarParameterDriver.ChangeType.Copy, eParameter.type);
|
||||
Assert.IsTrue(eParameter.convertRange);
|
||||
Assert.AreEqual("MyFloatSource", eParameter.source);
|
||||
Assert.AreEqual(0f, eParameter.sourceMin);
|
||||
Assert.AreEqual(1f, eParameter.sourceMax);
|
||||
Assert.AreEqual(1f, eParameter.destMin);
|
||||
Assert.AreEqual(-1f, eParameter.destMax);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1445919b64254b28a3330b2111691f7c
|
||||
timeCreated: 1671469798
|
||||
+431
@@ -0,0 +1,431 @@
|
||||
using AnimatorAsCode.V1.VRC;
|
||||
using NUnit.Framework;
|
||||
using VRC.SDK3.Avatars.Components;
|
||||
using VRC.SDKBase;
|
||||
|
||||
namespace av3_animator_as_code.Tests.V1VRC.PlayMode.GenerationTests
|
||||
{
|
||||
public class AIACVRCExtensionsMiscGenerationTest : AbstractSimpleSingleLayerAIAC
|
||||
{
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_tracks_head()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Head;
|
||||
first.TrackingTracks(whichElement);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Tracking, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_animates_head()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Head;
|
||||
first.TrackingAnimates(whichElement);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_head_to_tracking()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Head;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Tracking);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Tracking, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_Head_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Head;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_LeftHand_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.LeftHand;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_RightHand_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.RightHand;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_Hip_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Hip;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_LeftFoot_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.LeftFoot;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_RightFoot_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.RightFoot;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_LeftFingers_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.LeftFingers;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_RightFingers_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.RightFingers;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_Eyes_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Eyes;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_Mouth_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
var whichElement = AacAv3.Av3TrackingElement.Mouth;
|
||||
first.TrackingSets(whichElement, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingMouth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void It_generates_a_tracking_that_sets_Head_and_Both_Hands_to_animation()
|
||||
{
|
||||
var aac = TestAac();
|
||||
var controller = NewPersistentController();
|
||||
var fx = aac.CreateMainArbitraryControllerLayer(controller);
|
||||
|
||||
// Exercise
|
||||
var first = fx.NewState("First");
|
||||
first.TrackingSets(AacAv3.Av3TrackingElement.Head, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
first.TrackingSets(AacAv3.Av3TrackingElement.LeftHand, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
first.TrackingSets(AacAv3.Av3TrackingElement.RightHand, VRC_AnimatorTrackingControl.TrackingType.Animation);
|
||||
|
||||
// Verify
|
||||
var eState = controller.layers[0].stateMachine.states[0].state;
|
||||
Assert.AreEqual(1, eState.behaviours.Length);
|
||||
|
||||
var eBehaviour = (VRCAnimatorTrackingControl)eState.behaviours[0];
|
||||
Assert.AreEqual(typeof(VRCAnimatorTrackingControl), eBehaviour.GetType());
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingHead);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingLeftHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.Animation, eBehaviour.trackingRightHand);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingHip);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFoot);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingLeftFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingRightFingers);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingEyes);
|
||||
Assert.AreEqual(VRC_AnimatorTrackingControl.TrackingType.NoChange, eBehaviour.trackingMouth);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89d6538a829c478d894320a1b1830359
|
||||
timeCreated: 1671494253
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "dev.hai-vr.animator-as-code.v1.base.test",
|
||||
"displayName": "(DEV) Animator As Code - Tests",
|
||||
"version": "1.0.9901",
|
||||
"unity": "2019.4",
|
||||
"description": "dev.hai-vr.animator-as-code.v1.base.test",
|
||||
"vrchatVersion" : "2022.1.1",
|
||||
"author" : {
|
||||
"name" : "Haï~"
|
||||
},
|
||||
"url" : "https://docs.hai-vr.dev/docs/products/animator-as-code/functions/vrchat"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 549150a41d6f00941b76760d487cd9dd
|
||||
PackageManifestImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user