public static string getFirstAttachmentName(SpineSlotAnimation spineSlotAnimation) { for (int i = 0; i < spineSlotAnimation.attachment.Count; i++) { if (!string.IsNullOrEmpty(spineSlotAnimation.attachment[i].name)) { return(spineSlotAnimation.attachment[i].name); } } return(""); }
public static void addSlotAnimationToClip(AnimationClip clip, Dictionary <string, SpineSlotAnimation> slotsAnimation, SpineData spineData, AttachmentGOByNameBySlot attachmentGOByNameBySlot) { foreach (KeyValuePair <string, SpineSlotAnimation> kvp in slotsAnimation) { string slotName = kvp.Key; string defaultAttachment = spineData.slotDefaultAttachments[slotName]; if (string.IsNullOrEmpty(defaultAttachment)) { continue; } SpineSlotAnimation slotAnimation = kvp.Value; if (slotAnimation.attachment != null && slotAnimation.attachment.Count > 0) { Dictionary <string, AnimationCurve> curveByName = new Dictionary <string, AnimationCurve>(); for (int i = 0; i < slotAnimation.attachment.Count; i++) { bool nullAttachment = false; SpineSlotAttachmentAnimation anim = slotAnimation.attachment[i]; if (string.IsNullOrEmpty(anim.name)) { anim.name = getFirstAttachmentName(slotAnimation); nullAttachment = true; } if (anim.name.Equals("")) { continue; } AnimationCurve enableCurve; if (curveByName.ContainsKey(anim.name)) { enableCurve = curveByName[anim.name]; } else { enableCurve = new AnimationCurve(); if (anim.time > 0.0f) { enableCurve.AddKey(KeyframeUtil.GetNew(0, 0.0f, TangentMode.Stepped)); } curveByName.Add(anim.name, enableCurve); if (i == 0 && !anim.name.Equals(defaultAttachment)) { AnimationCurve defSlotCurve = new AnimationCurve(); curveByName.Add(defaultAttachment, defSlotCurve); if (anim.time != 0.0f) { defSlotCurve.AddKey(KeyframeUtil.GetNew(0, nullAttachment ? 0 : 1, TangentMode.Stepped)); defSlotCurve.AddKey(KeyframeUtil.GetNew((float)anim.time, 0, TangentMode.Stepped)); } else { defSlotCurve.AddKey(KeyframeUtil.GetNew(0, 0, TangentMode.Stepped)); } } } enableCurve.AddKey(KeyframeUtil.GetNew((float)anim.time, nullAttachment ? 0 : 1, TangentMode.Stepped)); if (i < (slotAnimation.attachment.Count - 1)) { SpineSlotAttachmentAnimation nextAnim = slotAnimation.attachment[i + 1]; bool nullNextAttachment = false; if (string.IsNullOrEmpty(nextAnim.name)) { nextAnim.name = getFirstAttachmentName(slotAnimation); nullNextAttachment = true; } if (!nextAnim.name.Equals(anim.name) || nullNextAttachment) { enableCurve.AddKey(KeyframeUtil.GetNew((float)nextAnim.time, 0, TangentMode.Stepped)); } } } foreach (KeyValuePair <string, AnimationCurve> kvp2 in curveByName) { string attachmentName = kvp2.Key; AnimationCurve animationCurve = kvp2.Value; string attachmentPath = spineData.slotPathByName[slotName] + "/" + attachmentName.Replace("/", SLASH_REPLACEMENT); clip.SetCurve(attachmentPath, typeof(GameObject), "m_IsActive", animationCurve); } } if (slotAnimation.color != null && slotAnimation.color.Count > 0) { Debug.LogWarning("slot color animation is not supported yet"); } } }
public static string getFirstAttachmentName(SpineSlotAnimation spineSlotAnimation) { for (int i = 0; i < spineSlotAnimation.attachment.Count; i++) { if (!string.IsNullOrEmpty( spineSlotAnimation.attachment[i].name)) return spineSlotAnimation.attachment[i].name; } return ""; }