こちらのシンプルなカレンダーをunityである程度まで完成させました。
しかし、再生時に自動で最初の日付のボタンが押される設定にしたいのですが、紐づけが出来ずに困っております。
問題はそれぞれの日付はInstantiate関数でクローン生成しているので、特定の日付のボタンと現在の日付を紐づけできないようです。
Start関数でbtn.onClick.Invoke();を使い、ボタンを呼び起こそうとしましたが、クローンされたボタンの中で特定のボタン(現在の日付)だけを最初に自動で押されるという方法を実現したいです。よろしくお願い致します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class Calendar : MonoBehaviour { public GameObject canvas;//エディタから指定 public GameObject prefab;//エディタから指定 public static DateTime SelectDate; private DateTime D_Date; private int startday; public GameObject DateOBj; public GameObject MainTex = null; [SerializeField] private Button btn; void Start() { for (int i = 0; i < 42; i++) { GameObject button = Instantiate(prefab, canvas.transform); button.GetComponent<Button>(); } SelectDate = DateTime.Now; CalendarController(); Text text = MainTex.GetComponent<Text>(); text.text = SelectDate.ToString(); btn.onClick.Invoke(); } private void CalendarController() { int days = 1; int overday = 1; D_Date = new DateTime(SelectDate.Year, SelectDate.Month, 1); //SelectDateの月の最初の日付 int year = SelectDate.Year; //年 int month = SelectDate.Month; //月 int day = SelectDate.Day; //日 //最初の日付の曜日を取得 DayOfWeek firstDate = D_Date.DayOfWeek; //何日まであるか int monthEnd = DateTime.DaysInMonth(year, month); //前月が何日まであるか SelectDate = SelectDate.AddMonths(-1); month = SelectDate.Month; SelectDate = SelectDate.AddMonths(1); int lastmonth = DateTime.DaysInMonth(year, month); switch (firstDate) { case DayOfWeek.Sunday: startday = 0; break; case DayOfWeek.Monday: startday = 1; break; case DayOfWeek.Tuesday: startday = 2; break; case DayOfWeek.Wednesday: startday = 3; break; case DayOfWeek.Thursday: startday = 4; break; case DayOfWeek.Friday: startday = 5; break; case DayOfWeek.Saturday: startday = 6; break; } int lastmonthdays = lastmonth - startday + 1; for (int i = 0; i < 42; i++) { if (i >= startday) { if (days <= monthEnd) { //文字を入れる Transform DAY = GameObject.Find("GameObject").transform.GetChild(i); DateTime tmp = D_Date;//一時変数 DayOfWeek num = tmp.DayOfWeek; //土曜日青・日曜日赤 switch (num) { case DayOfWeek.Sunday: DAY.GetChild(0).GetComponent<Text>().color = Color.red; break; case DayOfWeek.Saturday: DAY.GetChild(0).GetComponent<Text>().color = Color.blue; break; default: DAY.GetChild(0).GetComponent<Text>().color = Color.black; break; } DAY.GetChild(0).GetComponent<Text>().text = D_Date.Day.ToString(); //押された日付の値を更新する GameObject button = GameObject.Find("GameObject").transform.GetChild(i).gameObject; button.GetComponent<Button>().onClick.RemoveAllListeners(); button.GetComponent<Button>().onClick.AddListener(() => { set_Date(tmp); }); // D_Date = D_Date.AddDays(1); days++; } else { Transform DAY = GameObject.Find("GameObject").transform.GetChild(i); DAY.GetChild(0).GetComponent<Text>().color = Color.gray; DAY.GetChild(0).GetComponent<Text>().text = overday.ToString(); GameObject button = GameObject.Find("GameObject").transform.GetChild(i).gameObject; button.GetComponent<Button>().onClick.RemoveAllListeners(); overday++; } } else { Transform DAY = GameObject.Find("GameObject").transform.GetChild(i); DAY.GetChild(0).GetComponent<Text>().color = Color.gray; DAY.GetChild(0).GetComponent<Text>().text = lastmonthdays.ToString(); GameObject button = GameObject.Find("GameObject").transform.GetChild(i).gameObject; button.GetComponent<Button>().onClick.RemoveAllListeners(); lastmonthdays++; } } void set_Date(DateTime date) { GameObject.Find("MainDate").GetComponent<Text>().text = date.ToString(); Debug.Log(date); //値を保存する処理など } } }
何がどうなってるかイメージが沸かないので、
実行した時のGame画面かScene画面のスクショを貼ってほしいです
あなたの回答
tips
プレビュー