Search Unity

DOTween (HOTween v2), a Unity tween engine

Discussion in 'Assets and Asset Store' started by Demigiant, Aug 5, 2014.

  1. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    Placing "independent" as an additional option instead than an UpdateType allowed me to keep the same performance, because I can still avoid switches (which are slower than a 2-state if-else if used correctly) ;)
     
  2. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    Hi again, lzitmee!
    Was curious, if dotween would work with 2dtoolkit? Say, i need to play with sprite's transparency, what's the easiest way to do that?
     
  3. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    Hi!

    I love 2D Toolkit and indeed DOTween works with it (I'm also thinking of making a separate DLL with specific shortcuts for it in the future).

    Right now, to tween a sprite's alpha you can use the generic ToAlpha:
    Code (csharp):
    1. // Tween a sprite's alpha to 0 in 1 second
    2. DOTween.ToAlpha(()=> mySprite.Color, x => mySprite.color = x, 0, 1);
    If I make that 2D Toolkit DLL, you will be able to do this instead:
    Code (csharp):
    1. mySprite.FadeTo(0, 1);
     
    Stanislav-Botev likes this.
  4. RichHurst

    RichHurst

    Joined:
    Jul 25, 2013
    Posts:
    30
    @Izitmee Hey, just another annoying request from me, but is it possible to have DOLocalMove shortcuts for rigidbodies too? Im implementing a new system and have found the need for it... Sorry, completely understand if you think this is customising the library too much to my specific needs, but thought I would ask anyway.
     
  5. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    //I'm also thinking of making a separate DLL with specific shortcuts for it in the future

    Sounds great!
    I'm in, even if it would be not free, your support is amazing ;)
     
  6. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @RichHurst Added to my TODO list. I'm fixing some bugs I discovered with complex Sequences and then I'll try to implement that ;)

    @VeTaL Thanks for the appreciation :)
     
  7. RichHurst

    RichHurst

    Joined:
    Jul 25, 2013
    Posts:
    30
    @Izitmee you are a legend, thank you!
     
  8. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @RichHurst I am afraid I missed the opportunity of being a legend :( I personally never animated a localPosition of a Rigidbody, and now that I was trying to do it, I realized why Unity implements only rigidbidy.MovePosition and not also rigidbody.MoveLocalPosition. The thing is, Unity highly discourages moving the local position of a rigidbody, so much that trying to use MovePosition on a child whose parent (with a rigidbody too) is actually moving won't even work.
    So, in short, the only effective way to tween the localPosition of a rigidbody is to tween its transform. Though Unity recommends one should actually NEVER touch the localPosition of a rigidbody.
     
  9. RichHurst

    RichHurst

    Joined:
    Jul 25, 2013
    Posts:
    30
    @Izitmee haha ok not to worry and I still consider you a legend... I think to be honest, for what I need I can just record the position originally and work it out from there. Again, its probably my misunderstanding of what a true localPosition is supposed to be used for.
     
  10. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    Whew, thank you!!! :)
     
  11. ma.parizeau

    ma.parizeau

    Joined:
    Mar 21, 2010
    Posts:
    116
    Hi,

    When I'm loading a scene for the past 2 or 3 days, i'm getting this error (I've updated to the latest version but still same problem.)

    get_isEditor can only be called from the main thread.
    Constructors and field initializers will be executed from the loading thread when loading a scene.
    Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.


    In this particular scene, I use it in 2 different scripts. At first, I only initialized it in one script, then tried to do it in both but I'm still getting the error.

    It seems to be happening when I use Application.LoadLevel("levelname");

    If I load the level directly, I don't get the error.
     
  12. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    Oops I know what that is. I might be a little stumped this weekend, but I should be able to release a fix.
     
  13. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    A warning. I found out (thanks to Sasha Z) that the ChangeStart/End/Values methods generate errors with AOT on iOS. I fixed that and will release a new update (with some other important things) in the next couple days.
     
  14. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    NEW UPDATE 0.8.530
    • Optimization of WaitFor coroutines
    • CHANGE: All From versions of shortcuts and generic tween methods have been replaced by a simple From(bool isRelative) that can be chained to Tweeners, and that will immediately set the target to the "From" starting position
    • BUGFIX: Fixed ChangeStart/End/Values methods not working with AOT/iOS
    • BUGFIX: Fixed SetDelay not being used correctly inside Sequences
    • BUGFIX: Fixed Sequences not working correctly with Goto/Restart/Rewind unless the Sequence had been played once
    • BUGFIX: Fixed errors when reloading a scene
    BEWARE THE API CHANGE!
    No more From alternate version for each shortcut or generic way, but a common From chained method for everything (this was a necessary change to make FROM tweens work correctly with Sequences).


    @ma.parizeau this update also fixes your issue ;)
     
    Last edited: Sep 20, 2014
    VeTaL likes this.
  15. RichHurst

    RichHurst

    Joined:
    Jul 25, 2013
    Posts:
    30
    @Izitmee Sorry to be the bearer of bad news but unless I'm mistaken, it looks like the latest update has broken the DoLocalMoveX/Y/Z transform shortcuts... The 0.8.530 version says they don't exist where as if I revert to 0.8.260 the error goes away...
     
  16. ma.parizeau

    ma.parizeau

    Joined:
    Mar 21, 2010
    Posts:
    116
    Installed the new version and everything world fine on my side thanks, because I have a build to ship today :)
     
  17. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @ma.parizeau Woah you should've told me about the shipping. I released yesterday just because I'm a nerd, but I planned to release this afternoon. Glad I could be on time :)

    @RichHurst Bad news are always welcome, because bugs... must... be.. CRUSHED! Arargh! :D But in this occasion, I think maybe you are missing DOLocalMoveX/Y/ZFrom and not the regular DOLocalMoveX/Y/Z? I just checked and those are there, working as usual.
     
  18. RichHurst

    RichHurst

    Joined:
    Jul 25, 2013
    Posts:
    30
    @Izitmee you are correct, I'm sorry, and its doubly annoying as I was looking at the From notes in the changes but didn't see it on the error notice... Apologies for being a complete idiot, feel free to slap me in the face for waisting your time!
     
  19. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @RichHurst Don't be so evil with yourself, those things happen when the API changes :p And that's why the API shouldn't change (which by the way probably won't happen anymore: I implemented DOTween in Goscurry and it works perfectly, so I'll probably change DOTween's status to beta next week).
     
  20. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    <STRIKE>Seems something is broken in the last build: after i updated, DOLocalMoveXFrom() are not able to be found.</STRIKE>
    [that should be strikeout text]
    Just checked the latest update, sorry :)

    Another issue (why i started to update to the latest version): i'm placing cards all over the screen and trying DOMoveY/ DOLocalMoveY, but in both cases they started moving from the same Y (seems it is set globally, not locally) - can you, please, check that out?

    UPD: hm, now it seems to work fine :)
     
    Last edited: Sep 22, 2014
  21. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    Yey, glad you solved it all already :)
     
  22. gpvd

    gpvd

    Joined:
    Nov 2, 2013
    Posts:
    78
    Hi Izitmee,

    I have a question regarding pooling for DOTween;

    I have N instances of an object stored in an object pool. (enemies, bullets etc...)
    I would like prepare DOTween to be sure that the tweens to be used intensivly are pooled in DOTween before
    using for the first time.


    Is it possible for you to implement some nice prepare pool functions?

    E.g. DoTween.AddPool(Tween, 260); // Where 260 = N instances of the tween/ sequence

    I think i already could set this up by instantiating the tweens and set immediatly to completed, but some specific setup functions would be nicer.(So that i won't miss anything)

    Oh and btw, great package!

    Greetz,

    G
     
  23. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    public void OnTap()
    {
    gameObject.transform.DOPunchScale (newVector3(0.2f,0.2f,0f), 0.2f, 5, 0.2f);
    }

    Is there any way to block new punch before previous is done, or should it be done on my side by design? If to tap item too often and too long, its scale would increase and never return back.
     
  24. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @gpvd It's actually not as simple as that, because a Rotation tween is different from a Position tween so they're pooled differently. Still, I could add a way to add the desired types of tweens to the pool. Added to my TODO list.

    @VeTaL Instead than creating a new tween each time, you could create it once (with autoKill disabled) and simply restart it when you tap, thus preventing tweens starting with values taken by previously running tweens. Also, it's much more efficient:
    Code (csharp):
    1. Tween tapPunch;
    2. void Start()
    3. {
    4.     tapPunch = gameObject.transform.DOPunchScale(new Vector3(0.2f,0.2f,0f), 0.2f, 5, 0.2f).SetAutoKill(false).Pause();
    5. }
    6. public void OnTap()
    7. {
    8.     tapPunch.Restart();
    9. }
     
  25. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    Seems legit. Thanks :)

    Can i disable autokill by setting
    DOTween.Init (false);
    ?

    PS: and what about From() call - its easier to add it when its needed and not to add it when not needed:
    .Insert(0, transform.DOScale(newVector3(0.1f, 0.1f, 0.1f), 0.3f).From ())
    .Insert(0, transform.DOScale(newVector3(0.1f, 0.1f, 0.1f), 0.3f))

    than to write it
    .Insert(0, transform.DOScale(newVector3(0.1f, 0.1f, 0.1f), 0.3f).From (true))
    .Insert(0, transform.DOScale(newVector3(0.1f, 0.1f, 0.1f), 0.3f).From (false)) // default anyway

    PPS: as for tapPunch, it would be even better to create it once and apply it to different gameobjects ;)

    PPPS: and how can i cache sequences? I'm trying it like

    privateTweentapTween;
    privateSequenceplaceAtSequence;

    voidStart()
    {
    tapTween = gameObject.transform.DOPunchScale (newVector3(0.2f,0.2f,0f), 0.2f, 5, 0.2f).SetAutoKill(false).Pause();

    placeAtSequence = DOTween.Sequence ()
    .Append(transform.DOLocalMoveY(4f, 0.4f, false).From (true))
    .Insert(0, transform.DOScale(newVector3(0.1f, 0.1f, 0.1f), 0.3f).From (true))
    .Insert(0, DOTween.ToAlpha(()=> sprite.color, x => sprite.color = x, 1, 0.5f))
    .Insert(0.3f, transform.DOPunchScale (newVector3(0.1f,0.1f,0f), 0.2f, 5, 0.1f))
    .SetAutoKill(false).Pause();
    }

    publicvoidPlaceAtAnimated(IntVector2destination)
    {
    GridPosition = destination;
    gameObject.transform.SetPosition2ByCellIndex (destination);

    placeAtSequence.Restart ();
    }

    but i see nothing (alpha is still zero, and sequence seems not to run at all)

    PPPPS: :) and how can i pass parameters to a tween?
    dragTween = gameObject.transform.DOMove (newVector3 (screenPos.x, screenPos.y), 0.1f, false).SetAutoKill (false).Pause ();
     
    Last edited: Sep 23, 2014
  26. gpvd

    gpvd

    Joined:
    Nov 2, 2013
    Posts:
    78
    Thanks for looking into it.

    G
     
  27. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @VeTaL Recycling and autoKill are two different things. Recycling tells DOTween what to do when a tween is killed. IF you want to completely disable autoKill, you can do this:
    Code (csharp):
    1. // Disables autoKill for newly created tweens after this setup
    2. DOTween.defaultAutoKill = false;
    But I don't recommend it: autoKill is pretty useful, and it's better to disable it tween by tween only when necessary.

    PS The relative bool parameter inside the From is optional and defaults to FALSE, so you can indeed write only From() if you don't need it TRUE ;)

    PPPS You're caching your Sequence correctly, so it should work. Are you sure you're not killing it somewhere else, or that maybe your gameObject/MonoBehaviour is disabled and thus Start is not called?

    PPPPS You just chain the parameters. For example, to set the Ease:
    Code (csharp):
    1. dragTween = gameObject.transform.DOMove (newVector3 (screenPos.x, screenPos.y), 0.1f, false).SetAutoKill (false).Pause ().SetEase(Ease.OutQuint);
     
  28. Seith

    Seith

    Joined:
    Nov 3, 2012
    Posts:
    755
    Hello, I'm trying to change the color of an Image component (on 4.6b18) by doing a:

    Code (CSharp):
    1. imageObject.GetComponent<Image>().DoColor(Color.white, .2f);
    But I get an error message saying:

    error CS1061: Type `UnityEngine.UI.Image' does not contain a definition for `DoColor' an... (etc)


    I must be doing something wrong but I don't know what... :)

    Update:
    Well after I fixed my typo (DoColor instead of DOColor) I now get another error message saying:

    error CS1929: Extension method instance type `UnityEngine.UI.Image' cannot be converted to `UnityEngine.Light'
     
    Last edited: Sep 23, 2014
  29. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    PPPS: yep.. i'll check it once more time

    PPPPS: i mean, to transfer parameters like
    newVector3 (screenPos.x, screenPos.y)


    PPPPPS: thanks a lot for help :)
     
  30. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @Seith that error log is very misleading (I'll have to see if I can do something about that), but the real reason for that log is that the compiler is clumsily telling you there's no shortcut for Image types. I just added it to my TODO list (should be done within tomorrow, but maybe a couple more days because first I have to finish a reworking of some internal logic and I'm not sure how long that'll take), but in the meantime you can use the generic method:
    Code (csharp):
    1. Image img = imageObject.GetComponent<Image>();
    2. DOTween.To(()=> img.color, x=> img.color = x, Color.white, 0.2f);
    @VeTaL I am completely confused by your PPPPS. Let's restart and explain me again :p
     
  31. Seith

    Seith

    Joined:
    Nov 3, 2012
    Posts:
    755
    Thank you Daniele, I'll do with the generic method for now!
     
  32. C5G

    C5G

    Joined:
    Sep 11, 2014
    Posts:
    1
    Hey, I'm new to the thread and Dotween but it looks great so far. I'm loving the speed.

    I have a feature request. I apologize if it's been stated before. I haven't gone through the entire thread yet.

    I would really love a DOTween.To method that takes in a Quaternion getter and setter AND a Quaternion endValue. You have a Vector3 endValue but where we are already using Quaterions it would be very nice to have.

    I know it's a simple effort on my part to use the .eulerAngles, just thought it might be something to think about adding.
     
  33. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    If to talk about PPPPS: imagine i have a card, user can drag it and sometimes (when conditions are not met) card should return to its base. That means, i should tween its position from its current position on the screen to its base position. That means, i should pass its screen position as parameter, because it can vary. Can i do that for the predefined tweens?
     
  34. gpvd

    gpvd

    Joined:
    Nov 2, 2013
    Posts:
    78
    Hello Izitmee,

    A little question about kill and recyclable:

    When Recyclable is set to true, what is the best way to abort a tween (no completion) and let it return to the tweens-pool?

    Do i understand correctly that Tween.Kill() NEVER returns it to the pool?

    Greetz,

    G
     
  35. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @C5G I could do that but only for shortcuts and not for the generic way. Meaning I would simply convert your Quaternion to a Vector3 internally (because the Qauternion plugin actually uses Vectors, since Quaternions themselves don't allow to rotate stuff more than 360°). Let me know if it's a viable/useful option and I'll add it.

    @VeTaL Maybe I'm still confused, but sure you can. When you create a tween and start it, the target's current value/position automatically becomes the starting value/position, so it will do what you're saying.

    @gpvd Nono. Kill will do one of these two things:
    • if the tween is set as recyclable, it will reset/clear the tween and return it to the pool
    • if the tween is set as NON recyclable, it will destroy it
    So if you set your tween as recyclable, killing it is the right way to return it to the pool :)
     
  36. gpvd

    gpvd

    Joined:
    Nov 2, 2013
    Posts:
    78
    Ok tnx.

    Greetz,

    G
     
  37. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    I mean, in our case
    1. Tween tapPunch;
    2. void Start()
    3. {
    4. tapPunch = gameObject.transform.DOPunchScale(new Vector3(0.2f,0.2f,0f), 0.2f, 5, 0.2f).SetAutoKill(false).Pause();
    5. }
    6. public void OnTap()
    7. {
    8. tapPunch.Restart()
    9. }
    If i have another method

    public void OnRelease()
    {
    var cardBasePosition = BasePositions[thisCardId];
    releaseMovement(); // how to pass cardBasePosition to pre-defined tween?
    }

    The question appears because i'm not clearly understand, how caching is working for tweens.

    And can you check sequences: just tried again to cache it, still no luck.
     
  38. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @VeTaL If you just want to change the start/end position of a tween, you can use one of these methods (but beware because they work only with Tweeners, not with Sequences).

    Sequence caching is working greatly: I'm using it all the time. If you still have the issue, create a sample barebone mini-project that reproduces it and attach it here, so I can check out what else might be wrong.

    P.S. There's an "Insert > Code" button on the upper Forum text bar, please use that when writing code here so we keep things as clear as possible :)
     
  39. neonblitzer

    neonblitzer

    Joined:
    Aug 5, 2013
    Posts:
    13
    I'm not a native English speaker by any means, but I've gathered the following information:
    In British English, backward and forward are adjectives (e.g. a forward momentum) while backwards and forwards are adverbs (e.g. to move forwards). In American English it's common to use the shorter forms (without the "s") for both meanings. In our case we are using the words as adverbs, so depending on whether you want to use the British convention or the American one, you can name them either with the "s" or without, BUT regardless I think it should be consistent across both forward/s and backward/s. ...And I think you'd be safer with the shorter forms, as AmE is pretty prevalent in internet anyway. :)

    Yeah, the link I gave was pretty confusing, I don't know why I included it. :D
    Here's a slightly better one: http://english.stackexchange.com/questions/109924/is-it-backward-forward-or-backwards-forwards

    I can see the properties and descriptions just fine, but what I can't see is the default value (DOTween.defaultAutoKill = true). It is included in the docs on your site but not shown in Visual Studio tooltips. Not a big issue, obviously, but still something.

    I'm sorry it took this long to reply. Anyway, great job with the library! I'll be happy to support you when the pro version becomes available. :)

    EDIT: In my previous post, I asked if tweener.ChangeEndValue should return the tweener. This would make it possible to fluently chain ChangeEndValue with a Play call. What do you think?
     
    Last edited: Sep 25, 2014
  40. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @neonblitzer Hi again!

    Ah that is a pretty straightforward explanation and you convinced me, thanks for the insight (I'm no native English speaker either). Since I'm still in alpha, I'll change PlayForwards to PlayForward in the next update, hoping no one kills me.

    About defaultAutoKill (and the rest) I see what you mean now. Will add the default value in the XML comment in the next update.

    About ChangeEnd/Start/Values, I already implemented what you asked: they return a Tweener since a while :)
     
  41. OnePxl

    OnePxl

    Joined:
    Aug 6, 2012
    Posts:
    307
    How about both? PlayForward and PlayForwards as an alias?
     
  42. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @OnePxl Now that is straight evilness: you're trying to make my head explode, are you? :D Jokes apart, since I'm still in alpha and it's a small API change which would be fixed very quickly by a Find/Replace in the code editor, I would prefer to just use one correct term. Unless you have a bigger point in which case tell me, but with gentleness :D
     
  43. OnePxl

    OnePxl

    Joined:
    Aug 6, 2012
    Posts:
    307
    Nah, it's just that APIs are always American English, so object.color, instead of object.colour; that's it. I like it when APIs allow for both uses.
     
  44. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @OnePxl Unity uses British English for some things instead: MonoBehaviour and not MonoBehavior. Then American for others (Color as you mentioned) :D
    That said, I prefer to have no aliases: they might generate confusion with IntelliSense (and thus users wondering if PlayForward and PlayForwards do different things even if the XML Comments are the same) plus having an alias would mean an overload, so one of those two methods would be slightly slower than the other. Very very very slightly, but still, since we're talking about a tween engine where every tiny bit of power should be used, I prefer to avoid that.
     
  45. gpvd

    gpvd

    Joined:
    Nov 2, 2013
    Posts:
    78
    Hi Izitmee,

    Earlier i asked if its possible for you to implement code to prefill the pool with the nessecary tweens.
    I solved it by using this piece of code:

    Code (CSharp):
    1.         //TODO Z TWEEN    [IMPL]    POOL TWEENS    Vector3 ,float Quaternion tweens pooled.
    2.         for(int i = 0; i < 300; i++)
    3.         {
    4.             Vector3 b = Vector3.zero;
    5.             Vector3 e = Vector3.zero;
    6.             DOTween.To(() => b, p => b = p, e, 0.1f);
    7.  
    8.             float bf = 0f;
    9.             float ef = 0.1f;
    10.             DOTween.To(() => bf, p => bf = p, ef, 0.1f);
    11.  
    12.             Transform bt = transform;
    13.             Quaternion eq = new Quaternion(0,0,0,0);
    14.             DOTween.To(() => bt.rotation, p => bt.rotation = p, eq.eulerAngles, 0.1f);
    15.  
    16.  
    17.         }
    Maybe its usefull to someone.

    Greetz,
    G
     
  46. yuewahchan

    yuewahchan

    Joined:
    Jul 2, 2012
    Posts:
    309
    Just read about the DOTween API, the most confused one is
    transform.DOMove(new Vector3(2,3,4), 1).From();
    I understand that it will have fewer functions, but I don't know which one don't support FROM version. DOMove, DOColor support, but DOShakePosition not support.

    why not .DOMoveTo(new Vector3(2,3,4), 1) and .DOMoveFrom((new Vector3(2,3,4), 1)) ?
     
    Last edited: Sep 27, 2014
  47. OnePxl

    OnePxl

    Joined:
    Aug 6, 2012
    Posts:
    307
    You're right.
     
  48. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @yuewahchan It was exactly as you mentioned until a couple updates ago. But a FROM tween needs to send stuff to its destination immediately while also asking if that FROM destination is relative or not, so it's much more logical to have it separate as it is now.

    P.S. the ones that don't support FROM are indicated in the documentation in red. Most of all, it's a matter of logic. If it doesn't make sense for an animation to have a FROM tween (like shakes, which start and end in the same exact position) then it hasn't.
     
  49. Ricks

    Ricks

    Joined:
    Jun 17, 2010
    Posts:
    650
    Small question (coming from iTween): is it possible to restrict the DOLookAt() rotation to one axis only?
     
  50. Demigiant

    Demigiant

    Joined:
    Jan 27, 2011
    Posts:
    3,242
    @Ricks No, but it's a good idea. Gonna implement it in the next update (should be out tomorrow if I manage to complete an optimization of the Sequences which is taking a huge amount of my time).