【Unity】スクリプトからボタンに動的に処理を追加する方法

スポンサーリンク
Unity
スポンサーリンク

Inspectorからではなくスクリプトからボタン押下時処理を追加する方法です。

スポンサーリンク

引数なし

 
Button button;
...
void Test(){
button.onClick.AddListener(OnClickReceiveButton);
...
}
public void OnClickReceiveButton(){
    ...
}

引数あり

 
Button button;
...
void Test(){
button.onClick.AddListener(()=>OnClickReceiveButton(引数1,引数2,...));
...
}
public void OnClickReceiveButton(引数1,引数2,...){
    ...
}

ミッション機能における実装例

たとえばアプリでミッション報酬一覧などを動的に作りたい場合、リストに動的にミッションの行(報酬アイテムのアイコンと、受け取れるアイテムの数のテキストと、受け取りボタンのセット)を追加していく事になります。
追加したボタンには受け取り処理が割り当てられる事になります。また、そのメソッドには引数としてミッションIDを渡したいと思います。

 
public class MissionListManager : MonoBehaviour
{
    MissionManager mm;
    [SerializeField]
    GameObject missionListContent;//スクロールビューのcontent
    [SerializeField]
    GameObject missionRowPrefab;

    public void LoadList()
    {
        ClearList(missionListContent);//リストをクリア

        GameObject placedObject;

        //デイリーミッションを読み込み
        foreach (var v in mm.missions.Daily)
        {
            placedObject = Instantiate(missionRowPrefab) as GameObject;//ミッション行のプレハブのインスタンス
            placedObject.name = v.missionID.ToString();//ヒエラルキー上の名前をミッションIDにする
           
            placedObject.transform.SetParent(missionListContent.transform);//ヒエラルキー上の親を設定
            placedObject.transform.localScale = new Vector3(1f, 1f, 1f);

            //ミッションの内容をテキストに設定
            if (Application.systemLanguage == SystemLanguage.Japanese)
            {
                placedObject.transform.Find("MissionText").GetComponent<TextMeshProUGUI>().text = v.description;
            }
            else
            {
                placedObject.transform.Find("MissionText").GetComponent<TextMeshProUGUI>().text = v.description_En;
            }

            //アイテム個数を設定
            placedObject.transform.Find("MissionRewardNum").GetComponent<TextMeshProUGUI>().text = "×"+v.rewardValue.ToString();

            //サムネを設定
            var itemThumb = placedObject.transform.Find("MissionRewardBg/MissionRewardImg");

            //報酬画像を設定
            if (v.rewardType == "coin")
            {
                itemThumb.GetComponent<Image>().sprite = coinImage;
            }
            else if (v.rewardType == "stone")
            {
                itemThumb.GetComponent<Image>().sprite = stoneImage;
            }

            Button button = placedObject.transform.Find("Button").GetComponent<Button>();

            //ミッションIDが同じで達成してない
            if (mm.achievedDailyMissionList[v.missionID]==MissionManager.MissionState.NotAchieved)
            {
                button.interactable = false;
                if (Application.systemLanguage == SystemLanguage.Japanese)
                {
                    button.transform.Find("ReceiveText").GetComponent<TextMeshProUGUI>().text = "未達成";
                }
                else
                {
                    button.transform.Find("ReceiveText").GetComponent<TextMeshProUGUI>().text = "Not Achieved";
                }
            }//達成済み
            else if(mm.achievedDailyMissionList[v.missionID] == MissionManager.MissionState.Achieved)
            {
                button.onClick.AddListener(()=>OnClickReceiveButton(v.missionID));
            }//受け取り済み
            else if (mm.achievedDailyMissionList[v.missionID] == MissionManager.MissionState.Received)
            {
                //受け取り済みにテキストを変える
            }

        }
    }

    //報酬を貰う個別ボタン
    public void OnClickReceiveButton(int missionID){
       ...
    }
}
1 Star2 Stars3 Stars4 Stars5 Stars (まだ投票されていません)
読み込み中...

コメント

タイトルとURLをコピーしました