AnnulusGames / LitMotion

Lightning-fast and Zero Allocation Tween Library for Unity.

Home Page:https://annulusgames.github.io/LitMotion/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

MultiState Callback Support

Akeit0 opened this issue · comments

以下のクラスを使えば、複数のStateにもZeroAllocationで対応できます。TMP_Text.SetText(string,float)などに有効でです。
ただ、現状ではDispose処理をOnCompleteActionに書く必要がありますが、
MotionCallbackDataにbool ShouldDisposeStateOnCompleteを持たせることで、Disposeができます。
ShouldDisposeStateOnCompleteとOnComplete時のDisposeを追加して良いでしょうか?

public class MultiState2 :IDisposable
{
    public object State1;
    public object State2;
    public object Action;
    static Stack<MultiState2> pool=new Stack<MultiState2>();
    public class MultiState2Invoker<T> where T:unmanaged
    {
        public static Action<T,object> GetAction()
        {
            return static (value, o) =>
            {
                var states = UnsafeUtility.As<object, MultiState2>(ref o);
                UnsafeUtility.As<object, Action<T, object, object>>(ref states.Action)
                    ?.Invoke(value, states.State1, states.State2);
            };
        }
    }
    public static MultiState2 Get()
    {
        if (pool.TryPop(out var node))
        {
            return node;
        }
        return new MultiState2();
    }
    
    public void Dispose()
    {
        State1 = null;
        State2 = null;
        Action = null;
        pool.Push(this);
    }
}

Stateに構造体を渡せない制約が存在する以上、複数State専用にライブラリ側でクラスを作成する意義は薄いと思います。(型制約を外せば渡すこと自体は可能ですが、ボックス化するためクロージャを受け入れる方が効率的です)
以上のような実装はライブラリ側ではなく、必要に応じて各自で拡張してもらう形で良いでしょう。

そうですね
Unitask対応と同様にactionをラップすれば、同等の処理するができるので、クローズします

一応スコアをtweenさせるときにformat指定できるのは、標準レベルで需要があると思います