61 lines
2.7 KiB
C#
61 lines
2.7 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor.Animations;
|
|
using UnityEngine;
|
|
using VF.Builder;
|
|
using VF.Builder.Exceptions;
|
|
using VF.Feature.Base;
|
|
using VRC.SDK3.Avatars.Components;
|
|
|
|
namespace VF.Feature {
|
|
public class FixDoubleFxBuilder : FeatureBuilder {
|
|
[FeatureBuilderAction(FeatureOrder.FixDoubleFx)]
|
|
public void Apply() {
|
|
var avatars = avatarObject.GetComponentsInChildren<VRCAvatarDescriptor>(true);
|
|
foreach (var avatar in avatars) {
|
|
var fxLayers = new List<RuntimeAnimatorController>();
|
|
var fxLayerIds = new List<int>();
|
|
var fxLayerDefault = new List<bool>();
|
|
for (var i = 0; i < avatar.baseAnimationLayers.Length; i++) {
|
|
var layer = avatar.baseAnimationLayers[i];
|
|
if (layer.type == VRCAvatarDescriptor.AnimLayerType.FX) {
|
|
fxLayers.Add(layer.isDefault ? null : layer.animatorController);
|
|
fxLayerIds.Add(i);
|
|
fxLayerDefault.Add(layer.isDefault);
|
|
}
|
|
}
|
|
|
|
if (fxLayers.Count > 1) {
|
|
var uniqueFx = fxLayers
|
|
.Where(l => l != null)
|
|
.Distinct()
|
|
.ToList();
|
|
if (uniqueFx.Count > 1) {
|
|
throw new VRCFBuilderException(
|
|
"Avatar contains more than one unique FX playable layer." +
|
|
" Check the Avatar Descriptor, and remove the FX controller that shouldn't be there.");
|
|
}
|
|
var allDefault = fxLayerDefault.All(a => a);
|
|
foreach (var id in fxLayerIds) {
|
|
var layer = avatar.baseAnimationLayers[id];
|
|
if (id == fxLayerIds[0]) {
|
|
layer.type = VRCAvatarDescriptor.AnimLayerType.Action;
|
|
layer.isDefault = true;
|
|
} else if (allDefault) {
|
|
layer.isDefault = true;
|
|
layer.animatorController = null;
|
|
} else if (id == fxLayerIds[1]) {
|
|
layer.isDefault = false;
|
|
layer.animatorController = uniqueFx.Count > 0 ? uniqueFx[0] : null;
|
|
} else {
|
|
layer.isDefault = false;
|
|
layer.animatorController = null;
|
|
}
|
|
avatar.baseAnimationLayers[id] = layer;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|