问题同上文,但发现音频文件过大时uLipSync会非常卡,WebGL会卡到10FPS……
using UnityEditor;
using UnityEngine;
using CrazyMinnow.SALSA;
using static CrazyMinnow.SALSA.ExpressionComponent;
public class AddSALSAComponent : EditorWindow
{
private GameObject selectedObject;
private AudioSource audioSource;
private SkinnedMeshRenderer skinnedMeshRenderer;
private Salsa salsa;
[MenuItem("Tools/AddSALSAComponent")]
public static void ShowWindow()
{
GetWindow<AddSALSAComponent>("模型添加口型动画组件");
}
private void OnGUI()
{
GUILayout.Label("选择模型:", EditorStyles.boldLabel);
selectedObject = EditorGUILayout.ObjectField(selectedObject, typeof(GameObject), true) as GameObject;
EditorGUILayout.Space();
GUILayout.Label("选择音源:", EditorStyles.boldLabel);
audioSource = EditorGUILayout.ObjectField(audioSource, typeof(AudioSource), true) as AudioSource;
EditorGUILayout.Space();
GUILayout.Label("选择口形动画SkinnedMeshRenderer:", EditorStyles.boldLabel);
skinnedMeshRenderer = EditorGUILayout.ObjectField(skinnedMeshRenderer, typeof(SkinnedMeshRenderer), true) as SkinnedMeshRenderer;
EditorGUILayout.Space();
if (GUILayout.Button("添加组件") && selectedObject != null && audioSource != null && skinnedMeshRenderer != null)
{
AddComponent();
}
}
private void AddComponent()
{
SALSA_Template_SalsaEventSubscriber sts = selectedObject.GetComponent<SALSA_Template_SalsaEventSubscriber>();
if (sts != null)
{
DestroyImmediate(sts);
}
sts = selectedObject.AddComponent<SALSA_Template_SalsaEventSubscriber>();
// 添加 QueueProcessor脚本
QueueProcessor queueProcessor = skinnedMeshRenderer.GetComponent<QueueProcessor>();
if (queueProcessor != null)
{
DestroyImmediate(queueProcessor);
}
queueProcessor = skinnedMeshRenderer.gameObject.AddComponent<QueueProcessor>();
// 添加 Emoter脚本
Emoter emoter = skinnedMeshRenderer.GetComponent<Emoter>();
if (emoter != null)
{
DestroyImmediate(emoter);
}
emoter = skinnedMeshRenderer.gameObject.AddComponent<Emoter>();
// 配置 Emoter脚本内容
emoter.queueProcessor = queueProcessor;
emoter.warnOnNullRefs = true;
InspectorControllerHelperData ichd = new InspectorControllerHelperData();
ichd.smr = skinnedMeshRenderer;
ExpressionComponent blink =
new ExpressionComponent("blink", 0.1f, 0.1f, 0.1f, false, false, false, false,
ExpressionType.Emote, LerpEasings.EasingType.CubicOut, ExpressionHandler.RoundTrip);
EmoteExpression ee = new EmoteExpression("emote", ichd, true, false, false, 0f);
ee.expData.components.Clear();
ee.expData.controllerVars.Clear();
ee.expData.components.Add(blink);
ee.expData.controllerVars.Add(ichd);
ee.isRandomEmote = true;
ee.isLipsyncEmphasisEmote = false;
emoter.useRandomEmotes = true;
emoter.randomChance = 0.5f;
emoter.NumRandomEmotesPerCycle = 1;
emoter.randomEmoteMinTimer = 2f;
emoter.randomEmoteMaxTimer = 3f;
emoter.lipsyncEmphasisChance = 1;
emoter.inspSalsaLinked = true;
emoter.inspStateFoldoutProcessing = true;
emoter.inspStateFoldoutSettings = true;
emoter.inspStateFoldoutEmotes = true;
emoter.inspSalsaLinked = true;
emoter.randomEmotes.Add(ee);
emoter.emotes.Clear();
emoter.emotes.Add(ee);
salsa = skinnedMeshRenderer.GetComponent<Salsa>();
if (salsa == null)
{
salsa = skinnedMeshRenderer.gameObject.AddComponent<Salsa>();
}
salsa.audioSrc = audioSource;
salsa.queueProcessor = queueProcessor;
salsa.emoter = emoter;
salsa.audioUpdateDelay = 0.09552f;
salsa.autoAdjustAnalysis = true;
salsa.silencePulseThreshold = 1;
salsa.loCutoff = 0.03f;
salsa.hiCutoff = 0.75f;
salsa.useAdvDyn = true;
salsa.advDynPrimaryBias = 0.5f;
salsa.useAdvDynJitter = true;
salsa.advDynJitterAmount = 0.1f;
salsa.advDynJitterProb = 0.2f;
salsa.globalFrac = 1;
salsa.useTimingsOverride = true;
salsa.globalDurON = 0.12f;
salsa.globalDurOFF = 0.07008f;
salsa.globalDurOffBalance = -0.416f;
salsa.originalUpdateDelay = 0.09552f;
salsa.globalNuanceBalance = -0.204f;
InspectorControllerHelperData ICHDA = new InspectorControllerHelperData();
InspectorControllerHelperData ICHDI = new InspectorControllerHelperData();
InspectorControllerHelperData ICHDE = new InspectorControllerHelperData();
InspectorControllerHelperData ICHDO = new InspectorControllerHelperData();
InspectorControllerHelperData ICHDU = new InspectorControllerHelperData();
ICHDA.smr = skinnedMeshRenderer;
ICHDI.smr = skinnedMeshRenderer;
ICHDE.smr = skinnedMeshRenderer;
ICHDO.smr = skinnedMeshRenderer;
ICHDU.smr = skinnedMeshRenderer;
LipsyncExpression LEA = new LipsyncExpression("A", ICHDA, 0f, true);
LEA.expData.components.Clear();
LEA.expData.controllerVars.Clear();
ExpressionComponent salsaExpressionComponent_A = new ExpressionComponent("a", 0.08f, 0f, 0.06f,
ExpressionType.Lipsync, LerpEasings.EasingType.CubicOut, ExpressionHandler.OneWay);
salsaExpressionComponent_A.durationOn = 0.2f;
salsaExpressionComponent_A.durationOff = 0.2f;
ICHDA.blendIndex = 1;
LEA.expData.components.Add(salsaExpressionComponent_A);
LEA.expData.controllerVars.Add(ICHDA);
salsa.inspCollectionDisplayMode = true;
LEA.trigger = 0;
LipsyncExpression LEE = new LipsyncExpression("E", ICHDE, 0.04f, true);
LEE.expData.components.Clear();
LEE.expData.controllerVars.Clear();
ExpressionComponent salsaExpressionComponent_E = new ExpressionComponent("e", 0.08f, 0f, 0.06f,
ExpressionType.Lipsync, LerpEasings.EasingType.CubicOut, ExpressionHandler.OneWay);
salsaExpressionComponent_E.durationOn = 0.2f;
salsaExpressionComponent_E.durationOff = 0.2f;
ICHDE.blendIndex = 2;
LEE.expData.components.Add(salsaExpressionComponent_E);
LEE.expData.controllerVars.Add(ICHDE);
salsa.inspCollectionDisplayMode = true;
LEE.trigger = 0;
LipsyncExpression LEI = new LipsyncExpression("I", ICHDI, 0.16f, true);
LEI.expData.components.Clear();
LEI.expData.controllerVars.Clear();
ExpressionComponent salsaExpressionComponent_I = new ExpressionComponent("i", 0.08f, 0f, 0.06f,
ExpressionType.Lipsync, LerpEasings.EasingType.CubicOut, ExpressionHandler.OneWay);
salsaExpressionComponent_I.durationOn = 0.2f;
salsaExpressionComponent_I.durationOff = 0.2f;
ICHDI.blendIndex = 3;
LEI.expData.components.Add(salsaExpressionComponent_I);
LEI.expData.controllerVars.Add(ICHDI);
salsa.inspCollectionDisplayMode = true;
LEI.trigger = 0;
LipsyncExpression LEO = new LipsyncExpression("O", ICHDO, 0.36f, true);
LEO.expData.components.Clear();
LEO.expData.controllerVars.Clear();
ExpressionComponent salsaExpressionComponent_O = new ExpressionComponent("o", 0.08f, 0f, 0.06f,
ExpressionType.Lipsync, LerpEasings.EasingType.CubicOut, ExpressionHandler.OneWay);
salsaExpressionComponent_O.durationOn = 0.2f;
salsaExpressionComponent_O.durationOff = 0.2f;
ICHDO.blendIndex = 4;
LEO.expData.components.Add(salsaExpressionComponent_O);
LEO.expData.controllerVars.Add(ICHDO);
salsa.inspCollectionDisplayMode = true;
LEO.trigger = 0;
LipsyncExpression LEU = new LipsyncExpression("U", ICHDU, 0.46f, true);
LEU.expData.components.Clear();
LEU.expData.controllerVars.Clear();
ExpressionComponent salsaExpressionComponent_U = new ExpressionComponent("u", 0.08f, 0f, 0.06f,
ExpressionType.Lipsync, LerpEasings.EasingType.CubicOut, ExpressionHandler.OneWay);
salsaExpressionComponent_U.durationOn = 0.2f;
salsaExpressionComponent_U.durationOff = 0.2f;
ICHDU.blendIndex = 5;
LEU.expData.components.Add(salsaExpressionComponent_U);
LEU.expData.controllerVars.Add(ICHDU);
salsa.inspCollectionDisplayMode = true;
LEU.trigger = 0;
salsa.visemes.Clear();
salsa.visemes.Add(LEA);
salsa.visemes.Add(LEE);
salsa.visemes.Add(LEI);
salsa.visemes.Add(LEO);
salsa.visemes.Add(LEU);
salsa.DistributeTriggers(LerpEasings.EasingType.SquaredIn);
sts.salsa = salsa;
}
}