teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

見落としに対し追記

2019/03/25 05:23

投稿

sakura_hana
sakura_hana

スコア11429

answer CHANGED
@@ -6,4 +6,33 @@
6
6
  ありえそうなのは、別の部分で「button2」のTextをオフにしている結果`GameObject.Find("Quiz/Button2").GetComponentInChildren<Text>()`に失敗しているとかでしょうか。
7
7
 
8
8
  また、Startメソッドで設定した値は、シーンを変更しない限りは維持されます。
9
- なので本来はcsvDatas、Order2もnullにならないはずなのですが、別スクリプトが影響していないかも確認してみてください。
9
+ なので本来はcsvDatas、Order2もnullにならないはずなのですが、別スクリプトが影響していないかも確認してみてください。
10
+
11
+ ---
12
+
13
+ (`QuizMgr quizMgr = new QuizMgr();`を見落としてたので追記)
14
+
15
+ そもそも現状は「MonoBehaviourに'new'キーワードを使うことは許されていません」という意味合いの警告が出ていると思います。
16
+
17
+ QuizMgrはオブジェクトに付いていると思うので、newではなく
18
+ `QuizMgr quizMgr = GetComponent<QuizMgr>();`
19
+ のように「オブジェクトに付いたクラスを取得」する必要があります。(※他オブジェクトに付いている場合は書き方がちょっと変わるので調べてください)
20
+
21
+ `他のクラスのメソッドを使用するためにはオブジェクト作成が必要`というのはちょっと語弊があります。
22
+
23
+ **■最初からQuizMgrをGameObjectに付けてある場合**
24
+ →シーン開始時にQuizMgrのStartメソッドが呼ばれます。
25
+ →既にオブジェクトが存在している為、新たにオブジェクトを作る必要はありません(GetComponentなどで「既存のGameObjectのコンポーネントを取得」する必要があります)。
26
+
27
+ **■新たにQuizMgrをGameObjectに付ける場合**
28
+ →`QuizMgr quizMgr = gameObject.AddComponent<QuizMgr>();`とします。(なおここを何度も呼ぶとその数だけ新たなQuizMgrがくっ付くので、一度だけにしたい場合はちゃんと条件分岐する必要があります)
29
+ →「新たにQuizMgrを生成してGameObjectに付与(=新たにQuizMgrインスタンスを生成)」という意味になります。
30
+ →QuizMgrのStartメソッドは呼ばれますが、`quizMgr.NextQuizSet();`とどっちが早いかは保証されません(多分Startメソッドより前にNextQuizSetメソッドが呼ばれる可能性が高い)。
31
+
32
+ **■`new QuizMgr()`する場合(QuizMgrがMonoBehaviourを継承していない場合)**
33
+ →「新たにQuizMgrを生成」という意味になります。(GameObjectには付与しない、というかMonoBehaviourを継承していないと付与出来ない)
34
+ →QuizMgrのStartメソッドは呼ばれません。コンストラクタを使用するか初期設定用メソッドを作って自分で呼ぶ必要があります。
35
+
36
+ 後者の2つだと毎回Order2を生成しているようなものなので、
37
+ 今回は`GetComponent`を使用した形式が適していると思います。
38
+ (「unity インスタンス」とか「unity 他オブジェクトのスクリプト」とかで検索すると詳しい情報が出ます)