private void SetObject(SpriterAnimation anim, Transform characterRoot, bool lastFrame, float currentTime, float frameRate, Dictionary<string, AnimationCurve>[] curves, List<Component> processedSprites, ISpriterTimelineBone obj1, Dictionary<int, Transform> bones, Dictionary<int, Vector2> scales, SpriterMainlineBoneBase boneBase = null, SpriterMainlineObjectBase obj = null) { // Find the sprite object SpriterTimelineKey spriterTimelineKey = null; bool isTransient = false; string timelineName = null; int id = -1; var mainlineObjectRef = obj as SpriterMainlineObjectRef; var mainlineObject = obj as SpriterMainlineObject; if (mainlineObjectRef != null) { SpriterTimeline spriterTimeline = anim.timelines.Find(timeline => mainlineObjectRef.timeline == timeline.ID); spriterTimelineKey = spriterTimeline.keys.Find(key => key.ID == mainlineObjectRef.key); timelineName = spriterTimeline.name; id = mainlineObjectRef.ID; } if (mainlineObject != null) { timelineName = mainlineObject.name; id = mainlineObject.ID; isTransient = true; } var boneRef = boneBase as SpriterMainlineBoneRef; var bone = boneBase as SpriterMainlineBone; if (boneRef != null) { SpriterTimeline spriterTimeline = anim.timelines.Find(timeline => boneRef.timeline == timeline.ID); spriterTimelineKey = spriterTimeline.keys.Find(key => key.ID == boneRef.key); timelineName = spriterTimeline.name; id = boneRef.ID; isTransient = false; } if (bone != null) { timelineName = "trans_bone_"; id = bone.ID; isTransient = true; } //UISprite uiSprite = FindSpriteObject(characterRoot, obj1, timelineName, id); //var uiSprite = colorHelper.GetComponent<UISprite>(); int parent = -1; if (obj != null) parent = obj.parent; else if (boneRef != null) parent = boneRef.parent; else if (bone != null) parent = bone.parent; Transform parentT = characterRoot; Vector2 localScale = Vector2.one; if (parent != -1) { if (!bones.TryGetValue(parent, out parentT)) Debug.LogError("Parent " + parent + " does not exist"); scales.TryGetValue(parent, out localScale); } Transform animObj = FindObject(parentT, timelineName, id); Transform animSpriteObj = null; SpriterNGUIColorHelper colorHelper = null; animObj.localPosition = new Vector2(obj1.position.x * localScale.x, obj1.position.y * localScale.y); localScale.x *= obj1.scale.x; localScale.y *= obj1.scale.y; if (boneBase != null) { bones.Add(boneBase.ID, animObj); scales.Add(boneBase.ID, localScale); } var animKeyName = GetRelativeName(animObj, characterRoot); string animSpriteKeyName = null; //animObj.localScale = obj1.scale; var sprObj = obj1 as ISpriterTimelineObject; if (sprObj != null) { System.Diagnostics.Debug.Assert(obj != null, "obj != null"); colorHelper = FindChildSpriteObject(animObj, (ISpriterTimelineObject)obj1); animSpriteObj = colorHelper.transform; animSpriteKeyName = GetRelativeName(colorHelper, characterRoot); //set this here so that bones don't get screwed with animObj.localScale = localScale; Vector2 paddingTL; Vector2 paddingBR; Vector2 size; GetSpriteInfo(colorHelper, out paddingTL, out paddingBR, out size); float pW = paddingTL.x + paddingBR.x; float pH = paddingTL.y + paddingBR.y; float w = sprObj.targetFile.width - pW; float h = sprObj.targetFile.height - pH; Vector2 pivot = sprObj.pivot; //check if the pivot is the default if ((pivot - new Vector2(0, 1)).sqrMagnitude < 0.001f) { pivot = sprObj.targetFile.pivot; } colorHelper.transform.localRotation = Quaternion.identity; colorHelper.transform.localPosition = new Vector2(-pivot.x*sprObj.targetFile.width, (1 - pivot.y)*sprObj.targetFile.height) + new Vector2(paddingTL.x, -paddingTL.y); colorHelper.transform.localScale = new Vector3(w, h, 1); colorHelper.color = obj1.color; colorHelper.depth = obj.zIndex; } if (spriterTimelineKey != null) { float lastRot = animObj.localEulerAngles.z; float targetRot = ((obj1.angle + 180)%360) - 180; //TODO: fix rotation if (targetRot - 180 > lastRot) targetRot -= 360; if (targetRot + 180 < lastRot) targetRot += 360; /*if (spriterTimelineKey.spin != -1) { //clockwise while (targetRot < lastRot - 5) targetRot += 360; } else { //counterclockwise while (targetRot > lastRot + 5) targetRot -= 360; }*/ animObj.localRotation = Quaternion.Euler(0, 0, targetRot); } else animObj.localRotation = Quaternion.Euler(0, 0, ((obj1.angle + 180)%360) - 180); AnimationCurve currentCurveXPos; AnimationCurve currentCurveYPos; //AnimationCurve currentCurveZPos; AnimationCurve currentCurveXScale; AnimationCurve currentCurveYScale; //AnimationCurve currentCurveZScale; AnimationCurve currentCurveXRot; AnimationCurve currentCurveYRot; AnimationCurve currentCurveZRot; AnimationCurve currentCurveWRot; AnimationCurve currentCurveColorR = null; AnimationCurve currentCurveColorG = null; AnimationCurve currentCurveColorB = null; AnimationCurve currentCurveSpriteXPos = null; AnimationCurve currentCurveSpriteYPos = null; if (!curves[0].ContainsKey(animKeyName)) { // New object, create new animation curves currentCurveXPos = new AnimationCurve(); currentCurveYPos = new AnimationCurve(); //currentCurveZPos = new AnimationCurve(); currentCurveXScale = new AnimationCurve(); currentCurveYScale = new AnimationCurve(); //currentCurveZScale = new AnimationCurve(); currentCurveXRot = new AnimationCurve(); currentCurveYRot = new AnimationCurve(); currentCurveZRot = new AnimationCurve(); currentCurveWRot = new AnimationCurve(); curves[0].Add(animKeyName, currentCurveXPos); curves[1].Add(animKeyName, currentCurveYPos); //curves[2].Add(animKeyName, currentCurveZPos); curves[3].Add(animKeyName, currentCurveXScale); curves[4].Add(animKeyName, currentCurveYScale); //curves[5].Add(animKeyName, currentCurveZScale); curves[6].Add(animKeyName, currentCurveXRot); curves[7].Add(animKeyName, currentCurveYRot); curves[8].Add(animKeyName, currentCurveZRot); curves[9].Add(animKeyName, currentCurveWRot); } else { // Get the current animation curves currentCurveXPos = curves[0][animKeyName]; currentCurveYPos = curves[1][animKeyName]; //currentCurveZPos = curves[2][animKeyName]; currentCurveXScale = curves[3][animKeyName]; currentCurveYScale = curves[4][animKeyName]; //currentCurveZScale = curves[5][animKeyName]; currentCurveXRot = curves[6][animKeyName]; currentCurveYRot = curves[7][animKeyName]; currentCurveZRot = curves[8][animKeyName]; currentCurveWRot = curves[9][animKeyName]; } if (animSpriteKeyName != null) { if (!curves[0].ContainsKey(animSpriteKeyName)) { currentCurveSpriteXPos = new AnimationCurve(); currentCurveSpriteYPos = new AnimationCurve(); currentCurveColorR = new AnimationCurve(); currentCurveColorG = new AnimationCurve(); currentCurveColorB = new AnimationCurve(); curves[0].Add(animSpriteKeyName, currentCurveSpriteXPos); curves[1].Add(animSpriteKeyName, currentCurveSpriteYPos); curves[11].Add(animSpriteKeyName, currentCurveColorR); curves[12].Add(animSpriteKeyName, currentCurveColorG); curves[13].Add(animSpriteKeyName, currentCurveColorB); } else { currentCurveSpriteXPos = curves[0][animSpriteKeyName]; currentCurveSpriteYPos = curves[1][animSpriteKeyName]; currentCurveColorR = curves[11][animSpriteKeyName]; currentCurveColorG = curves[12][animSpriteKeyName]; currentCurveColorB = curves[13][animSpriteKeyName]; } AnimationCurve currentCurveToggle; if (!curves[10].ContainsKey(animSpriteKeyName)) { currentCurveToggle = new AnimationCurve(); curves[10].Add(animSpriteKeyName, currentCurveToggle); if (currentTime > 0) currentCurveToggle.AddKey(SteppedKeyframe(0, 0)); } else { currentCurveToggle = curves[10][animSpriteKeyName]; } int keyPos = currentCurveToggle.AddKey(SteppedKeyframe(currentTime, colorHelper.color.a)); if (keyPos > 0) { // Check if sprite was previously turned off if (currentCurveToggle.keys[keyPos - 1].value < 0.01f) { currentCurveToggle.AddKey(SteppedKeyframe(currentTime - (.001f/frameRate), 0)); } } } if (isTransient) { DuplicateLast(currentTime, frameRate, currentCurveXPos); DuplicateLast(currentTime, frameRate, currentCurveYPos); DuplicateLast(currentTime, frameRate, currentCurveXScale); DuplicateLast(currentTime, frameRate, currentCurveYScale); DuplicateLast(currentTime, frameRate, currentCurveXRot); DuplicateLast(currentTime, frameRate, currentCurveYRot); DuplicateLast(currentTime, frameRate, currentCurveZRot); DuplicateLast(currentTime, frameRate, currentCurveWRot); } currentCurveXPos.AddKey(LinearKeyframe(currentTime, animObj.localPosition.x)); currentCurveYPos.AddKey(LinearKeyframe(currentTime, animObj.localPosition.y)); currentCurveXScale.AddKey(LinearKeyframe(currentTime, animObj.localScale.x)); currentCurveYScale.AddKey(LinearKeyframe(currentTime, animObj.localScale.y)); currentCurveXRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.x)); currentCurveYRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.y)); currentCurveZRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.z)); currentCurveWRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.w)); if (animSpriteKeyName != null) { if (isTransient) { DuplicateLast(currentTime, frameRate, currentCurveColorR); DuplicateLast(currentTime, frameRate, currentCurveColorG); DuplicateLast(currentTime, frameRate, currentCurveColorB); DuplicateLast(currentTime, frameRate, currentCurveSpriteXPos); DuplicateLast(currentTime, frameRate, currentCurveSpriteYPos); } currentCurveColorR.AddKey(LinearKeyframe(currentTime, colorHelper.color.r)); currentCurveColorG.AddKey(LinearKeyframe(currentTime, colorHelper.color.g)); currentCurveColorB.AddKey(LinearKeyframe(currentTime, colorHelper.color.b)); currentCurveSpriteXPos.AddKey(LinearKeyframe(currentTime, animSpriteObj.localPosition.x)); currentCurveSpriteYPos.AddKey(LinearKeyframe(currentTime, animSpriteObj.localPosition.y)); } if (colorHelper != null) { colorHelper.color = lastFrame ? obj1.color : new Color(obj1.color.r, obj1.color.g, obj1.color.b, 0); // Mark as processed processedSprites.Add(colorHelper); } }