fix: compatibility break with animator defaults (#686)

Changes in 1.9.0 broke existing avatars that used animators with
different default values than the MA Parameters fields. This change
makes overriding the animator defaults require an explicit configuration;
this is technically a change which would require a minor version bump,
but as this is addressing a major-version-level compatibility break in 1.9.0,
we're going to push this out at a minor version this time.
This commit is contained in:
bd_ 2024-02-21 20:40:31 +09:00 committed by GitHub
parent f253ba0901
commit f99930999e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 665 additions and 25 deletions

View File

@ -1,16 +1,21 @@
using System; #region
using System;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using nadena.dev.ndmf; using nadena.dev.ndmf;
using UnityEditor.Animations;
using UnityEngine; using UnityEngine;
#endregion
namespace nadena.dev.modular_avatar.core.editor namespace nadena.dev.modular_avatar.core.editor
{ {
internal class ApplyAnimatorDefaultValuesPass : Pass<ApplyAnimatorDefaultValuesPass> internal class ApplyAnimatorDefaultValuesPass : Pass<ApplyAnimatorDefaultValuesPass>
{ {
protected override void Execute(ndmf.BuildContext context) protected override void Execute(ndmf.BuildContext context)
{ {
var values = context.GetState<DefaultValues>()?.InitialValue var values = context.GetState<DefaultValues>()?.InitialValueOverrides
?? ImmutableDictionary<string, float>.Empty; ?? ImmutableDictionary<string, float>.Empty;
foreach (var layer in context.AvatarDescriptor.baseAnimationLayers foreach (var layer in context.AvatarDescriptor.baseAnimationLayers
@ -19,7 +24,7 @@ namespace nadena.dev.modular_avatar.core.editor
if (layer.isDefault || layer.animatorController == null) continue; if (layer.isDefault || layer.animatorController == null) continue;
// We should have converted anything that's not an AnimationController by now // We should have converted anything that's not an AnimationController by now
var controller = layer.animatorController as UnityEditor.Animations.AnimatorController; var controller = layer.animatorController as AnimatorController;
if (controller == null || !context.IsTemporaryAsset(controller)) if (controller == null || !context.IsTemporaryAsset(controller))
{ {
throw new Exception("Leaked unexpected controller: " + layer.animatorController + " (type " + layer.animatorController?.GetType() + ")"); throw new Exception("Leaked unexpected controller: " + layer.animatorController + " (type " + layer.animatorController?.GetType() + ")");

View File

@ -47,22 +47,48 @@ namespace nadena.dev.modular_avatar.core.editor.Parameters
var value = evt.changedProperty.boolValue; var value = evt.changedProperty.boolValue;
if (value) if (value)
{ {
root.AddToClassList("ParameterConfig__isPrefix"); root.AddToClassList("ParameterConfig__isPrefix_true");
root.RemoveFromClassList("ParameterConfig__isPrefix_false");
} }
else else
{ {
root.RemoveFromClassList("ParameterConfig__isPrefix"); root.AddToClassList("ParameterConfig__isPrefix_false");
root.RemoveFromClassList("ParameterConfig__isPrefix_true");
} }
isPrefix = value; isPrefix = value;
evaluateMiniDisplay(); evaluateMiniDisplay();
}); });
var syncTypeProp = root.Q<PropertyField>("syncType");
// TODO: This callback is not actually invoked on initial bind...
syncTypeProp.RegisterValueChangeCallback(evt =>
{
var value = (ParameterSyncType) evt.changedProperty.enumValueIndex;
if (value == ParameterSyncType.NotSynced)
{
root.AddToClassList("ParameterConfig__animatorOnly_true");
root.RemoveFromClassList("ParameterConfig__animatorOnly_false");
}
else
{
root.AddToClassList("ParameterConfig__animatorOnly_false");
root.RemoveFromClassList("ParameterConfig__animatorOnly_true");
}
});
/*
var overridePlaceholder = root.Q<Toggle>("overridePlaceholder");
overridePlaceholder.labelElement.AddToClassList("ndmf-tr");
overridePlaceholder.SetEnabled(false);
*/
var remapTo = root.Q<PropertyField>("remapTo"); var remapTo = root.Q<PropertyField>("remapTo");
var remapToPlaceholder = root.Q<TextField>("remapToPlaceholder"); var remapToPlaceholder = root.Q<TextField>("remapToPlaceholder");
remapToPlaceholder.SetEnabled(false);
remapToPlaceholder.labelElement.AddToClassList("ndmf-tr"); remapToPlaceholder.labelElement.AddToClassList("ndmf-tr");
remapToPlaceholder.SetEnabled(false);
Localization.UI.Localize(remapToPlaceholder.labelElement); Localization.UI.Localize(remapToPlaceholder.labelElement);
root.Q<PropertyField>("internalParameter").RegisterValueChangeCallback(evt => root.Q<PropertyField>("internalParameter").RegisterValueChangeCallback(evt =>

View File

@ -15,7 +15,9 @@
<engine:PropertyField binding-path="nameOrPrefix" label="merge_parameter.ui.name" name="f-name" class="ndmf-tr ParameterConfig__isPrefix_falseOnly" /> <engine:PropertyField binding-path="nameOrPrefix" label="merge_parameter.ui.name" name="f-name" class="ndmf-tr ParameterConfig__isPrefix_falseOnly" />
<engine:PropertyField binding-path="nameOrPrefix" label="merge_parameter.ui.prefix" name="f-prefix" class="ndmf-tr ParameterConfig__isPrefix_trueOnly" /> <engine:PropertyField binding-path="nameOrPrefix" label="merge_parameter.ui.prefix" name="f-prefix" class="ndmf-tr ParameterConfig__isPrefix_trueOnly" />
<engine:PropertyField binding-path="remapTo" label="merge_parameter.ui.remapTo" name="remapTo" class="ndmf-tr" /> <engine:PropertyField binding-path="remapTo" label="merge_parameter.ui.remapTo" name="remapTo" class="ndmf-tr" />
<ui:TextField label="merge_parameter.ui.remapTo" text="merge_parameter.ui.remapTo.automatic" name="remapToPlaceholder" enabled="false" class="ndmf-tr unity-base-field__aligned" /> <ui:TextField label="merge_parameter.ui.remapTo" text="merge_parameter.ui.remapTo.automatic"
name="remapToPlaceholder" enabled="false"
class="ndmf-tr unity-base-field__aligned disabledPlaceholder"/>
<!-- this field is not visible until it's moved into the PropertyField below --> <!-- this field is not visible until it's moved into the PropertyField below -->
<ma:DefaultValueField <ma:DefaultValueField
@ -31,9 +33,15 @@
<engine:PropertyField binding-path="internalParameter" label="merge_parameter.ui.internalParameter" name="internalParameter" class="ndmf-tr" /> <engine:PropertyField binding-path="internalParameter" label="merge_parameter.ui.internalParameter" name="internalParameter" class="ndmf-tr" />
<engine:PropertyField binding-path="isPrefix" label="merge_parameter.ui.isPrefix" name="isPrefix" class="ndmf-tr" /> <engine:PropertyField binding-path="isPrefix" label="merge_parameter.ui.isPrefix" name="isPrefix" class="ndmf-tr" />
<engine:PropertyField binding-path="syncType" label="merge_parameter.ui.syncType" class="ParameterConfig__isPrefix_falseOnly ndmf-tr" />
<engine:PropertyField binding-path="localOnly" label="merge_parameter.ui.localOnly" class="ParameterConfig__isPrefix_falseOnly ndmf-tr" /> <engine:PropertyField binding-path="syncType" label="merge_parameter.ui.syncType"
class="ParameterConfig__isPrefix_falseOnly ndmf-tr" name="syncType"/>
<engine:PropertyField binding-path="m_overrideAnimatorDefaults" name="overrideDefaults"
label="merge_parameter.ui.overrideAnimatorDefaults"
class="ParameterConfig__isPrefix_falseOnly ndmf-tr"/>
<!-- <ui:Toggle label="merge_parameter.ui.overrideAnimatorDefaults" value="true" enabled="false" name="overridePlaceholder" class="ParameterConfig__isPrefix_falseOnly ParameterConfig__animatorOnly_trueOnly ndmf-tr" /> -->
<engine:PropertyField binding-path="localOnly" label="merge_parameter.ui.localOnly" class="ParameterConfig__isPrefix_falseOnly ParameterConfig__animatorOnly_falseOnly ndmf-tr" />
</ui:Foldout> </ui:Foldout>
</ui:UXML> </ui:UXML>

View File

@ -1,19 +1,19 @@
VisualElement {} VisualElement {}
.ParameterConfig__isPrefix_falseOnly { .ParameterConfig__isPrefix_true .ParameterConfig__isPrefix_falseOnly {
display: flex;
}
.ParameterConfig__isPrefix_trueOnly {
display: none; display: none;
} }
.ParameterConfig__isPrefix .ParameterConfig__isPrefix_falseOnly { .ParameterConfig__isPrefix_false .ParameterConfig__isPrefix_trueOnly {
display: none; display: none;
} }
.ParameterConfig__isPrefix .ParameterConfig__isPrefix_trueOnly { .ParameterConfig__animatorOnly_true .ParameterConfig__animatorOnly_falseOnly {
display: flex; display: none;
}
.ParameterConfig__animatorOnly_false .ParameterConfig__animatorOnly_trueOnly {
display: none;
} }
#defaultValueGroup { #defaultValueGroup {

View File

@ -22,7 +22,7 @@ namespace nadena.dev.modular_avatar.core.editor
{ {
internal class DefaultValues internal class DefaultValues
{ {
public ImmutableDictionary<string, float> InitialValue; public ImmutableDictionary<string, float> InitialValueOverrides;
} }
internal class RenameParametersHook internal class RenameParametersHook
@ -63,6 +63,10 @@ namespace nadena.dev.modular_avatar.core.editor
public void MergeSibling(ParameterInfo info) public void MergeSibling(ParameterInfo info)
{ {
MergeCommon(info); MergeCommon(info);
ResolvedParameter.m_overrideAnimatorDefaults =
(ResolvedParameter.m_overrideAnimatorDefaults && ResolvedParameter.HasDefaultValue) ||
(info.ResolvedParameter.m_overrideAnimatorDefaults && info.ResolvedParameter.HasDefaultValue);
if (ResolvedParameter.HasDefaultValue && info.ResolvedParameter.HasDefaultValue) if (ResolvedParameter.HasDefaultValue && info.ResolvedParameter.HasDefaultValue)
{ {
@ -73,6 +77,8 @@ namespace nadena.dev.modular_avatar.core.editor
ConflictingValues = ConflictingValues.Add(info.ResolvedParameter.defaultValue); ConflictingValues = ConflictingValues.Add(info.ResolvedParameter.defaultValue);
} }
} }
} }
public void MergeChild(ParameterInfo info) public void MergeChild(ParameterInfo info)
@ -83,6 +89,7 @@ namespace nadena.dev.modular_avatar.core.editor
{ {
ResolvedParameter.defaultValue = info.ResolvedParameter.defaultValue; ResolvedParameter.defaultValue = info.ResolvedParameter.defaultValue;
ResolvedParameter.hasExplicitDefaultValue = info.ResolvedParameter.hasExplicitDefaultValue; ResolvedParameter.hasExplicitDefaultValue = info.ResolvedParameter.hasExplicitDefaultValue;
ResolvedParameter.m_overrideAnimatorDefaults = info.ResolvedParameter.m_overrideAnimatorDefaults;
} }
ResolvedParameter.saved = info.ResolvedParameter.saved; ResolvedParameter.saved = info.ResolvedParameter.saved;
@ -123,9 +130,11 @@ namespace nadena.dev.modular_avatar.core.editor
var syncParams = WalkTree(avatar, ImmutableDictionary<string, string>.Empty, ImmutableDictionary<string, string>.Empty); var syncParams = WalkTree(avatar, ImmutableDictionary<string, string>.Empty, ImmutableDictionary<string, string>.Empty);
SetExpressionParameters(avatar, syncParams); SetExpressionParameters(avatar, syncParams);
_context.PluginBuildContext.GetState<DefaultValues>().InitialValue _context.PluginBuildContext.GetState<DefaultValues>().InitialValueOverrides
= syncParams.Where(p => p.Value.ResolvedParameter.HasDefaultValue) = syncParams.Where(p =>
p.Value.ResolvedParameter.HasDefaultValue &&
p.Value.ResolvedParameter.OverrideAnimatorDefaults)
.ToImmutableDictionary(p => p.Key, p => p.Value.ResolvedParameter.defaultValue); .ToImmutableDictionary(p => p.Key, p => p.Value.ResolvedParameter.defaultValue);
} }

View File

@ -1,7 +1,10 @@
using System; #region
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
#endregion
namespace nadena.dev.modular_avatar.core namespace nadena.dev.modular_avatar.core
{ {
@ -21,6 +24,22 @@ namespace nadena.dev.modular_avatar.core
public bool hasExplicitDefaultValue; public bool hasExplicitDefaultValue;
/// <summary>
/// Indicates that the default value for this parameter should be applied to any animators attached to the
/// avatar as well, rather than just the expressions menu configuration.
///
/// Note: Private API for now; will be exposed in 1.10. This is always considered to be true if the parameter
/// is unsynced and has a default value override.
/// </summary>
[SerializeField]
internal bool m_overrideAnimatorDefaults;
internal bool OverrideAnimatorDefaults
{
get => m_overrideAnimatorDefaults || syncType == ParameterSyncType.NotSynced && hasExplicitDefaultValue;
set => m_overrideAnimatorDefaults = value;
}
public bool HasDefaultValue => hasExplicitDefaultValue || Mathf.Abs(defaultValue) > VALUE_EPSILON; public bool HasDefaultValue => hasExplicitDefaultValue || Mathf.Abs(defaultValue) > VALUE_EPSILON;
} }

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8ded71f3352a2f143a917c23bf14760a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,73 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1107 &-752819376345795800
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}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Preexisting
serializedVersion: 5
m_AnimatorParameters:
- m_Name: no_default
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 11
m_DefaultBool: 0
m_Controller: {fileID: 0}
- m_Name: animator_only
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 11
m_DefaultBool: 0
m_Controller: {fileID: 0}
- m_Name: synced
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 11
m_DefaultBool: 0
m_Controller: {fileID: 0}
- m_Name: no_default_override
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 11
m_DefaultBool: 0
m_Controller: {fileID: 0}
- m_Name: default_override
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 11
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -752819376345795800}
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}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f4d1ed09c262f70409af9399619152b8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,37 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using modular_avatar_tests;
using nadena.dev.modular_avatar.core;
using nadena.dev.ndmf;
using NUnit.Framework;
using UnityEditor.Animations;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using AvatarProcessor = nadena.dev.modular_avatar.core.editor.AvatarProcessor;
public class PreexistingParamsTest : TestBase
{
[Test]
public void TestPreexistingParameterOverwritePolicy()
{
var prefab = CreatePrefab("PreexistingParamsTest.prefab");
AvatarProcessor.ProcessAvatar(prefab);
var parameters = ((AnimatorController)FindFxController(prefab).animatorController).parameters;
var paramDict = parameters.ToImmutableDictionary(p => p.name, p => p.defaultInt);
foreach (var kvp in paramDict)
{
if (kvp.Key == "default_override" || kvp.Key == "animator_only")
{
Assert.AreEqual(1, kvp.Value);
}
else
{
Assert.AreEqual(11, kvp.Value);
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d303e057417431b42ac988ef079faf7a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,421 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &293715385600242937
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1103155402592938027}
- component: {fileID: 8138812128970776409}
m_Layer: 0
m_Name: Param
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1103155402592938027
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 293715385600242937}
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: 1845997253236798396}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8138812128970776409
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 293715385600242937}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 71a96d4ea0c344f39e277d82035bf9bd, type: 3}
m_Name:
m_EditorClassIdentifier:
parameters:
- nameOrPrefix: no_default
remapTo:
internalParameter: 0
isPrefix: 0
syncType: 0
localOnly: 0
defaultValue: 0
saved: 0
hasExplicitDefaultValue: 0
m_overrideAnimatorDefaults: 0
- nameOrPrefix: animator_only
remapTo:
internalParameter: 0
isPrefix: 0
syncType: 0
localOnly: 0
defaultValue: 1
saved: 0
hasExplicitDefaultValue: 1
m_overrideAnimatorDefaults: 0
- nameOrPrefix: synced
remapTo:
internalParameter: 0
isPrefix: 0
syncType: 2
localOnly: 0
defaultValue: 2
saved: 0
hasExplicitDefaultValue: 1
m_overrideAnimatorDefaults: 0
- nameOrPrefix: no_default_override
remapTo:
internalParameter: 0
isPrefix: 0
syncType: 2
localOnly: 0
defaultValue: 0
saved: 0
hasExplicitDefaultValue: 0
m_overrideAnimatorDefaults: 1
- nameOrPrefix: default_override
remapTo:
internalParameter: 0
isPrefix: 0
syncType: 2
localOnly: 0
defaultValue: 1
saved: 0
hasExplicitDefaultValue: 1
m_overrideAnimatorDefaults: 1
--- !u!1 &8556977804701238147
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1845997253236798396}
- component: {fileID: 5970688004521109080}
- component: {fileID: 5601024012159522033}
- component: {fileID: 7851048422736913745}
m_Layer: 0
m_Name: PreexistingParamsTest
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1845997253236798396
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8556977804701238147}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.5386686, y: 1.0673547, z: -5.4029636}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1103155402592938027}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!95 &5970688004521109080
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8556977804701238147}
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 &5601024012159522033
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8556977804701238147}
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: 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: f4d1ed09c262f70409af9399619152b8,
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 &7851048422736913745
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8556977804701238147}
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

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: f8f5814f046dffa43aa536d3e24aa21e
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -30,6 +30,10 @@ saved. However, there is an exception; see the section on "Nesting" for more inf
setting will be enabled if either MA Parameters or the original Expression Parameters asset enables saving for the setting will be enabled if either MA Parameters or the original Expression Parameters asset enables saving for the
parameter. parameter.
Normally, the default values you set will only affect the Expressions Parameters settings for your avatar. However,
you can override the default values for the _animator_ itself by either setting the "Parameter Type" to "Animator Only",
or by enabling the "Override Animator Defaults" checkbox (note that this is ignored for animator only parameters).
### Renaming parameters ### Renaming parameters
By setting the "Change name to" field you can _rename_ a parameter. That is, if you have a parameter "foo", which has By setting the "Change name to" field you can _rename_ a parameter. That is, if you have a parameter "foo", which has

View File

@ -24,6 +24,10 @@ ParametersのUIは最初はたたんだ状態でパラメーター情報を表
「入れ子にする」に参照。なお、Expressions ParametersとMA Parameters両方に定義される場合は、どちらかあるいは両方に「保存する」が 「入れ子にする」に参照。なお、Expressions ParametersとMA Parameters両方に定義される場合は、どちらかあるいは両方に「保存する」が
有効になっていると、保存される扱いとなります。 有効になっていると、保存される扱いとなります。
普段は設定した初期値はアバターのExpressions Parameters設定のみに適用されます。ただし、「パラメーター型」を「Animatorのみ」に設定するか、
「アニメーターの初期値を設定」を有効にすることで、アニメーター自体の初期値を上書きすることができます。なお、「アニメーターの初期値を設定」は
「アニメーターのみ」の場合無視されます。
### 名前を変更 ### 名前を変更
「名前を変更」欄に新しい名前を入れると、パラメーターのリネームができます。たとえば、「hoge」という名のパラメーターに、「piyo」という 「名前を変更」欄に新しい名前を入れると、パラメーターのリネームができます。たとえば、「hoge」という名のパラメーターに、「piyo」という