2016-10-21 8 views
1

onClickボタンにメソッドを追加するとき、関数の引数は常にconst = array of buttons.length + 1です。どこで私は間違えましたか?C#Unity onClickイベントの関数の間違った引数

all_buttons空ではありません。私は3つの異なるボタンをクリックした。 ユニティログスクリーンショット:link

Button[] all_buttons = GetComponentsInChildren<Button>(); 
for (int i = 0; i < all_buttons.Length; i++) { 
    Debug.LogWarning(all_buttons[i]+" => addLoad with index "+ (m_LvlStartIndex + i)); 
    if (levelScript) 
     all_buttons[i].onClick.AddListener(() => Load(m_LvlStartIndex+i)); 
} 

public void Load(int level) { 
    Debug.LogWarning("Loading "+level+" level..."); 
    Application.LoadLevel(level); 
} 

アップデート:すべての 変更この

all_buttons[i].onClick.AddListener(() => Load(m_LvlStartIndex+i)); 

int tempI = i; 
all_buttons[i].onClick.AddListener(() => Load(m_LvlStartIndex+tempI)); 

のおかげ!

+0

すべてのイベントハンドラでパラメータとして 'm_LvlStartIndex + i'を渡します。これらのハンドラが実際に呼び出される時までに、 'i'は' all_buttons.Length'に等しくなります。したがって、 'm_LvlStartIndex'が1に等しい場合、パラメータはあなたが得ているものとまったく同じになります。 – Abion47

+0

@ Abion47どうしてやってもどうですか? forループが終了した後に 'i'がなくなったので、エラーが発生すると思いますか? – turnipinrut

+0

可能な複製:http://stackoverflow.com/questions/40156493/c-sharp-anonymous-function-scope-in​​-unity3d/40157738#40157738 – Hellium

答えて

1

問題のコード行にある:あなたがAddListener機能でそれを使用する前に、一時変数iに保存することになっている

all_buttons[i].onClick.AddListener(() => Load(m_LvlStartIndex+i)); 

。以下のコードはそれを修正する必要があります:

int tempI = i; 
all_buttons[i].onClick.AddListener(() => Load(m_LvlStartIndex+tempI)); 
1

閉鎖に問題があります(What are 'closures' in C#?を参照)。代わりにこれを試してみてください:

for (int i = 0; i < all_buttons.Length; i++) { 
    int index = i ; 
    if (levelScript) 
     all_buttons[index].onClick.AddListener(() => Load(m_LvlStartIndex+index)); 
} 
+0

基本的には、自分の答えをコピーして、 'tempI'変数の名前を' index'に変更し、それを答えにします。 – Programmer

+0

日付を確認する私の友人;) – Hellium

+0

私は最も古いバーをクリックし、私の答えは最も古いです。実際の日時が表示されるようになると、数日後に確認します。私が間違っている場合、私はお詫び申し上げます。 – Programmer

関連する問題