

UniRx(Unity用Reactive Extension)を使用して、  
カードリストのような画面を作成しようとしています。

個別のボタンであれば、ボタンと対になる処理を書けば良いので、  
クリック通知があったらSubscribeに〜する。といった書き方ができますが  
リスト構造の場合、ボタンが押されただけではどこのインデックスのボタンが  
押されかがわかりません。

.netの新しいバージョンであればObeservableCollectionなどが使えそうなのですが、  
Unityでは使用できませんでした。

MVPパターンで作成しているので、  
データのやり取りはあくまでModel側がおこない  
イベントやアクションなどはView側が受け持って  
Model側とView側のやり取りは、Presenter側に書きます。

ですので、どこのインデックスのボタンが押されたかは  
View側に書きたいのですが、どのように関連付ければ良いのかがわかりません。

考え方やサンプルソースなどを教えていただけないでしょうか？

追記：IndexOfを使って自分自身を検索するようにしようとしたのですが、  
ラムダ式の中で自分自身を渡す方法がわからず。  
IObservable`<Unit>`のUnitではなく、IObservable`<Unit>`を渡したい

[code]

    /// <summary>
    /// ボタンのリスト
    /// </summary>
    public List<Button> ButtonList = new List<Button>();
    /// <summary>
    /// ボタンイベント通知リスト
    /// </summary>
    List<IObservable<Unit>> abc = new List<IObservable<Unit>>();
    /// <summary>
    /// ボタン通知のハッシュリスト
    /// </summary>
    List<int> abcHash = new List<int>();
    
    void Start () 
    {
        abc.Add(ButtonList[0].OnClickAsObservable());
        abcHash.Add(abc[0].GetHashCode());
    
        abc.Add(ButtonList[1].OnClickAsObservable());
        abcHash.Add(abc[1].GetHashCode());
    
        abc.Add(ButtonList[2].OnClickAsObservable());
        abcHash.Add(abc[2].GetHashCode());
    
        abc.Add(ButtonList[3].OnClickAsObservable());
        abcHash.Add(abc[3].GetHashCode());
    
        foreach(IObservable<Unit> test in abc)
        {
            test.Subscribe(
                _ => ButtonClicked(abcHash.IndexOf(test自身のハッシュ値を取得したい)))
                );
        }
    }
    
    private void ButtonClicked(int index)
    {
        Debug.Log("index=" + index.ToString());
    }
    
[/code]


CC BY-SA 3.0
2015-10-02T17:43:49.133
17200
2015-12-05T04:19:21.383
2015-10-03T05:29:05.673
5261
5261
question
c# unity3d
Reactive Extensionを使用して、ボタンリストの何番目のボタンが押されたかを知るには


各ループ中の変数に`i`の値を代入しておけばラムダ式から参照できます。

[code]

    for(int i = 0; i < abc.Count; i++)
    {
        int n = i; // ループ内の変数に代入
        abc[i].Subscribe(
            _ => ButtonClicked(n)
            );
    
    }
    
[/code]

なお`i`のスコープは各ループの外であるため最終的に値が`abc.Count`となり、参照すると意図した動作にはなりません。


CC BY-SA 3.0
2015-10-02T21:31:29.500
17202
2015-10-02T21:31:29.500
5750
17200
answer


ViewはPresenterに何を渡すんですか？  
`List<Button>`ですか？  
`List<IObservable<Unit>>`ですか？

コードでpublicになっているので`List<Button>`で渡すとするなら、

[code]

    List<Button> buttonList = new List<Button>(){ new Button() , new Button() , new Button() };
    
    //------
    
    foreach(var x in buttonList)
    {
        x.OnClickAsObservable().Subscribe(_ => ButtonClicked(buttonList.IndexOf(x)));
    }
    
    buttonList[0].Click(); //-> index=0
    buttonList[1].Click(); //-> index=1
    buttonList[2].Click(); //-> index=2
    
[/code]

`List<IObservable<Unit>>`で渡そうとするなら  
そもそも通知したいのは「何番のボタンが押された」ですので、  
`IObservable<int>`で渡すほうがいいと思います。


CC BY-SA 3.0
2015-11-05T03:45:26.493
18418
2015-11-05T04:08:24.560
2015-11-05T04:08:24.560
13127
13127
17200
answer