前提・実現したいこと
スクリプトで生成されたボタン状のカレンダーを押すとメモ帳が出てきて日付ごとにメモを保存できるようにしたい。
発生している問題・エラーメッセージ
NullReferenceException: Object reference not set to an instance of an object MemoPanel.Start () (at Assets/Script/MemoPanel.cs:17)
Assets\Script\Calendar.cs(23,24): error CS0117: 'GameObject' does not contain a definition for 'memoGameObject'
該当のソースコード
↓このサイトの作り方を参考にカレンダーを作成しました。
https://qiita.com/hire1105/items/b23e905bbcc062f70376
↓①カレンダーのスクリプト
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6public class Calendar : MonoBehaviour 7{ 8 public GameObject canvas;//エディタから指定 9 public GameObject prefab;//エディタから指定 10 public static DateTime SelectDate; 11 private DateTime D_Date; 12 private int startday; 13 14 void Start() 15 { 16 17 for (int i = 0; i < 42; i++) 18 { 19 GameObject button = Instantiate(prefab, canvas.transform)as GameObject; 20 button.GetComponent<Button>(); 21 button.AddComponent<MemoPanel>(); 22 GameObject.memoGameObject= GameObject.Find("Memotyou"); 23 24 } 25 SelectDate = DateTime.Now; 26 CalendarController(); 27 28 29 } 30 private void CalendarController() 31 { 32 int days = 1; 33 int overday = 1; 34 35 D_Date = new DateTime(SelectDate.Year, SelectDate.Month, 1); //SelectDateの月の最初の日付 36 int year = SelectDate.Year; //年 37 int month = SelectDate.Month; //月 38 int day = SelectDate.Day; //日 39 //最初の日付の曜日を取得 40 DayOfWeek firstDate = D_Date.DayOfWeek; 41 //何日まであるか 42 int monthEnd = DateTime.DaysInMonth(year, month); 43 //前月が何日まであるか 44 SelectDate = SelectDate.AddMonths(-1); 45 month = SelectDate.Month; 46 SelectDate = SelectDate.AddMonths(1); 47 int lastmonth = DateTime.DaysInMonth(year, month); 48 switch (firstDate) 49 { 50 case DayOfWeek.Sunday: 51 startday = 0; 52 break; 53 case DayOfWeek.Monday: 54 startday = 1; 55 break; 56 case DayOfWeek.Tuesday: 57 startday = 2; 58 break; 59 case DayOfWeek.Wednesday: 60 startday = 3; 61 break; 62 case DayOfWeek.Thursday: 63 startday = 4; 64 break; 65 case DayOfWeek.Friday: 66 startday = 5; 67 break; 68 case DayOfWeek.Saturday: 69 startday = 6; 70 break; 71 } 72 int lastmonthdays = lastmonth - startday + 1; 73 74 for (int i = 0; i < 42; i++) 75 { 76 if (i >= startday) 77 { 78 if (days <= monthEnd) 79 { 80 //文字を入れる 81 Transform DAY = GameObject.Find("GameObject").transform.GetChild(i); 82 DateTime tmp = D_Date;//一時変数 83 DayOfWeek num = tmp.DayOfWeek; 84 //土曜日青・日曜日赤 85 switch (num) 86 { 87 case DayOfWeek.Sunday: 88 DAY.GetChild(0).GetComponent<Text>().color = Color.red; 89 break; 90 case DayOfWeek.Saturday: 91 DAY.GetChild(0).GetComponent<Text>().color = Color.blue; 92 break; 93 default: 94 DAY.GetChild(0).GetComponent<Text>().color = Color.black; 95 break; 96 97 } 98 DAY.GetChild(0).GetComponent<Text>().text = D_Date.Day.ToString(); 99 GameObject button = GameObject.Find("GameObject").transform.GetChild(i).gameObject; 100 button.GetComponent<Button>().onClick.RemoveAllListeners(); 101 button.GetComponent<Button>().onClick.AddListener(() => { set_Date(tmp); }); 102 D_Date = D_Date.AddDays(1); 103 days++; 104 } 105 else 106 { 107 Transform DAY = GameObject.Find("GameObject").transform.GetChild(i); 108 DAY.GetChild(0).GetComponent<Text>().color = Color.gray; 109 DAY.GetChild(0).GetComponent<Text>().text = overday.ToString(); 110 GameObject button = GameObject.Find("GameObject").transform.GetChild(i).gameObject; 111 button.GetComponent<Button>().onClick.RemoveAllListeners(); 112 overday++; 113 } 114 } 115 else 116 { 117 Transform DAY = GameObject.Find("GameObject").transform.GetChild(i); 118 DAY.GetChild(0).GetComponent<Text>().color = Color.gray; 119 DAY.GetChild(0).GetComponent<Text>().text = lastmonthdays.ToString(); 120 GameObject button = GameObject.Find("GameObject").transform.GetChild(i).gameObject; 121 button.GetComponent<Button>().onClick.RemoveAllListeners(); 122 lastmonthdays++; 123 } 124 125 } 126 void set_Date(DateTime date) 127 { 128 Debug.Log(date); 129 //値を保存する処理など 130 } 131 } 132 133 134} 135 136 137 138
カレンダーオブジェクトのインスペクター情報
↓②ボタン状のカレンダーを押したときにメモ帳オブジェクトが出てくるスクリプト
using UnityEngine; using UnityEngine.UI; public class MemoPanel : MonoBehaviour { // インスペクターから指定する public GameObject memoGameObject; public Button button; private void Start() { bool isActive = false; // ボタンが押されたら、InputFieldゲームオブジェクトのアクティブ/非アクティブを切り替える button.onClick.AddListener(() => { isActive = !isActive; memoGameObject.SetActive(isActive); }); } }
カレンダーを押したら出てくるメモ帳画面
(OKボタンを押したらメモ内容を保存できるようにしたい)
試したこと
プレハブ化したボタンオブジェクトに②のスクリプトをつけたのですがインスペクターでメモ帳ゲームオブジェクトをmemoGameObjectに指定できなかったので、動的に生成されたボタンオブジェクトには他のオブジェクトが指定できないのかなと思い①のスクリプトから②のスクリプトを呼び出そうとしたのですが上記のエラーメッセージが出てきてしまい、どうすればいいのかわからなくなってしまいました。
補足情報(FW/ツールのバージョンなど)
Unity2019.4.10f1
あなたの回答
tips
プレビュー