Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

LeanTween - A tweening engine that is up to 5x faster than competing engines!

Discussion in 'Assets and Asset Store' started by dentedpixel, Dec 3, 2012.

  1. eviltenchi_84

    eviltenchi_84

    Joined:
    Feb 18, 2010
    Posts:
    99
    additionally, that time param has to be a different integer altogether.
     
  2. eviltenchi_84

    eviltenchi_84

    Joined:
    Feb 18, 2010
    Posts:
    99
    bump. any suggestions? forced to use itween at the moment and it is a little heavy for my taste.
     
  3. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    The script seems to be running correctly. What is the movement you are looking to get? Are you trying to have them all move to a location that is relative to their starting positions? Remember the position for moveX is the absolute world position, not a relative position (I think this may be different in iTween). If you want that position to be relative just do something like:

    LeanTween.moveX(gameObject, startPos + left.transform.position.x, speed).setOnComplete(turnAround);
     
  4. bac9-flcl

    bac9-flcl

    Joined:
    Dec 5, 2012
    Posts:
    829
    I'm sorry if that was asked before, but is there any way to simulate inertia with LeanTween?

    Let's say I'm swiping between few different screens, doing simple transform position reassignments of the screen holder object on Update while you touch the UI and move your finger. But after you lift your finger, I need to tween the screen holder position to the closest valid point.

    Very easy to implement, but there is one problem - you have absolutely to way to get a smooth transition into that finishing motion by just using easings. If you have almost stopped your finger before lifting it, then InOut easings will look the most natural - and if you were moving your finger fast as you lifted it, then InOut easing will abruptly interrupt the motion and you're better off with Out (but Out tween will never replicate the exact speed as the starting point either).

    How can I solve this? I guess I need to find a way to define custom easing curve depending on the velocity of screen holder movement on the moment the finger is lifted? How can I do that from code?
     
    Last edited: Apr 6, 2014
  5. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi bac9-flcl,
    I have not done any tweening based on the initial intertia, but it seems like you have your finger on the main issues involved....

    I would probably just adjust the speed of the tween based on how fast the finger was moving before letting go (by measuring the distance between the last two touch points), and then use easeOut if it is continuing in that direction and and easeInOut if it is changing directions (or even easeInOutBack)...

    Those are just my initial thoughts on the idea though.
     
  6. bac9-flcl

    bac9-flcl

    Joined:
    Dec 5, 2012
    Posts:
    829
    Thanks! I ended up implementing it a bit differently. I already use distance to set the tween time (so that +64px centering won't take as long as centering performed from the edge of a screen), so using tween speed to match the velocity wasn't an option. Instead, I continuously calculate the velocity of the swipe and as it ends, use the last value of it to select the easing type.

    The most simple way of implementing it is by using just one threshold value and then selecting Out easing if velocity was higher, or InOut easing if it was smaller. Looks decent enough. For better detail though, I can prepare several custom animation curves (with shapes gradually changing to fit various initial velocity best) and then select the best of them through more complex check.
     
  7. eviltenchi_84

    eviltenchi_84

    Joined:
    Feb 18, 2010
    Posts:
    99
    You can see in the example that the cubes all slow down or speed up to wait for the rest of them to get to the target point. This is not what I wanted. They should simply go to the target position in world space and then run the oncomplete (turn around).
     
    Last edited: Apr 7, 2014
  8. thienhaflash

    thienhaflash

    Joined:
    Jun 16, 2012
    Posts:
    513
    Looking very cool indeed, but the KillDelaysCallTo (like TweenLite's) seems to be missing :) Would you please add that ?
     
  9. Tyoma

    Tyoma

    Joined:
    Jul 23, 2012
    Posts:
    9
    Hi,

    I'm having a hard time using onCompleteObject.
    I write my code as such

    LeanTween.moveY ( wordText.gameObject, wordText.transform.position.y, 0.25f ).setEase (LeanTweenType.punch).setOnComplete(reset).onCompleteObject(gameObject);

    but I keep getting nullreference errors when it comes to that onCompleteObject part.

    Is there something I'm just not getting?
    How does onCompleteObject work, exactly?
    I was unable to find any examples on how to use it anywhere.

    Please help ><

    [edit: if you see a space anywhere in my code it has nothing to do with the way I wrote it, it just appears that way on the forums =\]
     
  10. bac9-flcl

    bac9-flcl

    Joined:
    Dec 5, 2012
    Posts:
    829
    Can someone expain to me how .setEase (LeanTweenType.animationCurve) is supposed to be used? I'm don't really understand how you assign your curve to it, at all. It's not setEase (LeanTweenType.animationCurve = curve), it's not setEase (curve), it's not setEase (LeanTweenType.animationCurve.Equals (curve)). How should it be used? Unfortunately there are no examples of it in the docs.

    Edit: nevermind, it's setEase (curve), I was just extracting it with a method and forgot to add parenthesis to it.
     
    Last edited: Apr 10, 2014
  11. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi Thienhaflash,

    You can use LeanTween.cancel to kill all the delayedcalls to an object or delete them specifically based on their id. I hope that helps!
     
  12. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi Tyoma,

    I added an example of how to use onCompleteParam in the github version. You can see the code directly here (look at line 33):

    https://github.com/dentedpixel/Lean...ween/LeanTweenExamples/Scripts/PunchTester.cs

    Or download the whole project to see it in action.
     
  13. Eideren

    Eideren

    Joined:
    Aug 20, 2013
    Posts:
    309
    In your documentation, in the exemple at "LeanTween.moveSplineLocal" and "LeanTween.moveSplineLocal" the code piece given for C# contains some errors.
    Code (csharp):
    1. LeanTween.moveSpline(gameObject, new Vector3{Vector3(0f,0f,0f),Vector3(1f,0f,0f),Vector3(1f,0f,0f),Vector3(1f,0f,1f)}, 1.5f).setEase(LeanTween.easeOutQuad).setOrientToPath(true);
    this gives two errors, the first beeing that the path needs to be written like so
    new Vector3[Vector3(0f,0f,0f),Vector3(1f,0f,0f),Vector3(1f,0f,0f),Vector3(1f,0f,1f)]

    The second one comes from
    Code (csharp):
    1. .setEase(LeanTween.easeOutQuad)
    which gives " The best overloaded method match for `LTDescr.setEase(LeanTweenType)' has some invalid arguments ", dont know how to correct that one.

    Thanks a lot for giving this awesome stuff free though !
     
  14. bac9-flcl

    bac9-flcl

    Joined:
    Dec 5, 2012
    Posts:
    829
    Few potentially easy questions.

    1. Is there a way to make a LeanTween.value derivative that drops the requirement for the "from" argument and tweens from the current value?
    2. Is there a way to make a LeanTween.value derivative that will use a public variable as an argument instead of requiring a separate callback method? Something like LeanTween.value (gameObject, reference.variable, from, to, time), mostly for convenience sake when you'd rather not clutter a class with a dozen of additional methods.
     
  15. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    No problem! :)
    Thanks for the input, I will have that fixed on the next update to the documentation. You can fix the second issue by writing it like `.setEase(LeanTweenType.easeOutQuad)'
     
  16. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    - I would like to implement this, but currently do not see a good way to do so...
     
  17. exitsimulation

    exitsimulation

    Joined:
    Feb 10, 2014
    Posts:
    82
    Hello dentedpixel,

    I have a problem regarding your cool tweening engine.

    I'm trying to tween an objects position based on impulses in the music. The impulse detection works fine after some tweeking and I count the impulses in the debug.log. They are recognized as expected mostly.
    Now what I want Lean Tween to do is, tween the object forward fast and on complete return to the initial position. However everything I try gives me very jittery / stuttering movement. When a new impulse cancels the current tween the object often jumps around and it looks very ugly. Here is the according code:

    I tried tweeking the values and was even trying different ease types but nothing seems to help so far. :(
    I need animSpeedForw to be relatively fast so that the object kind of jumps to its target position on any impulse. The target position is also calculated by the strength of an impulse. Then with animSpeedBack the object is supposed to move back to its initial position very slowly (5-10 times slower than animSpeedForw).

    Do you have any clue what is going on? Am I using the cancel method in a wrong way or something like this?

    Thanks in advance!

    Edit:

    Here is a video of this stuttering. Now, it's running on low fps I know (due to the recording !!!!). But I guarantee you, it's the same stuttering with 60fps straight. What I'm referring to are those huge jumps back!

    https://www.youtube.com/watch?v=23yehPbUNrA&feature=youtu.be
     
    Last edited: Apr 16, 2014
  18. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi Monogon,

    Sorry, this is a bit confusing, I should make it more clear in the documentation. But in order to cancel a tween effectively you need to get the id of the tween when you animate it, not later on. So save a reference like this:

    int currenTweenId = LeanTween.moveLocal(gameObject, impulseVector, animSpeedForw).setEase(ltTypeForw).setOnComplete(moveBackToSpawn).id;

    Then you can cancel later like this:

    LeanTween.cancel(gameObject,currenTweenId); // you shouldn't even have to do any check either
     
  19. casperjeff

    casperjeff

    Joined:
    Apr 13, 2013
    Posts:
    333
    This one ate up a couple of hours....(awesome product nonetheless!!!!)

    around line 1521ish - need to reset tween.from.x.
    Worked fine in example scene/script but when you have other tweens before it, can go wonky.

    Code (csharp):
    1.  
    2. case TweenAction.ROTATE_AROUND:
    3.     tween.lastVal = 0.0f; // optional["last"]
    4.     tween.from.x = 0;
    5.     tween.origRotation = trans.eulerAngles; // optional["origRotation"
    6.     break;
    7.  
     
  20. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Thanks for the tip Casper, sorry it ate up a bunch of your hours, but at least this will save someone else from getting their hours eaten :)

    Just to be clear, it was the:
    tween.from.x = 0.0f;
    That was the fix, right? The code has changed a bit since the version you referenced.
     
  21. casperjeff

    casperjeff

    Joined:
    Apr 13, 2013
    Posts:
    333
    Yup...that were it.

    Love the library, btw - I switched from iTween and haven't looked back.....
     
  22. exitsimulation

    exitsimulation

    Joined:
    Feb 10, 2014
    Posts:
    82
    Hey dentedpixel,
    thanks for the clarification but that did not fix the stuttering. The dummy object keeps jumping back towards its initial position although it's supposed to move back slowly as I call the moveBacktoSpawn in the onComplete statement. :(

    What am I doing wrong? Could you please post a short example code how you would approach this:
    1. Tween object to a certain target position relatively fast (on a certain impulse or KeyCode or anything)
    2. Tween back slowly to spwan point after having reached the target position (OnComplete)
    3. When a new impulse is recognized during a tween, cancel the current tween and create a new tween forward from the current position

    It's quite simple I guess but I cannot fix the stuttering at this point...
     
    Last edited: Apr 24, 2014
  23. CyberMew

    CyberMew

    Joined:
    May 18, 2013
    Posts:
    23
    Is it normal for LeanTween.alpha to be affecting the whole GUI state when I am just inserting one LTRect for alpha tweening for that rect? Would it be better for me to tween a seperate float value instead?

    Also there's a few typos with the LeanTween.cancel comments: stated float but type is actually int
     
  24. MissingText

    MissingText

    Joined:
    Oct 15, 2013
    Posts:
    11
    Hello!

    I'm preparing to start trying out LeanTween in my C# project. I followed the readme file included with the asset and moved the script to the project root's Plugins folder, but it seems that this was preventing LeanTween from appearing in MonoDevelop. Ignoring the readme and leaving it in place seems to have resolved the issue.

    Cheers!
     
  25. jerotas

    jerotas

    Joined:
    Sep 4, 2011
    Posts:
    5,572
    Hi, I use Hotween currently. Is LeanTween faster or not? And can it do everything Hotween can do? Wondering if I should bother switching for my next project. Thanks!
     
  26. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi CyberMew,

    Yes, that is expected behavior unless you add the line:

    GUI.color = new Color(1.0f,1.0f,1.0f,1.0f);

    After the alpha tween area, check out the MenuExampleCSharp script to see that in action. Hopefully that solves your issue, but it could also be a bug as well so, let me know if that doesn't solve it....
     
  27. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Darn, sorry that didn't fix your issues. Would you mind sending over an example project? So I can look at how you put it together and offer suggestions (or possibly see if it is a bug with LeanTween).

    Thanks,
    Russ
     
  28. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Oh cool, I guess moving it to the plugins folder is only necessary, if you want to integrate it with JS code. That's a bummer MonoDevelop doesn't like it there though, silly Monodevelop
     
  29. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hey Jerotas,

    In my tests I saw a bit of a speed difference between LeanTween and HoTween, but I would say in 95% of circumstances you should be fine with HoTween. Only if you need to squeeze every last drop of performance out of your game for mobile or something would I think it be necessary to switch between the two...

    Video comparing Unity animation Engines:​

     
  30. Toonsylvania

    Toonsylvania

    Joined:
    Jun 1, 2010
    Posts:
    29
    Hi!

    I'm trying to achieve a cartoon-like spring/punch effect or something like squeeze and stretch.

    Actually, I 'd like to get something close to this behavior:
    Code (csharp):
    1. LeanTween.move(this.gameObject, new Vector3(0f,0f,1f), 1.0f).setEase(LeanTweenType.punch);
    but I don't want my gameObject Z position to change for various reasons.

    I'd like to use LeanTween.scale (or only scaleX), but unfortunately I can't get the same result.
    Any idea about how to do that?... :)
     
    Last edited: May 6, 2014
  31. thienhaflash

    thienhaflash

    Joined:
    Jun 16, 2012
    Posts:
    513
    It's definitely help ! Thanks a lot man. It's working great, just brilliant !!!
     
  32. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hey Toonsylvania,
    Yes, I have an idea of how to do this. You could do something like:

    LeanTween.moveX(this.gameObject, 1.0f, 1.0f).setEase(LeanTweenType.punch);

    or if you need both x,y:

    LeanTween.moveX(this.gameObject, 1.0f, 1.0f).setEase(LeanTweenType.punch);
    LeanTween.moveY(this.gameObject, 1.0f, 1.0f).setEase(LeanTweenType.punch);

    That will move the x, or y position while leaving the z-position intact.

    Cheers,
    Russ
     
  33. Toonsylvania

    Toonsylvania

    Joined:
    Jun 1, 2010
    Posts:
    29
    Thank you very much, Russ. That's perfect! :)
     
  34. bac9-flcl

    bac9-flcl

    Joined:
    Dec 5, 2012
    Posts:
    829
    Can someone post an example of using setOnComplete to, let's say, destroy a tweened GameObject? I'm afraid I don't understand how to create a System.Action required by that yet.

    There was an example here: http://forum.unity3d.com/threads/16...ines!/page22?p=1538999&viewfull=1#post1538999

    I don't think I get it why void methods from that example are accepted by setOnComplete, and why there is no System.Action type in sight while argument requested by it. Some of my methods weren't accepted like that so I'm not sure what I missed.
     
    Last edited: May 7, 2014
  35. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi Bac9,

    You could do something like:

    PHP:
    LeanTween.moveXgameObject1f1f).setOnCompletedestroyOnComp ).setOnComplete


    void destroyOnComp
    object p ){
      
    GameObject g = (GameObject)p;
      
    Destroy);
    }
     
  36. tellemstevedave

    tellemstevedave

    Joined:
    Jul 15, 2013
    Posts:
    21
    First I want to say thanks a bunch for LeanTween. It is really easy to use and it's fast. It's by far my favorite of the 3 major tweeners on Unity. We use it a ton! Please keep up the awesome work :)

    I have some questions / comments:

    1 - Is there a way to tween to and then back to where you start (in one call)? It feels like this should work if ping-pong is set but that doesn't work if the object doesn't loop. I do this all the time and it takes 4 lines.

    2 - I'd love color as a distinct tween types. I do these all the time and it becomes a little tedious to do value here.

    Thanks!
     
  37. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Thanks Tellemstevedave! I am glad it's working out so well for you :)

    1) I am not sure if I understand what you are trying to achieve, it seems like ping pong should do exactly the behavior you are describing... could you describe how it falls short of the behaviour you want? You will have to setRepeat( 2 ) to have it go there and then back.

    2) I hear you with the tween color, it's something I want to add as well, and it should be pretty easy to do, I will try and add this shortly...
     
  38. atharnouman

    atharnouman

    Joined:
    Jul 6, 2013
    Posts:
    5
    Many Thanks for LeanTween!!

    I am just trying to use LeanTween. I just want to know how to use onCompleteTarget or onComplete. Actually I am unfamiliar with the inner working of HashTables as I just know that HashTables are just key value pairs. I have gone through some old thread but still not clear on order of execution and under the hod processing. Like who will call the methods we just put in HashTable etc. It will be great if someone explain it in details.

     
  39. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi Atharnouman,

    I would suggest you ditch the hashtables alltogether and go with the new 2.0 style of passing values. Like:

    LeanTween.moveX(gameObject, 5f, 1f).setOnComplete( myEndingMethod ).setEase(LeanTweenType.easeInBack);

    Probably the best place to find more examples are in the examples folder provided with the project, you can also find examples in the documentation:

    http://dentedpixel.com/LeanTweenDocumentation/classes/LeanTween.html

    I hope that helps!
     
  40. tellemstevedave

    tellemstevedave

    Joined:
    Jul 15, 2013
    Posts:
    21
    Ahh this does work! I mistakenly was trying to use setLoopCount.

    I made a camera screen shake but it took a ton of code. I wanted a translate, unlike the rotate example. "Shake" as a tween type instead of an ease might be nice. Itween has a shake that allows you to specify a float for how far to shake from the vector.

    Here's my code in case anyone sees a shorter way of doing this:

    Code (csharp):
    1. void ShakeUntilTimeElapse()
    2.     {      
    3.         _xOffset = 0;
    4.         _yOffset = 0;
    5.         float eachShakeTime = shakeLength / shakeRepeats;
    6.         float newDelay = 0;
    7.         for (int i =0; i < shakeRepeats; i++)
    8.         {
    9.             float randomx = Random.Range(-shakeTranslation,shakeTranslation);
    10.             LeanTween.value( gameObject, UpdateXCallback, 0f, randomx, eachShakeTime / 2).setRepeat(2).setLoopPingPong().setEase(LeanTweenType.linear).setDelay(newDelay);
    11.  
    12.             float randomy = Random.Range(-shakeTranslation,shakeTranslation);
    13.             LeanTween.value( gameObject, UpdateYCallback, 0f, randomy, eachShakeTime / 2).setRepeat(2).setLoopPingPong().setEase(LeanTweenType.linear).setDelay(newDelay).setOnComplete(ReturnCameraTween);
    14.             newDelay += eachShakeTime;
    15.         }
    16.     }
    17.    
    18.     void UpdateXCallback( float val)
    19.     {
    20.         _xOffset = val;
    21.         gameObject.transform.position = originalCamPos + new Vector3(_xOffset, _yOffset, 0);
    22.     }
    23.    
    24.     void UpdateYCallback( float val)
    25.     {
    26.         _yOffset = val;
    27.         gameObject.transform.position = originalCamPos + new Vector3(_xOffset, _yOffset, 0);
    28.     }
     
  41. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Great! I am glad that fixed it.

    Here is a very short solution that shakes it based on location and not rotation:

    PHP:
    LeanTween.moveYgameObject1f0.2f).setEase(LeanTweenType.easeShake ).setLoopClamp().setRepeat(-1);
    LeanTween.moveXgameObject0.6f0.25f).setEase(LeanTweenType.easeShake ).setLoopClamp().setRepeat(-1);
    It does not switch it up with random variables though like your example, but I thought it might be helpful for people trying to get a camera shake in there quickly...
     
  42. burnner

    burnner

    Joined:
    Mar 2, 2013
    Posts:
    52
    Hello,
    I really like LeanTween but I am missing two functions that iTween offers.
    LeanTween.shake and LeanTween.CameraFadeTo, etc.
    It would be amazing if this functions would also find their way into LeanTween.
     
  43. Stragen

    Stragen

    Joined:
    Sep 5, 2012
    Posts:
    7
    Hi dentedpixel,

    I'm wondering if there is a way to set a speed variable rather than a time. So the object will move at 3 units per second (for example). This way if you have a tween for an object to always return to the same point, it doesn't matter how far away it is, it will always move at the same speed.

    I posted on your homepage and saw the response, however it's not exactly what I'm after. I don't want to ignore the Time.timeScale, but I want to use it as a speed multiplier.

    Right now I'd say time is 2 seconds, and if the distance is 100 units or 1 unit, it will take 2 seconds. (So 100 units will be incredibly fast.) I want to say 'Move at 3 units per second.' so the speed will be the same no matter the distance. Does that make sense?

    Thanks in advance for any help you can offer!
     
  44. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Duly noted Burnner, I will add these as some of the new features I am considering for the next version(s). It's also a public github project too, if anyone wants to try and take these on themselves :)
     
  45. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Oh right, I think I understand you now. There isn't any built in way to do this (and I think it would be overkill to provide one) but you can write this logic in your code by calculating the distance to the desired end, and then having the speed be a multiple of this distance. For example:

    PHP:
    float dist Vector3.Distance(other.positiontransform.position);
    float speed dist 0.05// multiply it by some fraction...
    LeanTween.move(gameObjectother.positionspeed);
    I hope that helps!
     
  46. Toonsylvania

    Toonsylvania

    Joined:
    Jun 1, 2010
    Posts:
    29
    Hmmm, I think Stragen wants to use its own speed, not calculate it. So it would radther look like this:
    Code (csharp):
    1.  
    2. float speed = 3f; // for 3 units/s
    3. float dist = Vector3.Distance(other.position, transform.position);
    4. float tweenDuration = dist / speed;  
    5. LeanTween.move(gameObject, other.position, tweenDuration );  
    6.  
     
  47. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Oh, good point, that is a more accurate example. Thanks!
     
  48. Stragen

    Stragen

    Joined:
    Sep 5, 2012
    Posts:
    7
    Oh, I can't believe I didn't think of that. Excellent suggestion, and your execution is perfect Toonsylvania.

    Thanks to both of you, got it spot on!
     
  49. FireMutant

    FireMutant

    Joined:
    Sep 2, 2013
    Posts:
    49
    Hi,

    Just getting my feet wet with Unity and of course LeanTween. It is a very nice asset, and I am grateful you shared it with us. I am using Unity 2D and setOrientToPath with LeanTween.move using an array of Bezier points. It works great except setOrientToPath seems to rotate the sprite on the Y axis to keep the gameObject oriented, but for 2D, turning it sideways makes the sprite invisible. Is there a way to "lock" rotation only to the Z axis?

    Thanks again!
     
    Last edited: Jun 2, 2014
  50. dentedpixel

    dentedpixel

    Joined:
    Jul 15, 2012
    Posts:
    683
    Hi FireMutant,

    Thanks! I am glad you are liking LeanTween :)

    I had not focused much on the 2d portion of the curve path tools, as I figured you could do it just similar to a 3d path but just keep it on 2 axises. The point you bring up about setOrientToPath sounds like a very good point, and makes me re-think not giving 2d specific options for the curve tools. So sorry, I don't have a solution right now, but I will take a look at it to see what I can come up with to help you and others using the 2d tools.

    Thanks,
    Russ