同じ問題を扱っているここにある投稿を見ましたが、何が問題なのかを説明したり、問題を解決したりすることはありません。
パネル内に多数のボタンを備えた Canvas プレハブを作成しました。実行時にプレハブをインスタンス化しButton
、パネル内のすべてのオブジェクトを取得しています。次に、同じメソッドonClick()
を呼び出しているすべてのボタンのイベントにリスナーを追加していますclicked()
public class GameOptions
{
private GameObject canvas;
public GameOptions(GameObject canvas)
{
this.canvas = canvas;
GameObject.Instantiate(canvas);
Text[] textObjects = canvas.GetComponentsInChildren<Text>();
Button[] buttonObjects = canvas.GetComponentsInChildren<Button>();
for (int i = 0; i < buttonObjects.Length; i++)
{
Debug.Log(buttonObjects[i].name);
buttonObjects[i].onClick.AddListener(() => clicked());
buttonObjects[i].onClick.Invoke();
}
}
public void clicked()
{
Debug.Log("Clicked!");
}
}
コードを介してイベントを呼び出すと、clicked()
が呼び出されて「クリックされました!」ということに注意してください。コンソールに正しく出力されます。
ただし、クリックしたときにイベントを発生させるボタンはありません。また、インスペクターの OnClick 内の PersistentCalls.Calls 配列には、実行時にすべてのボタンの要素が含まれていないことにも気付きました。
Windows 10 64 で Unity 2017.4.3f1 を使用しています。