mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2024-12-28 10:15:06 +08:00
feat: convert animator parameters to float when types are inconsistent (#662)
This commit is contained in:
parent
cc6ecd4f90
commit
54d4e974db
@ -25,8 +25,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using nadena.dev.modular_avatar.animation;
|
||||
using nadena.dev.modular_avatar.core.editor;
|
||||
using nadena.dev.modular_avatar.editor.ErrorReporting;
|
||||
using nadena.dev.ndmf.util;
|
||||
using UnityEditor;
|
||||
@ -43,6 +41,7 @@ namespace nadena.dev.modular_avatar.animation
|
||||
{
|
||||
internal class AnimatorCombiner
|
||||
{
|
||||
private readonly ndmf.BuildContext _context;
|
||||
private readonly AnimatorController _combined;
|
||||
|
||||
private readonly DeepClone _deepClone;
|
||||
@ -79,11 +78,13 @@ namespace nadena.dev.modular_avatar.animation
|
||||
|
||||
_combined.name = assetName;
|
||||
|
||||
_context = context;
|
||||
_deepClone = new DeepClone(context);
|
||||
}
|
||||
|
||||
public AnimatorController Finish()
|
||||
{
|
||||
FixTransitionTypeConflicts();
|
||||
PruneEmptyLayers();
|
||||
|
||||
_combined.parameters = _parameters.Values.ToArray();
|
||||
@ -91,6 +92,197 @@ namespace nadena.dev.modular_avatar.animation
|
||||
return _combined;
|
||||
}
|
||||
|
||||
public void MergeTypes(Dictionary<string, AnimatorControllerParameterType> types)
|
||||
{
|
||||
foreach (var p in _parameters.ToList())
|
||||
{
|
||||
if (types.TryGetValue(p.Key, out var outerValue))
|
||||
{
|
||||
if (outerValue == p.Value.type) continue;
|
||||
|
||||
if (outerValue == AnimatorControllerParameterType.Trigger
|
||||
|| p.Value.type == AnimatorControllerParameterType.Trigger)
|
||||
{
|
||||
BuildReport.LogFatal("error.merge_animator.param_type_mismatch",
|
||||
p.Key,
|
||||
p.Value.type,
|
||||
outerValue
|
||||
);
|
||||
}
|
||||
|
||||
_parameters[p.Key].type = AnimatorControllerParameterType.Float;
|
||||
types[p.Key] = AnimatorControllerParameterType.Float;
|
||||
}
|
||||
else
|
||||
{
|
||||
types.Add(p.Key, p.Value.type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When we merge multiple controllers with different types for the same parameter, we merge
|
||||
/// them all into using floats; thanks to VRChat's implicit typecasting, we can do this even for
|
||||
/// parameters registered as being ints or bools in the expressions parameter asset. However,
|
||||
/// we do need to fix any transitions to use the right transition types after this conversion.
|
||||
/// </summary>
|
||||
private void FixTransitionTypeConflicts()
|
||||
{
|
||||
foreach (var layer in _layers)
|
||||
{
|
||||
foreach (var asset in layer.stateMachine.ReferencedAssets(includeScene: false))
|
||||
{
|
||||
if (asset is AnimatorState s)
|
||||
{
|
||||
s.transitions = s.transitions.SelectMany(FixupTransition).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
layer.stateMachine.entryTransitions = layer.stateMachine.entryTransitions
|
||||
.SelectMany(FixupTransition).ToArray();
|
||||
layer.stateMachine.anyStateTransitions = layer.stateMachine.anyStateTransitions
|
||||
.SelectMany(FixupTransition).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<T> FixupTransition<T>(T t) where T: AnimatorTransitionBase, new()
|
||||
{
|
||||
if (!NeedsFixing(t.conditions))
|
||||
{
|
||||
yield return t;
|
||||
yield break;
|
||||
}
|
||||
|
||||
AnimatorCondition[][][] combinations = t.conditions.Select(c => FixupCondition(c).ToArray()).ToArray();
|
||||
|
||||
// Generate the combinatorial explosion of conditions needed to emulate NotEquals with floats...
|
||||
var conditions = ExplodeConditions(combinations).ToArray();
|
||||
|
||||
if (conditions.Length == 1)
|
||||
{
|
||||
t.conditions = conditions[0];
|
||||
yield return t;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var conditionGroup in conditions)
|
||||
{
|
||||
t.conditions = conditionGroup;
|
||||
yield return t;
|
||||
|
||||
var newTransition = new T();
|
||||
EditorUtility.CopySerialized(t, newTransition);
|
||||
if (_context.AssetContainer != null)
|
||||
{
|
||||
AssetDatabase.AddObjectToAsset(newTransition, _context.AssetContainer);
|
||||
}
|
||||
t = newTransition;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool NeedsFixing(AnimatorCondition[] conditions)
|
||||
{
|
||||
return conditions.Any(c =>
|
||||
{
|
||||
if (!_parameters.TryGetValue(c.parameter, out var param)) return false;
|
||||
|
||||
switch (c.mode)
|
||||
{
|
||||
case AnimatorConditionMode.If when param.type != AnimatorControllerParameterType.Bool:
|
||||
case AnimatorConditionMode.IfNot when param.type != AnimatorControllerParameterType.Bool:
|
||||
case AnimatorConditionMode.Equals when param.type != AnimatorControllerParameterType.Int:
|
||||
case AnimatorConditionMode.NotEqual when param.type != AnimatorControllerParameterType.Int:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private IEnumerable<AnimatorCondition[]> ExplodeConditions(AnimatorCondition[][][] conditions)
|
||||
{
|
||||
int[] indices = new int[conditions.Length];
|
||||
|
||||
while (true)
|
||||
{
|
||||
yield return conditions.SelectMany((group, i_) => group[indices[i_]]).ToArray();
|
||||
|
||||
// Increment the rightmost possible counter
|
||||
int i;
|
||||
for (i = indices.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (indices[i] < conditions[i].Length - 1)
|
||||
{
|
||||
indices[i]++;
|
||||
// Unity 2019.....
|
||||
// System.Array.Fill(indices, 0, i + 1, indices.Length - i - 1);
|
||||
for (int j = i + 1; j < indices.Length; j++)
|
||||
{
|
||||
indices[j] = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < 0) break;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<AnimatorCondition[]> FixupCondition(AnimatorCondition c)
|
||||
{
|
||||
if (!_parameters.TryGetValue(c.parameter, out var paramDef))
|
||||
{
|
||||
// Parameter is undefined, don't touch this condition
|
||||
yield return new[] { c };
|
||||
yield break;
|
||||
}
|
||||
|
||||
switch (c.mode)
|
||||
{
|
||||
case AnimatorConditionMode.If when paramDef.type == AnimatorControllerParameterType.Float:
|
||||
{
|
||||
c.mode = AnimatorConditionMode.Greater;
|
||||
c.threshold = 0.5f;
|
||||
yield return new[] { c };
|
||||
break;
|
||||
}
|
||||
case AnimatorConditionMode.IfNot when paramDef.type == AnimatorControllerParameterType.Float:
|
||||
{
|
||||
c.mode = AnimatorConditionMode.Less;
|
||||
c.threshold = 0.5f;
|
||||
yield return new[] { c };
|
||||
break;
|
||||
}
|
||||
case AnimatorConditionMode.Equals when paramDef.type == AnimatorControllerParameterType.Float:
|
||||
{
|
||||
var c1 = c;
|
||||
var c2 = c;
|
||||
c1.mode = AnimatorConditionMode.Greater;
|
||||
c1.threshold -= 0.1f;
|
||||
c2.mode = AnimatorConditionMode.Less;
|
||||
c2.threshold += 0.1f;
|
||||
yield return new[] { c1, c2 };
|
||||
break;
|
||||
}
|
||||
case AnimatorConditionMode.NotEqual when paramDef.type == AnimatorControllerParameterType.Float:
|
||||
{
|
||||
var origThresh = c.threshold;
|
||||
c.mode = AnimatorConditionMode.Greater;
|
||||
c.threshold = origThresh + 0.1f;
|
||||
yield return new[] { c };
|
||||
|
||||
c.mode = AnimatorConditionMode.Less;
|
||||
c.threshold = origThresh - 0.1f;
|
||||
yield return new[] { c };
|
||||
break;
|
||||
}
|
||||
default:
|
||||
yield return new[] { c };
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void PruneEmptyLayers()
|
||||
{
|
||||
var originalLayers = _layers;
|
||||
@ -184,7 +376,9 @@ namespace nadena.dev.modular_avatar.animation
|
||||
{
|
||||
if (_parameters.TryGetValue(param.name, out var acp))
|
||||
{
|
||||
if (acp.type != param.type)
|
||||
if (acp.type != param.type &&
|
||||
(acp.type == AnimatorControllerParameterType.Trigger ||
|
||||
param.type == AnimatorControllerParameterType.Trigger))
|
||||
{
|
||||
BuildReport.LogFatal("error.merge_animator.param_type_mismatch",
|
||||
param.name,
|
||||
@ -195,9 +389,20 @@ namespace nadena.dev.modular_avatar.animation
|
||||
);
|
||||
}
|
||||
|
||||
acp.type = AnimatorControllerParameterType.Float;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
var clonedParameter = new AnimatorControllerParameter()
|
||||
{
|
||||
name = param.name,
|
||||
type = param.type,
|
||||
defaultBool = param.defaultBool,
|
||||
defaultFloat = param.defaultFloat,
|
||||
defaultInt = param.defaultInt
|
||||
};
|
||||
|
||||
_parameters.Add(param.name, param);
|
||||
_parameterSource.Add(param.name, controller);
|
||||
}
|
||||
|
@ -161,6 +161,20 @@ namespace nadena.dev.modular_avatar.core.editor
|
||||
{
|
||||
layers = (VRCAvatarDescriptor.CustomAnimLayer[])layers.Clone();
|
||||
|
||||
// Ensure types are consistent across layers
|
||||
Dictionary<string, AnimatorControllerParameterType> types =
|
||||
new Dictionary<string, AnimatorControllerParameterType>();
|
||||
// Learn types...
|
||||
foreach (var session in mergeSessions.Values)
|
||||
{
|
||||
session.MergeTypes(types);
|
||||
}
|
||||
// And propagate them
|
||||
foreach (var session in mergeSessions.Values)
|
||||
{
|
||||
session.MergeTypes(types);
|
||||
}
|
||||
|
||||
for (int i = 0; i < layers.Length; i++)
|
||||
{
|
||||
if (mergeSessions.TryGetValue(layers[i].type, out var session))
|
||||
|
@ -19,7 +19,7 @@ namespace modular_avatar_tests
|
||||
var prefab = CreatePrefab("LayerPruningTest.prefab");
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var fxController = (AnimatorController) FindFxController(prefab).animatorController;
|
||||
var fxController = (AnimatorController) FindController(prefab, VRCAvatarDescriptor.AnimLayerType.FX).animatorController;
|
||||
var l0 = fxController.layers[0];
|
||||
var l1 = fxController.layers[1];
|
||||
var l2 = fxController.layers[2];
|
||||
|
@ -45,7 +45,7 @@ namespace modular_avatar_tests
|
||||
|
||||
AvatarProcessor.ProcessAvatar(root);
|
||||
|
||||
var fxController = FindFxController(root).animatorController as AnimatorController;
|
||||
var fxController = FindController(root, VRCAvatarDescriptor.AnimLayerType.FX).animatorController as AnimatorController;
|
||||
var fx = findFxLayer(root, MergeBlendTreePass.BlendTreeLayerName);
|
||||
Assert.AreSame(fxController.layers[0].stateMachine, fx.stateMachine);
|
||||
Assert.AreEqual(1, fx.stateMachine.states.Length);
|
||||
@ -112,7 +112,7 @@ namespace modular_avatar_tests
|
||||
|
||||
AvatarProcessor.ProcessAvatar(root);
|
||||
|
||||
var layerNames = (FindFxController(root).animatorController as AnimatorController)
|
||||
var layerNames = (FindController(root, VRCAvatarDescriptor.AnimLayerType.FX).animatorController as AnimatorController)
|
||||
.layers.Select(l => l.name).ToArray();
|
||||
|
||||
Assert.AreEqual(new[] {MergeBlendTreePass.BlendTreeLayerName, "m2", "Eyes", "FaceMood", "m1", "m3"}, layerNames);
|
||||
|
@ -4,6 +4,7 @@ using System.Linq;
|
||||
using nadena.dev.ndmf;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using VRC.SDK3.Avatars.Components;
|
||||
|
||||
namespace modular_avatar_tests
|
||||
{
|
||||
@ -16,9 +17,9 @@ namespace modular_avatar_tests
|
||||
|
||||
AvatarProcessor.ProcessAvatar(root);
|
||||
|
||||
var fxController = FindFxController(root);
|
||||
var fxController = FindController(root, VRCAvatarDescriptor.AnimLayerType.FX);
|
||||
|
||||
var layerNames = (FindFxController(root).animatorController as AnimatorController)
|
||||
var layerNames = (FindController(root, VRCAvatarDescriptor.AnimLayerType.FX).animatorController as AnimatorController)
|
||||
.layers.Select(l => l.name).ToArray();
|
||||
|
||||
Assert.AreEqual(new []
|
||||
|
8
UnitTests~/MergeAnimatorTests.meta
Normal file
8
UnitTests~/MergeAnimatorTests.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c449d0dee44da544a80e1cfe78c849a0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
UnitTests~/MergeAnimatorTests/TypeAdjustment.meta
Normal file
8
UnitTests~/MergeAnimatorTests/TypeAdjustment.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbbe69f3bd9989841bc9107fce514c32
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,229 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using modular_avatar_tests;
|
||||
using nadena.dev.ndmf;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
using VRC.SDK3.Avatars.Components;
|
||||
|
||||
public class ConvertTransitionTypes : TestBase
|
||||
{
|
||||
[Test]
|
||||
public void IntConversions()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var layer = findFxLayer(prefab, "int transitions");
|
||||
AssertTransitions(layer, "int", "gt1", 0, ("int", AnimatorConditionMode.Greater, 1));
|
||||
AssertTransitions(layer, "int", "lt1", 0, ("int", AnimatorConditionMode.Less, 1));
|
||||
AssertTransitions(layer, "int", "eq1", 0,
|
||||
("int", AnimatorConditionMode.Greater, 0.9f),
|
||||
("int", AnimatorConditionMode.Less, 1.1f)
|
||||
);
|
||||
AssertTransitions(layer, "int", "ne1", 0, ("int", AnimatorConditionMode.Greater, 1.1f));
|
||||
AssertTransitions(layer, "int", "ne1", 1, ("int", AnimatorConditionMode.Less, 0.9f));
|
||||
AssertTransitions(layer, "int", "ne_multi", 0,
|
||||
("int", AnimatorConditionMode.Greater, 1.1f),
|
||||
("int2", AnimatorConditionMode.Greater, 2.1f)
|
||||
);
|
||||
AssertTransitions(layer, "int", "ne_multi", 1,
|
||||
("int", AnimatorConditionMode.Greater, 1.1f),
|
||||
("int2", AnimatorConditionMode.Less, 1.9f)
|
||||
);
|
||||
AssertTransitions(layer, "int", "ne_multi", 2,
|
||||
("int", AnimatorConditionMode.Less, 0.9f),
|
||||
("int2", AnimatorConditionMode.Greater, 2.1f)
|
||||
);
|
||||
AssertTransitions(layer, "int", "ne_multi", 3,
|
||||
("int", AnimatorConditionMode.Less, 0.9f),
|
||||
("int2", AnimatorConditionMode.Less, 1.9f)
|
||||
);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BoolConversions()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var layer = findFxLayer(prefab, "bool transitions");
|
||||
AssertTransitions(layer, "bool", "true", 0, ("bool", AnimatorConditionMode.Greater, 0.5f));
|
||||
AssertTransitions(layer, "bool", "false", 0, ("bool", AnimatorConditionMode.Less, 0.5f));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FloatUnchanged()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var layer = findFxLayer(prefab, "float transitions");
|
||||
AssertTransitions(layer, "float", "gt", 0, ("float", AnimatorConditionMode.Greater, 123));
|
||||
AssertTransitions(layer, "float", "lt", 0, ("float", AnimatorConditionMode.Less, 123));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AnyState()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var layer = findFxLayer(prefab, "anystate");
|
||||
var anyStateTransitions = layer.stateMachine.anyStateTransitions;
|
||||
|
||||
AssertSingleTransition(anyStateTransitions[0], ("int", AnimatorConditionMode.Greater, 0.1f));
|
||||
AssertSingleTransition(anyStateTransitions[1], ("int", AnimatorConditionMode.Less, -0.1f));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void Entry()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var layer = findFxLayer(prefab, "entry");
|
||||
var transitions = layer.stateMachine.entryTransitions;
|
||||
|
||||
AssertSingleTransition(transitions[0], ("int", AnimatorConditionMode.Greater, 0.1f));
|
||||
AssertSingleTransition(transitions[1], ("int", AnimatorConditionMode.Less, -0.1f));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PreservesTransitionConfig()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var layer = findFxLayer(prefab, "preserve_config");
|
||||
|
||||
var state = FindStateInLayer(layer, "foo");
|
||||
Assert.AreEqual(123, layer.stateMachine.anyStateTransitions[0].duration);
|
||||
Assert.AreEqual(123, state.transitions[0].exitTime);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ConversionWhenInconsistent()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var fx = (AnimatorController) FindFxController(prefab).animatorController;
|
||||
|
||||
var p_types = fx.parameters.Select(
|
||||
p => new KeyValuePair<string, AnimatorControllerParameterType>(p.name, p.type)
|
||||
).ToImmutableDictionary();
|
||||
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Int, p_types["int3"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Trigger, p_types["trigger"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, p_types["bool"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, p_types["int"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, p_types["float"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, p_types["int2"]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NoConversionWhenConsistent()
|
||||
{
|
||||
var prefab = CreatePrefab("ConvertTransitionTypes.prefab");
|
||||
|
||||
UnityEngine.Object.DestroyImmediate(prefab.transform.Find("2").gameObject);
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var fx = (AnimatorController) FindFxController(prefab).animatorController;
|
||||
|
||||
var p_types = fx.parameters.Select(
|
||||
p => new KeyValuePair<string, AnimatorControllerParameterType>(p.name, p.type)
|
||||
).ToImmutableDictionary();
|
||||
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Int, p_types["int3"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Trigger, p_types["trigger"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Bool, p_types["bool"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Int, p_types["int"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, p_types["float"]);
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Int, p_types["int2"]);
|
||||
|
||||
var layer = findFxLayer(prefab, "int transitions");
|
||||
AssertTransitions(layer, "int", "eq1", 0, ("int", AnimatorConditionMode.Equals, 1f));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CrossLayerTypeConsistency()
|
||||
{
|
||||
var prefab = CreatePrefab("CrossLayerTypeConsistency.prefab");
|
||||
|
||||
AvatarProcessor.ProcessAvatar(prefab);
|
||||
|
||||
var fx = (AnimatorController) FindFxController(prefab).animatorController;
|
||||
|
||||
var fx_types = fx.parameters.Select(
|
||||
p => new KeyValuePair<string, AnimatorControllerParameterType>(p.name, p.type)
|
||||
).ToImmutableDictionary();
|
||||
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, fx_types["bool"]);
|
||||
|
||||
var fx_layer = fx.layers.First(l => l.name == "l");
|
||||
AssertSingleTransition(fx_layer.stateMachine.anyStateTransitions[0], ("bool", AnimatorConditionMode.Greater, 0.5f));
|
||||
|
||||
var action = (AnimatorController) FindController(prefab, VRCAvatarDescriptor.AnimLayerType.Action).animatorController;
|
||||
|
||||
var action_types = action.parameters.Select(
|
||||
p => new KeyValuePair<string, AnimatorControllerParameterType>(p.name, p.type)
|
||||
).ToImmutableDictionary();
|
||||
Assert.AreEqual(AnimatorControllerParameterType.Float, action_types["bool"]);
|
||||
|
||||
var action_layer = action.layers.First(l => l.name == "l");
|
||||
AssertSingleTransition(action_layer.stateMachine.anyStateTransitions[0], ("bool", AnimatorConditionMode.Greater, 0));
|
||||
}
|
||||
|
||||
void AssertTransitions(AnimatorControllerLayer layer, string src, string dest, int index,
|
||||
params (string, AnimatorConditionMode, float)[] conditions)
|
||||
{
|
||||
var srcState = FindStateInLayer(layer, src);
|
||||
|
||||
foreach (var s in layer.stateMachine.states)
|
||||
{
|
||||
Debug.Log("$$$ State: " + s.state.name);
|
||||
foreach (var t0 in s.state.transitions)
|
||||
{
|
||||
Debug.Log("$$$ => " + t0.destinationState.name);
|
||||
}
|
||||
}
|
||||
|
||||
var transitions = srcState.transitions.Where(t2 => t2.destinationState.name == dest)
|
||||
.ToArray();
|
||||
var t = transitions[index];
|
||||
|
||||
AssertSingleTransition(t, conditions);
|
||||
}
|
||||
|
||||
private static void AssertSingleTransition<T>(T t,
|
||||
params (string, AnimatorConditionMode, float)[] conditions
|
||||
) where T: AnimatorTransitionBase
|
||||
{
|
||||
Assert.AreEqual(t.conditions.Length, conditions.Length);
|
||||
|
||||
for (int i = 0; i < conditions.Length; i++)
|
||||
{
|
||||
var t_cond = t.conditions[i];
|
||||
var (e_param, e_mode, e_thresh) = conditions[i];
|
||||
|
||||
Assert.AreEqual(e_param, t_cond.parameter);
|
||||
Assert.AreEqual(e_mode, t_cond.mode);
|
||||
Assert.Less(Mathf.Abs(t_cond.threshold - e_thresh), 0.001f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e81482b11469b664386911716898aa9b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,431 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1264542558886155732
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2112710666216052914}
|
||||
- component: {fileID: 3563451674332755173}
|
||||
m_Layer: 0
|
||||
m_Name: 2
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &2112710666216052914
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1264542558886155732}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 6373179581926926786}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &3563451674332755173
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1264542558886155732}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
animator: {fileID: 9100000, guid: 39748a1cb2c33ca44926fc40c09f37c8, type: 2}
|
||||
layerType: 5
|
||||
deleteAttachedAnimator: 0
|
||||
pathMode: 0
|
||||
matchAvatarWriteDefaults: 0
|
||||
relativePathRoot:
|
||||
referencePath:
|
||||
layerPriority: 0
|
||||
--- !u!1 &3957836390126773890
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 3683911502407370956}
|
||||
- component: {fileID: 1890891409117975684}
|
||||
m_Layer: 0
|
||||
m_Name: 1
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &3683911502407370956
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3957836390126773890}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 6373179581926926786}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1890891409117975684
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3957836390126773890}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
animator: {fileID: 9100000, guid: 7df89b32015face4cb00de2bc1e82ce0, type: 2}
|
||||
layerType: 5
|
||||
deleteAttachedAnimator: 0
|
||||
pathMode: 0
|
||||
matchAvatarWriteDefaults: 0
|
||||
relativePathRoot:
|
||||
referencePath:
|
||||
layerPriority: 0
|
||||
--- !u!1 &5272753184639627525
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6373179581926926786}
|
||||
- component: {fileID: 265524611777631571}
|
||||
- component: {fileID: 915165661785907967}
|
||||
- component: {fileID: 7826662332881893537}
|
||||
m_Layer: 0
|
||||
m_Name: ConvertTransitionTypes
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &6373179581926926786
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5272753184639627525}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0.14671779, y: 0.4227038, z: 0.22339332}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 3683911502407370956}
|
||||
- {fileID: 2112710666216052914}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!95 &265524611777631571
|
||||
Animator:
|
||||
serializedVersion: 5
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5272753184639627525}
|
||||
m_Enabled: 1
|
||||
m_Avatar: {fileID: 0}
|
||||
m_Controller: {fileID: 0}
|
||||
m_CullingMode: 0
|
||||
m_UpdateMode: 0
|
||||
m_ApplyRootMotion: 0
|
||||
m_LinearVelocityBlending: 0
|
||||
m_StabilizeFeet: 0
|
||||
m_WarningMessage:
|
||||
m_HasTransformHierarchy: 1
|
||||
m_AllowConstantClipSamplingOptimization: 1
|
||||
m_KeepAnimatorStateOnDisable: 0
|
||||
m_WriteDefaultValuesOnDisable: 0
|
||||
--- !u!114 &915165661785907967
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5272753184639627525}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
Name:
|
||||
ViewPosition: {x: 0, y: 1.6, z: 0.2}
|
||||
Animations: 0
|
||||
ScaleIPD: 1
|
||||
lipSync: 0
|
||||
lipSyncJawBone: {fileID: 0}
|
||||
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
|
||||
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
|
||||
VisemeSkinnedMesh: {fileID: 0}
|
||||
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
|
||||
VisemeBlendShapes: []
|
||||
unityVersion:
|
||||
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
|
||||
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
|
||||
networkIDs: []
|
||||
customExpressions: 1
|
||||
expressionsMenu: {fileID: 0}
|
||||
expressionParameters: {fileID: 0}
|
||||
enableEyeLook: 0
|
||||
customEyeLookSettings:
|
||||
eyeMovement:
|
||||
confidence: 0.5
|
||||
excitement: 0.5
|
||||
leftEye: {fileID: 0}
|
||||
rightEye: {fileID: 0}
|
||||
eyesLookingStraight:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingUp:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingDown:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingLeft:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingRight:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidType: 0
|
||||
upperLeftEyelid: {fileID: 0}
|
||||
upperRightEyelid: {fileID: 0}
|
||||
lowerLeftEyelid: {fileID: 0}
|
||||
lowerRightEyelid: {fileID: 0}
|
||||
eyelidsDefault:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsClosed:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsLookingUp:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsLookingDown:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsSkinnedMesh: {fileID: 0}
|
||||
eyelidsBlendshapes:
|
||||
customizeAnimationLayers: 1
|
||||
baseAnimationLayers:
|
||||
- isEnabled: 0
|
||||
type: 0
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 4
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 5
|
||||
animatorController: {fileID: 9100000, guid: 3249e875a472a8341b1ad3151cef1051,
|
||||
type: 2}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 0
|
||||
specialAnimationLayers:
|
||||
- isEnabled: 0
|
||||
type: 6
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 7
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 8
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
AnimationPreset: {fileID: 0}
|
||||
animationHashSet: []
|
||||
autoFootsteps: 1
|
||||
autoLocomotion: 1
|
||||
collider_head:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_torso:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_footR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_footL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_handR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_handL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerIndexL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerMiddleL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerRingL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerLittleL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerIndexR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerMiddleR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerRingR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerLittleR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
--- !u!114 &7826662332881893537
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5272753184639627525}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
launchedFromSDKPipeline: 0
|
||||
completedSDKPipeline: 0
|
||||
blueprintId:
|
||||
contentType: 0
|
||||
assetBundleUnityVersion:
|
||||
fallbackStatus: 0
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a7bf82e11c60b34499df128db43995f
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,430 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &3639266076937693381
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 4320058369893982630}
|
||||
- component: {fileID: 6515486155343127979}
|
||||
m_Layer: 0
|
||||
m_Name: GameObject
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4320058369893982630
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3639266076937693381}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 2366726236707392977}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &6515486155343127979
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3639266076937693381}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
animator: {fileID: 9100000, guid: ade8100c9a903fb4ca5046e539e67c2c, type: 2}
|
||||
layerType: 5
|
||||
deleteAttachedAnimator: 0
|
||||
pathMode: 0
|
||||
matchAvatarWriteDefaults: 0
|
||||
relativePathRoot:
|
||||
referencePath:
|
||||
layerPriority: 0
|
||||
--- !u!1 &6959487909055347204
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6553629352900592484}
|
||||
- component: {fileID: 5323417740160403864}
|
||||
m_Layer: 0
|
||||
m_Name: GameObject (1)
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &6553629352900592484
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6959487909055347204}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 2366726236707392977}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &5323417740160403864
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6959487909055347204}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
animator: {fileID: 9100000, guid: fa7df5e943c2ac24d9d9488b70831c8e, type: 2}
|
||||
layerType: 4
|
||||
deleteAttachedAnimator: 0
|
||||
pathMode: 0
|
||||
matchAvatarWriteDefaults: 0
|
||||
relativePathRoot:
|
||||
referencePath:
|
||||
layerPriority: 0
|
||||
--- !u!1 &7774181568109795767
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2366726236707392977}
|
||||
- component: {fileID: 8907566675985250583}
|
||||
- component: {fileID: 7883572640581156853}
|
||||
- component: {fileID: 4144361165177803043}
|
||||
m_Layer: 0
|
||||
m_Name: CrossLayerTypeConsistency
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &2366726236707392977
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7774181568109795767}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0.14671779, y: 0.4227038, z: 0.22339332}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 4320058369893982630}
|
||||
- {fileID: 6553629352900592484}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!95 &8907566675985250583
|
||||
Animator:
|
||||
serializedVersion: 5
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7774181568109795767}
|
||||
m_Enabled: 1
|
||||
m_Avatar: {fileID: 0}
|
||||
m_Controller: {fileID: 0}
|
||||
m_CullingMode: 0
|
||||
m_UpdateMode: 0
|
||||
m_ApplyRootMotion: 0
|
||||
m_LinearVelocityBlending: 0
|
||||
m_StabilizeFeet: 0
|
||||
m_WarningMessage:
|
||||
m_HasTransformHierarchy: 1
|
||||
m_AllowConstantClipSamplingOptimization: 1
|
||||
m_KeepAnimatorStateOnDisable: 0
|
||||
m_WriteDefaultValuesOnDisable: 0
|
||||
--- !u!114 &7883572640581156853
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7774181568109795767}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
Name:
|
||||
ViewPosition: {x: 0, y: 1.6, z: 0.2}
|
||||
Animations: 0
|
||||
ScaleIPD: 1
|
||||
lipSync: 0
|
||||
lipSyncJawBone: {fileID: 0}
|
||||
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
|
||||
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
|
||||
VisemeSkinnedMesh: {fileID: 0}
|
||||
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
|
||||
VisemeBlendShapes: []
|
||||
unityVersion:
|
||||
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
|
||||
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
|
||||
networkIDs: []
|
||||
customExpressions: 0
|
||||
expressionsMenu: {fileID: 0}
|
||||
expressionParameters: {fileID: 0}
|
||||
enableEyeLook: 0
|
||||
customEyeLookSettings:
|
||||
eyeMovement:
|
||||
confidence: 0.5
|
||||
excitement: 0.5
|
||||
leftEye: {fileID: 0}
|
||||
rightEye: {fileID: 0}
|
||||
eyesLookingStraight:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingUp:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingDown:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingLeft:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyesLookingRight:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidType: 0
|
||||
upperLeftEyelid: {fileID: 0}
|
||||
upperRightEyelid: {fileID: 0}
|
||||
lowerLeftEyelid: {fileID: 0}
|
||||
lowerRightEyelid: {fileID: 0}
|
||||
eyelidsDefault:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsClosed:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsLookingUp:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsLookingDown:
|
||||
upper:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
lower:
|
||||
linked: 1
|
||||
left: {x: 0, y: 0, z: 0, w: 0}
|
||||
right: {x: 0, y: 0, z: 0, w: 0}
|
||||
eyelidsSkinnedMesh: {fileID: 0}
|
||||
eyelidsBlendshapes:
|
||||
customizeAnimationLayers: 0
|
||||
baseAnimationLayers:
|
||||
- isEnabled: 0
|
||||
type: 0
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 4
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 5
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
specialAnimationLayers:
|
||||
- isEnabled: 0
|
||||
type: 6
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 7
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
- isEnabled: 0
|
||||
type: 8
|
||||
animatorController: {fileID: 0}
|
||||
mask: {fileID: 0}
|
||||
isDefault: 1
|
||||
AnimationPreset: {fileID: 0}
|
||||
animationHashSet: []
|
||||
autoFootsteps: 1
|
||||
autoLocomotion: 1
|
||||
collider_head:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_torso:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_footR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_footL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_handR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_handL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerIndexL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerMiddleL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerRingL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerLittleL:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerIndexR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerMiddleR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerRingR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
collider_fingerLittleR:
|
||||
isMirrored: 1
|
||||
state: 0
|
||||
transform: {fileID: 0}
|
||||
radius: 0
|
||||
height: 0
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
--- !u!114 &4144361165177803043
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7774181568109795767}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
launchedFromSDKPipeline: 0
|
||||
completedSDKPipeline: 0
|
||||
blueprintId:
|
||||
contentType: 0
|
||||
assetBundleUnityVersion:
|
||||
fallbackStatus: 0
|
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9d63aa262c809e644b8b16248ef5ac9c
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
1060
UnitTests~/MergeAnimatorTests/TypeAdjustment/ac1.controller
Normal file
1060
UnitTests~/MergeAnimatorTests/TypeAdjustment/ac1.controller
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7df89b32015face4cb00de2bc1e82ce0
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 9100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
67
UnitTests~/MergeAnimatorTests/TypeAdjustment/ac2.controller
Normal file
67
UnitTests~/MergeAnimatorTests/TypeAdjustment/ac2.controller
Normal file
@ -0,0 +1,67 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: ac2
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters:
|
||||
- m_Name: float
|
||||
m_Type: 1
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
- m_Name: bool
|
||||
m_Type: 1
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
- m_Name: int
|
||||
m_Type: 1
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
- m_Name: int2
|
||||
m_Type: 1
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: Base Layer
|
||||
m_StateMachine: {fileID: 3481636103936069629}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1107 &3481636103936069629
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Base Layer
|
||||
m_ChildStates: []
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions: []
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: 50, y: 20, z: 0}
|
||||
m_EntryPosition: {x: 50, y: 120, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: 0}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 39748a1cb2c33ca44926fc40c09f37c8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 9100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,43 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: ac_empty
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters: []
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: Base Layer
|
||||
m_StateMachine: {fileID: 2471155352938139103}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1107 &2471155352938139103
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Base Layer
|
||||
m_ChildStates: []
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions: []
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: 50, y: 20, z: 0}
|
||||
m_EntryPosition: {x: 50, y: 120, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: 0}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3249e875a472a8341b1ad3151cef1051
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 9100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
104
UnitTests~/MergeAnimatorTests/TypeAdjustment/cltc_0.controller
Normal file
104
UnitTests~/MergeAnimatorTests/TypeAdjustment/cltc_0.controller
Normal file
@ -0,0 +1,104 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1102 &-385756315321488699
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: New State
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 0}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: cltc_0
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters:
|
||||
- m_Name: bool
|
||||
m_Type: 4
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: l
|
||||
m_StateMachine: {fileID: 6926168581898200902}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1101 &5840619603552301365
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: bool
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -385756315321488699}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.75
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1107 &6926168581898200902
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: l
|
||||
m_ChildStates:
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -385756315321488699}
|
||||
m_Position: {x: 330, y: 130, z: 0}
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions:
|
||||
- {fileID: 5840619603552301365}
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: 50, y: 20, z: 0}
|
||||
m_EntryPosition: {x: 50, y: 120, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: -385756315321488699}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ade8100c9a903fb4ca5046e539e67c2c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 9100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
104
UnitTests~/MergeAnimatorTests/TypeAdjustment/cltc_1.controller
Normal file
104
UnitTests~/MergeAnimatorTests/TypeAdjustment/cltc_1.controller
Normal file
@ -0,0 +1,104 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1101 &-1049368330081820994
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 3
|
||||
m_ConditionEvent: bool
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 3643915493798889361}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.75
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: cltc_1
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters:
|
||||
- m_Name: bool
|
||||
m_Type: 1
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: l
|
||||
m_StateMachine: {fileID: 6926168581898200902}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1102 &3643915493798889361
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: New State
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 0}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1107 &6926168581898200902
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: l
|
||||
m_ChildStates:
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 3643915493798889361}
|
||||
m_Position: {x: 360, y: 50, z: 0}
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions:
|
||||
- {fileID: -1049368330081820994}
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: 50, y: 20, z: 0}
|
||||
m_EntryPosition: {x: 50, y: 120, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: 3643915493798889361}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa7df5e943c2ac24d9d9488b70831c8e
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 9100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -155,9 +155,14 @@ namespace modular_avatar_tests
|
||||
}
|
||||
|
||||
internal static VRCAvatarDescriptor.CustomAnimLayer FindFxController(GameObject prefab)
|
||||
{
|
||||
return FindController(prefab, VRCAvatarDescriptor.AnimLayerType.FX);
|
||||
}
|
||||
|
||||
internal static VRCAvatarDescriptor.CustomAnimLayer FindController(GameObject prefab, VRCAvatarDescriptor.AnimLayerType layerType)
|
||||
{
|
||||
return prefab.GetComponent<VRCAvatarDescriptor>().baseAnimationLayers
|
||||
.FirstOrDefault(l => l.type == VRCAvatarDescriptor.AnimLayerType.FX);
|
||||
.FirstOrDefault(l => l.type == layerType);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user