/// <summary> /// Connects the specified path to the current path adding transitions between them /// </summary> /// <param name="animationPath">Animation path to connect with current path</param> public void ConnectTo(AnimationPath animationPath) { var lastItem = this.items[this.items.Count - 1]; var nextItem = animationPath.items[0]; if (lastItem.ClipName != nextItem.ClipName) { var newItem = new AnimationPathItem(lastItem.ClipName + nextItem.ClipName, false, 1, 1f, true); animationPath.items.Insert(0, newItem); } }
/// <summary> /// Adds a new animation item to the animation path /// </summary> /// <param name="clipName">Clip name to play</param> /// <param name="loop">Loops</param> /// <param name="repeats">Number of iterations</param> /// <param name="timeDelta">Delta time to apply on this animation clip</param> private void Add(string clipName, bool loop, int repeats, float timeDelta) { AnimationPathItem prev = null; if (this.items.Count > 0) { //Gets last item prev = this.items[this.items.Count - 1]; } if (prev != null) { var transition = new AnimationPathItem(prev.ClipName + clipName, false, 1, timeDelta, true); items.Add(transition); } var newItem = new AnimationPathItem(clipName, loop, repeats, timeDelta, false); items.Add(newItem); }
/// <summary> /// Updates the current item /// </summary> /// <param name="item">Item to update</param> /// <param name="isLastItem">It's the last item in the path</param> /// <param name="nextTime">Next time</param> /// <param name="time">Current time</param> /// <param name="atEnd">Returns if the path is at end</param> /// <param name="t">Evaluated time</param> /// <returns>Returns false if the path has to stop or true if it has to continue</returns> private bool?UpdateItem(AnimationPathItem item, bool isLastItem, float nextTime, ref float time, out bool atEnd, out float t) { atEnd = false; t = item.TotalDuration; if (t == 0) { return(true); } if (item.Loop) { //Adjust time in the loop float d = nextTime - time; t = d % t; } time += t; if (time - t <= nextTime && time > nextTime) { //This is the item, stop the path return(false); } else if (item.Loop) { //Do loop, continue path return(true); } else if (nextTime >= time && isLastItem /*i == this.items.Count - 1*/) { //Item passed, it's the end item atEnd = true; return(false); } return(null); }