Unity C # делегат получает локальный параметр неправильно - PullRequest
1 голос
/ 30 октября 2019

A for loop добавить N - при прослушивании щелчка по некоторым кнопкам.

При щелчке параметр, например, должен быть n, но иногда становится n + 1.

Другими словами, ожидается, что при нажатии кнопки с номером «n» делегату передается «n» в качестве параметра. Но на самом деле он становится 'n + 1' иногда передаваемым как параметр.

Я слышал, что анонимная функция должна копировать параметр в локальную переменную. Я сделал это до самого делегата. Но это не помогло.

public class StageMenuController : MonoBehaviour
{
...
public Button stageTemplate;
void Start()
{
// get stage count
numberOfStages = SceneManager.sceneCountInBuildSettings;

Transform container = stageTemplate.transform.parent;

for (int i = 0; i < numberOfStages; i++){

    Button stage = Object.Instantiate(stageTemplate, container);
    ...
    // stage number on the icon
    int j = i+1;

    stage.transform.Find("stageNumber")
    .gameObject.GetComponent<TextMeshProUGUI>().text 
    = (j).ToString("D2");

    ...
    int m = j;

    bool addTheListener(int k){
            int m = k;
            Debug.Log("AddListener scene " +m);
            stage.onClick.AddListener(delegate(){
                int n = m;
                Debug.Log("go to scene " +n);
                UnityEngine.SceneManagement.SceneManager.LoadScene(n);
            });
            return true;
    }
    var x = addTheListener(j);
}
...
}
...