Изучай
Closure чтобы таких непоняток не было. Решается просто:
void InitLevelTasks()
{
levelChooser = new LevelChooser(imageForLevelTask);
Transform root = PanelLevelsList;
foreach (Transform child in root) {
Destroy(child.gameObject);
}
int count = 48;
for (int k = 0; k < count; ++k) {
var clone = GameObject.Instantiate(buttonPrefab);
clone.transform.SetParent(root);
clone.transform.localScale = Vector3.one;
var button = clone.GetComponent<Button>();
text = button.transform.Find("Text").GetComponent<Text>();
text.text = ""+k;
int j = k;
UnityAction act = new UnityAction (() => SelectLevel_Start (j));
button.onClick.AddListener(act);
}
}
Т.е. делаешь временную переменную, которой присваиваешь текущее значение. И уже ее используешь в лямбда выражении