2017-02-06 4 views
1

私は違うfunctionsお互いに電話したいと思っています。それらはすべてUIアニメーションで、回転用、1つはスケール用、もう1つは移動用などです。私はのチェーンにしたいので、coroutineの終わりに、何か他のものが購読されているとイベントが発生します。現在、私はのためにdelegatesを作成しなければならないでしょう。そのすべてはで、コードの拡張は耐えられなくなります。デリゲートを作成する方法 - またはデリゲートのコレクションを作成する方法 - そのイベントはさまざまな機能を発揮できますか?一つのデリゲートに異なる機能を集める

編集: 機能は互いに依存しません。移動は移動のみです。回転は回転するだけです。 MoveまたはRotateの1つのインスタンスのみが1つのコンポーネントに影響します。

+0

こんにちは@agiro関数はお互いの間に依存関係がありますか?たとえば、スケールを呼び出すには、回転前などを呼び出す必要がありますか? –

+1

ベースを 'MeEventArgs'にしてそれを派生させます(' MeTransformEventArgs')。 'MeEventHandler'は' public MeEventHandler'(MeEventArgs)、 'MeEventArgs(MeEventArgs)new MeTransformEventArgs(...))'のように使用できます。 –

+0

説明のために編集されました。 @ErickGallani – agiro

答えて

2

コルーチンの最後にコールバックが必要なようです。

IEnumerator _Move(Transform from, Transform to, float overTime, Action /*<Parameter>*/ onCompletion = null) 
{ 
    // Your current code 

    if(onCompletion!= null) 
    { 
     onCompletion(/*parameters*/); 
     //or loop through the events? 
    } 
} 

EDIT:added onCompletion = nullですので、デフォルトのパラメータがあります。

コールバックのパラメータリストが異なる可能性があることを考慮すると、さまざまなオーバーロードが発生します。一般的なコードは、すべての異なるオーバーロードで呼び出されるメソッドへの移動となり、最後の部分のみが異なることになります。

void MoveItem(Transform from, Transform to, float overTime) 
{ 
    float step = Vector2.Distance(original, to.position) * (Time.deltaTime/overTime); 
    from.position = Vector2.MoveTowards(from.position, to.position, step); 
} 
IEnumerator _Move(Transform from, Transform to, float overTime, Action onCompletion = null) 
{ 
    Vector2 original = from.position; 
    float timer = 0.0f; 
    while (timer < overTime) 
    { 
     MoveItem(from, to, overTime); 
     timer += Time.deltaTime; 
     yield return null; 
    } 
    if(event != null) 
    { 
     event(); 
    } 
} 

    IEnumerator _Move(Transform from, Transform to, float overTime, Action <float>onCompletion = null) 
{ 
    Vector2 original = from.position; 
    float timer = 0.0f; 
    while (timer < overTime) 
    { 
     MoveItem(from, to, overTime); 
     timer += Time.deltaTime; 
     yield return null; 
    } 
    if(event != null) 
    { 
     event(10.0f); 
    } 
} 

あなたがいずれかを渡すことができますので、あなたはMoveItemメソッドのデリゲートを提供するために、柔軟性をプッシュすることができ(移動の形状は、線形、指数関数のいずれでもよい)。

+0

情報をありがとう、完全にはありません。最後に別のアニメーションを使用する場合も使用しない場合もあるので、何もしないコールバックを扱う方法はわかりません(ヌルを渡しますか?) – agiro

+1

はい、nullを渡すか、このケースを考えるために答えを更新する)。デリゲートがnullの場合、デリゲートは呼び出されません。 – Everts

+0

ありがとうございます。今私は何をすべきかを知っていました。もし他の関数を呼び出すしかなかったのですが、私は多くのパラメータを持っていました。可能性ごとに異なる '_Move'関数を使用しますか? – agiro

1

私のコメントをやや詳細な形で説明します。

あなたはあなたのコードから発射するグローバル(1)EventHandlerを行うことができます。

public abstract class MeEventArgs 
{ 
    // nothing in here or some common fields/properties 
} 

次あなたはその上から派生:あなたは基本にMeEventArgsクラスを作る必要があります期待どおりその後

public delegate void MeEventHandler(object sender, MeEventArgs e); 

あなたの好きなように:

public sealed class MeTransformEventArgs 
    : MeEventArgs 
{ 
    public bool SuccesfullyTransformed { get; set; } 
    public Vector3 PreviousPosition { get; set; } 
    public Vector3 NewPosition { get; set; } 
} 

同じ回転T:

public sealed class MeRotationEventArgs 
    : MeEventArgs 
{ 
    public bool Successfull { get; set; } 
    public Quaternion FromAngle { get; set; } 
    public Quaternion ToAngle { get; set; } 
} 

そして、他の人と同じ...

今、あなたは次のようにあなたのイベントを行うことができます。

public event MeEventHandler MeEvent; 

そして、あなたは、このイベントを発生したいとき:

MeEvent(this, (MeEventArgs)new MeTransformEventArgs() { SuccesfullyTransformed = false, PreviousPosition = Vector3.zero, NewPosition = Vector3.zero }); 

次に、これらを使用してキャッチします:

void WhenEventFired(object sender, MeEventArgs e) 
{ 
    if(e is MeTransformEventArgs) 
    { 
     MeTransformEventArgs eArgs = (MeTransformEventArgs)e; 
     // do something with event. 
    } 
} 
+0

こちらもご協力いただきありがとうございます。実際には両方の答えが意味をなさないので、このページをブックマークとしてマークし、両方から多くを学びました。 – agiro

+0

私はなぜ、「送信者」が必要なのでしょうかと聞くことがありますか?私は、この解決策が非常に正確なところに何か他のものを実装しています。なぜ私たちはそれを渡す必要があるのか​​分からない、あなたは私に教えてくれますか? – agiro

+1

正直言って、送信者を指定する必要はありません。しかし、そのアイデアは、このイベントを送信したオブジェクトを認識することです。 3つの送信者が同じハンドラを呼び戻すことを想像してみましょう。送信者を認識して識別できるようにするには、送信者を参照する必要があります。 –

0

デリゲートまたはデリゲートのコレクションを作成するにはどうすればよいですか? - そのイベントはさまざまな機能を発揮できますか?

マルチキャストの代理人。

Action onCompletion = SomeMethod; 
onCompletion += SomeOtherMethod; 
// Now the delegate will call both methods when invoked. 
StartCoroutine(_Move(..., onCompletion)); 

文字通り、デリゲートのコレクションを作ることができます。 List<Action>

関連する問題