using System.Collections; using System.Collections.Generic; using UnityEngine; using SiegeSong; namespace SiegeSong { public class LipSyncKeyframe { public string FaceShapeKey { get; set; } public int ApplyPercentage { get; set; } public int FadeInDuration { get; set; } public int MaintainDuration { get; set; } public int FadeOutDuration { get; set; } } public class LipSync : MonoBehaviour { //"Male_phoneme_FV" //"Male_phoneme_PBM" //"Male_phoneme_ShCh" //"Male_phoneme_W" //"Male_phoneme_Wide" //"Male_TongueBack" //"Male_TongueRoof" //"Male_TongueTeeth" //"RaisedBrows" //"SmileLeft" //"SmileRight" //"Snarl" //"AngryBrows" //"Sniff" //"MouthWidth" public LipSyncKeyframe[] Keyframes; public int CurrentKeyframeIndex; public float CurrentKeyframeStartTimestamp; public Dictionary> FaceShapes () { var faceShapes = new Dictionary>(); var faceShape_AIU = new Dictionary(); faceShape_AIU.Add("Snarl", 0.078f); faceShape_AIU.Add("Male_phoneme_Wide", 0.514f); faceShape_AIU.Add("Male_phoneme_W", 0.486f); faceShape_AIU.Add("Male_phoneme_ShCh", 0.114f); faceShape_AIU.Add("Male_phoneme_PBM", 0.294f); faceShape_AIU.Add("Male_phoneme_FV", 0.176f); faceShapes.Add("AIU", faceShape_AIU); var faceShape_O = new Dictionary(); faceShape_O.Add("Snarl", 0.124f); faceShape_O.Add("Male_phoneme_Wide", 0.094f); faceShape_O.Add("Male_phoneme_W", 0.953f); faceShape_O.Add("Male_phoneme_ShCh", 0.114f); faceShape_O.Add("Male_phoneme_PBM", 0.176f); faceShape_O.Add("Male_phoneme_FV", 0.0f); faceShapes.Add("O", faceShape_O); var faceShape_E = new Dictionary(); faceShape_E.Add("Snarl", 0.223f); faceShape_E.Add("Male_phoneme_Wide", 0.596f); faceShape_E.Add("Male_phoneme_W", 0.486f); faceShape_E.Add("Male_phoneme_ShCh", 0.114f); faceShape_E.Add("Male_phoneme_PBM", 0.294f); faceShape_E.Add("Male_phoneme_FV", 0.176f); faceShape_E.Add("Male_TongueTeeth", 0.0f); faceShapes.Add("E", faceShape_E); var faceShape_CKGJRSXYZ = new Dictionary(); faceShape_CKGJRSXYZ.Add("Snarl", 0.227f); faceShape_CKGJRSXYZ.Add("Male_phoneme_Wide", 0.231f); faceShape_CKGJRSXYZ.Add("Male_phoneme_W", 0.314f); faceShape_CKGJRSXYZ.Add("Male_phoneme_ShCh", 0.0f); faceShape_CKGJRSXYZ.Add("Male_phoneme_PBM", 0.176f); faceShape_CKGJRSXYZ.Add("Male_phoneme_FV", 0.0f); faceShape_CKGJRSXYZ.Add("Male_TongueTeeth", 0.0f); faceShapes.Add("CKGJRSXYZ", faceShape_CKGJRSXYZ); var faceShape_DLNTH = new Dictionary(); faceShape_DLNTH.Add("Snarl", 0.102f); faceShape_DLNTH.Add("Male_phoneme_Wide", 0.267f); faceShape_DLNTH.Add("Male_phoneme_W", 0.855f); faceShape_DLNTH.Add("Male_phoneme_ShCh", 0.125f); faceShape_DLNTH.Add("Male_phoneme_PBM", 0.322f); faceShape_DLNTH.Add("Male_phoneme_FV", 0.063f); faceShape_DLNTH.Add("Male_TongueTeeth", 0.813f); faceShapes.Add("DLNTH", faceShape_DLNTH); var faceShape_WQOO = new Dictionary(); faceShape_WQOO.Add("Snarl", 0.03f); faceShape_WQOO.Add("Male_phoneme_Wide", 0.094f); faceShape_WQOO.Add("Male_phoneme_W", 0.953f); faceShape_WQOO.Add("Male_phoneme_ShCh", 0.114f); faceShape_WQOO.Add("Male_phoneme_PBM", 0.176f); faceShape_WQOO.Add("Male_phoneme_FV", 0.0f); faceShape_WQOO.Add("Male_TongueTeeth", 0.0f); faceShapes.Add("WQOO", faceShape_WQOO); var faceShape_MBP = new Dictionary(); faceShape_MBP.Add("Snarl", 0.0f); faceShape_MBP.Add("Male_phoneme_Wide", 0.0f); faceShape_MBP.Add("Male_phoneme_W", 0.0f); faceShape_MBP.Add("Male_phoneme_ShCh", 0.0f); faceShape_MBP.Add("Male_phoneme_PBM", 0.0f); faceShape_MBP.Add("Male_phoneme_FV", 0.0f); faceShape_MBP.Add("Male_TongueTeeth", 0.0f); faceShapes.Add("MBP", faceShape_MBP); var faceShape_FV = new Dictionary(); faceShape_FV.Add("Snarl", 0.0f); faceShape_FV.Add("Male_phoneme_Wide", 0.0f); faceShape_FV.Add("Male_phoneme_W", 0.0f); faceShape_FV.Add("Male_phoneme_ShCh", 0.0f); faceShape_FV.Add("Male_phoneme_PBM", 0.0f); faceShape_FV.Add("Male_phoneme_FV", 0.855f); faceShape_FV.Add("Male_TongueTeeth", 0.0f); faceShapes.Add("FV", faceShape_FV); return faceShapes; } public void PlayCurrentKeyframe () { var currentTimeStamp = Time.deltaTime; var startStamp = CurrentKeyframeStartTimestamp; var keyFrame = Keyframes[CurrentKeyframeIndex]; var progress = currentTimeStamp - startStamp; // how many milliseconds since the transition started var interpolationRatio = 1.0f; if (progress < keyFrame.FadeInDuration) { // fading in interpolationRatio = progress / keyFrame.FadeInDuration; } if (progress > keyFrame.FadeInDuration + keyFrame.MaintainDuration && progress < keyFrame.FadeInDuration + keyFrame.MaintainDuration + keyFrame.FadeOutDuration) { // fading out interpolationRatio = keyFrame.FadeOutDuration / progress; } if (progress < keyFrame.FadeInDuration + keyFrame.MaintainDuration + keyFrame.FadeOutDuration) { CurrentKeyframeIndex++; if (CurrentKeyframeIndex == Keyframes.Length) { CurrentKeyframeIndex = 0; } ResetCurrentKeyframeStartTimestamp(); } SetFaceShape(keyFrame.FaceShapeKey, interpolationRatio); } public void ResetCurrentKeyframeStartTimestamp() { CurrentKeyframeStartTimestamp = Time.deltaTime; } public void SetFaceShape(string shapeKey, float interpolationRatio) { var faceShapes = FaceShapes(); foreach (var shapeBlendKey in faceShapes[shapeKey].Keys) { var oldValue = GetCurrentBlendShapeValue(shapeBlendKey); var newValue = faceShapes[shapeKey][shapeBlendKey] * interpolationRatio; SetBlendShapeValue(shapeBlendKey, (oldValue + newValue) / 2); } } public void SetBlendShapeValue(string blendkey, float value) { } public float GetCurrentBlendShapeValue(string blendkey) { return 0; } void Start() { } void Update() { PlayCurrentKeyframe(); } } }