Skip to content

Commit 7174ab0

Browse files
Fixes UMAData events so that removing listeners from them works properly. This fixes the issue where the 'ApplyAjustScale' method was being applied multiple times
1 parent ea7d738 commit 7174ab0

File tree

2 files changed

+23
-32
lines changed

2 files changed

+23
-32
lines changed

UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs

+15-32
Original file line numberDiff line numberDiff line change
@@ -126,28 +126,28 @@ public void RegisterAnimatedBoneHierarchy(int hash)
126126
/// <summary>
127127
/// Callback event when character has been updated.
128128
/// </summary>
129-
public event Action<UMAData> OnCharacterUpdated { add { if (CharacterUpdated == null) CharacterUpdated = new UMADataEvent(); CharacterUpdated.AddListener(new UnityAction<UMAData>(value)); } remove { CharacterUpdated.RemoveListener(new UnityAction<UMAData>(value)); } }
129+
public event Action<UMAData> OnCharacterUpdated { add { if (CharacterUpdated == null) CharacterUpdated = new UMADataEvent(); CharacterUpdated.AddAction(value); } remove { CharacterUpdated.RemoveAction(value); } }
130130
/// <summary>
131131
/// Callback event when character has been completely created.
132132
/// </summary>
133-
public event Action<UMAData> OnCharacterCreated { add { if (CharacterCreated == null) CharacterCreated = new UMADataEvent(); CharacterCreated.AddListener(new UnityAction<UMAData>(value)); } remove { CharacterCreated.RemoveListener(new UnityAction<UMAData>(value)); } }
133+
public event Action<UMAData> OnCharacterCreated { add { if (CharacterCreated == null) CharacterCreated = new UMADataEvent(); CharacterCreated.AddAction(value); } remove { CharacterCreated.RemoveAction(value); } }
134134
/// <summary>
135135
/// Callback event when character has been destroyed.
136136
/// </summary>
137-
public event Action<UMAData> OnCharacterDestroyed { add { if (CharacterDestroyed == null) CharacterDestroyed = new UMADataEvent(); CharacterDestroyed.AddListener(new UnityAction<UMAData>(value)); } remove { CharacterDestroyed.RemoveListener(new UnityAction<UMAData>(value)); } }
137+
public event Action<UMAData> OnCharacterDestroyed { add { if (CharacterDestroyed == null) CharacterDestroyed = new UMADataEvent(); CharacterDestroyed.AddAction(value); } remove { CharacterDestroyed.RemoveAction(value); } }
138138

139139
/// <summary>
140140
/// Callback event when character DNA has been updated.
141141
/// </summary>
142-
public event Action<UMAData> OnCharacterDnaUpdated { add { if (CharacterDnaUpdated == null) CharacterDnaUpdated = new UMADataEvent(); CharacterDnaUpdated.AddListener(new UnityAction<UMAData>(value)); } remove { CharacterDnaUpdated.RemoveListener(new UnityAction<UMAData>(value)); } }
142+
public event Action<UMAData> OnCharacterDnaUpdated { add { if (CharacterDnaUpdated == null) CharacterDnaUpdated = new UMADataEvent(); CharacterDnaUpdated.AddAction(value); } remove { CharacterDnaUpdated.RemoveAction(value); } }
143143
/// <summary>
144144
/// Callback event used by UMA to make last minute tweaks
145145
/// </summary>
146-
public event Action<UMAData> OnCharacterBeforeUpdated { add { if (CharacterBeforeUpdated == null) CharacterBeforeUpdated = new UMADataEvent(); CharacterBeforeUpdated.AddListener(new UnityAction<UMAData>(value)); } remove { CharacterBeforeUpdated.RemoveListener(new UnityAction<UMAData>(value)); } }
146+
public event Action<UMAData> OnCharacterBeforeUpdated { add { if (CharacterBeforeUpdated == null) CharacterBeforeUpdated = new UMADataEvent(); CharacterBeforeUpdated.AddAction(value);} remove { CharacterBeforeUpdated.RemoveAction(value); } }
147147
/// <summary>
148148
/// Callback event used by UMA to make last minute tweaks
149149
/// </summary>
150-
public event Action<UMAData> OnCharacterBeforeDnaUpdated { add { if (CharacterBeforeDnaUpdated == null) CharacterBeforeDnaUpdated = new UMADataEvent(); CharacterBeforeDnaUpdated.AddListener(new UnityAction<UMAData>(value)); } remove { CharacterBeforeUpdated.RemoveListener(new UnityAction<UMAData>(value)); } }
150+
public event Action<UMAData> OnCharacterBeforeDnaUpdated { add { if (CharacterBeforeDnaUpdated == null) CharacterBeforeDnaUpdated = new UMADataEvent(); CharacterBeforeDnaUpdated.AddAction(value);} remove { CharacterBeforeDnaUpdated.RemoveAction(value); } }
151151

152152
public UMADataEvent CharacterCreated;
153153
public UMADataEvent CharacterDestroyed;
@@ -878,44 +878,27 @@ public void MergeMatchingOverlays()
878878
public void PreApplyDNA(UMAData umaData, bool fixUpUMADnaToDynamicUMADna = false)
879879
{
880880
EnsureAllDNAPresent();
881-
bool fixup = false;
882-
//DynamicUMADna:: when loading an older recipe that has UMADnaHumanoid/Tutorial into a race that now uses DynamicUmaDna the following wont work
883-
//so check that and fix it if it happens
884-
if (fixUpUMADnaToDynamicUMADna)
885-
{
886-
DynamicDNAConverterBehaviourBase.FixUpUMADnaToDynamicUMADna(this);
887-
}
888-
else
889-
{
890-
//clear any color adjusters from all overlays in the recipe
891-
//Only do this if we havent looped back to fixup dna
892-
umaData.umaRecipe.ClearOverlayColorAdjusters();
893-
}
881+
//clear any color adjusters from all overlays in the recipe
882+
umaData.umaRecipe.ClearOverlayColorAdjusters();
894883
foreach (var dnaEntry in umaDna)
895884
{
896885
//DynamicDNAPlugins FEATURE: Allow more than one converter to use the same dna
897886
List<DNAConvertDelegate> dnaConverters;
898887
this.umaDNAPreApplyConverters.TryGetValue(dnaEntry.Key, out dnaConverters);
899-
888+
//DynamicUMADna:: when loading an older recipe that has UMADnaHumanoid/Tutorial into a race that now uses DynamicUmaDna the following wont work
889+
//so check that and fix it if it happens
890+
if (dnaConverters == null || dnaConverters.Count == 0)
891+
{
892+
DynamicDNAConverterBehaviourBase.FixUpUMADnaToDynamicUMADna(this);
893+
this.umaDNAPreApplyConverters.TryGetValue(dnaEntry.Key, out dnaConverters);
894+
}
900895
if (dnaConverters != null && dnaConverters.Count > 0)
901896
{
902897
for (int i = 0; i < dnaConverters.Count; i++)
903898
{
904899
dnaConverters[i](umaData, umaData.GetSkeleton());
905900
}
906901
}
907-
else
908-
{
909-
//DynamicUMADna:: try again this time calling FixUpUMADnaToDynamicUMADna first
910-
if (fixUpUMADnaToDynamicUMADna == false)
911-
{
912-
fixup = true;
913-
}
914-
}
915-
}
916-
if (fixup)
917-
{
918-
PreApplyDNA(umaData, true);
919902
}
920903
}
921904

UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAEvents.cs

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ public UMADataEvent(UMADataEvent source)
2222
AddListener(target, UnityEventBase.GetValidMethodInfo(target, source.GetPersistentMethodName(i), new Type[] { typeof(UMAData) }));
2323
}
2424
}
25+
public void AddAction(Action<UMAData> action)
26+
{
27+
this.AddListener(action.Target, action.Method);
28+
}
29+
public void RemoveAction(Action<UMAData> action)
30+
{
31+
this.RemoveListener(action.Target, action.Method);
32+
}
2533
}
2634

2735
/// <summary>

0 commit comments

Comments
 (0)