MultiState Callback Support
Akeit0 opened this issue · 3 comments
Akeit0 commented
以下のクラスを使えば、複数の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);
}
}
AnnulusGames commented
Stateに構造体を渡せない制約が存在する以上、複数State専用にライブラリ側でクラスを作成する意義は薄いと思います。(型制約を外せば渡すこと自体は可能ですが、ボックス化するためクロージャを受け入れる方が効率的です)
以上のような実装はライブラリ側ではなく、必要に応じて各自で拡張してもらう形で良いでしょう。
Akeit0 commented
そうですね
Unitask対応と同様にactionをラップすれば、同等の処理するができるので、クローズします
Akeit0 commented
一応スコアをtweenさせるときにformat指定できるのは、標準レベルで需要があると思います