質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

2257閲覧

unity2D ノベルゲーム作成のチュートリアルサイトを写経しているんですが、クリックしても進みません

nob02281219

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/02/14 05:44

編集2020/02/16 23:08

前提・実現したいこと

当方プログラム自体が初心者でunityもC#も1カ月目です。

こちらの方のサイトを見て、写経していたのですが再生をスタートしても
最初の一文字目「目を覚ますと、知らない世界にいた」が表示されただけで、
クリックしても文字送りが発生しません。

https://kanchi0914.hatenablog.com/entry/2019/07/23/070600

scriptにはエラーは発生していません。正直何をどうやっていいのか見当がつきません。

GameControllerオブジェクトのインスペクターには
Scenario MessageにText(Text)
Button PanelにButtonPanel
Option ButtonにButton
をアタッチしています。

こちらのサイトの前回のチュートリアルは上手く動きました
https://kanchi0914.hatenablog.com/entry/2019/07/23/070005

発生している問題・エラーメッセージ

エラーは特にありません

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5using UnityEngine.UI; 6 7public class GameController : MonoBehaviour 8{ 9 // 10 [SerializeField] 11 Text scenarioMessage; 12 List<Scenario> scenarios = new List<Scenario>(); 13 14 [SerializeField] 15 Transform buttonPanel; 16 17 [SerializeField] 18 Button optionButton; 19 20 21 Scenario currentScenario; 22 int index = 0; 23 24 HashSet<string> items = new HashSet<string>(); 25 26 class Scenario 27 { 28 public string ScenarioID; 29 public List<string> Texts = new List<string>(); 30 public List<Option> Options = new List<Option>(); 31 public string NextScenarioID; 32 } 33 34 class Option 35 { 36 public string Text; 37 public Action Action; 38 public Func<bool> IsFlagOK = () => { return true; }; 39 } 40 41 Scenario scenario02; 42 bool isCheckedKey = false; 43 44 45 void Start() 46 { 47 var scenario01 = new Scenario() 48 { 49 ScenarioID = "scenario01", 50 Texts = new List<string>() 51 { 52 "目を覚ますと、知らない世界にいた" 53 }, 54 NextScenarioID = "scenario02" 55 }; 56 57 scenario02 = new Scenario() 58 { 59 ScenarioID = "scenario02", 60 // 61 Texts = new List<string>() 62 { 63 "どうする?", 64 }, 65 Options = new List<Option> 66 { 67 new Option() 68 { 69 Text = "辺りを見渡す", 70 Action = LookAround 71 }, 72 new Option() 73 { 74 Text = "鍵を拾う", 75 Action = TakeKey, 76 IsFlagOK = () => 77 { 78 return isCheckedKey && !items.Contains("Key"); 79 } 80 }, 81 new Option() 82 { 83 Text = "扉を開ける", 84 Action = OpenDoor, 85 } 86 87 } 88 }; 89 scenarios.Add(scenario02); 90 SetScenario(scenario01); 91 } 92 93 public void LookAround() 94 { 95 var scenario = new Scenario(); 96 scenario.NextScenarioID = "scenario02"; 97 if (!items.Contains("Key")) 98 { 99 scenario.Texts.Add("足元に鍵が落ちてる"); 100 isCheckedKey = true; 101 } 102 else 103 { 104 scenario.Texts.Add("足元には何もない"); 105 } 106 SetScenario(scenario); 107 } 108 109 110 111 public void OpenDoor() 112 { 113 var scenario = new Scenario(); 114 if (items.Contains("Key")) 115 { 116 scenario.Texts.Add("鍵を使って扉を開いた"); 117 scenario.Texts.Add("クリアー"); 118 } 119 else 120 { 121 scenario.Texts.Add("鍵がかかっていて開かない"); 122 scenario.NextScenarioID = "scenario02"; 123 } 124 SetScenario(scenario); 125 } 126 127 public void TakeKey() 128 129 { 130 var scenario = new Scenario(); 131 scenario.Texts.Add("鍵を拾った"); 132 scenario.NextScenarioID = "scenario02"; 133 SetScenario(scenario); 134 items.Add("Key"); 135 } 136 137 // 138 void Update() 139 { 140 if(currentScenario != null) 141 { 142 if(Input.GetMouseButtonDown(0)) 143 { 144 //ボタンをクリックしたときに反応しないようにする 145 if(EventSystem.current.IsPointerOverGameObject()) 146 { 147 return; 148 } 149 150 if(buttonPanel.GetComponentsInChildren<Button>().Length < 1) 151 { 152 SetNextMessage(); 153 } 154 } 155 } 156 157 } 158 // 159 void SetScenario(Scenario scenario) 160 { 161 currentScenario = scenario; 162 scenarioMessage.text = currentScenario.Texts[0]; 163 if (currentScenario.Options.Count > 0) 164 { 165 SetNextMessage(); 166 } 167 } 168 169 170 // 171 void SetNextMessage() 172 { 173 if (currentScenario.Texts.Count > index + 1) 174 { 175 index++; 176 scenarioMessage.text = currentScenario.Texts[index]; 177 } 178 else 179 { 180 ExitScenario(); 181 } 182 } 183 184 185 186   // 187 void ExitScenario() 188 { 189 index = 0; 190 if (currentScenario.Options.Count > 0) 191 { 192 SetOptions(); 193 } 194 else 195 { 196 scenarioMessage.text = ""; 197 var nextScenario = scenarios.Find 198 (s => s.ScenarioID == currentScenario.NextScenarioID); 199 if (nextScenario != null) 200 { 201 SetScenario(nextScenario); 202 } 203 else 204 { 205 currentScenario = null; 206 207 } 208 } 209 } 210 211 void SetOptions() 212 { 213 foreach (Option o in currentScenario.Options) 214 { 215 if (o.IsFlagOK()) 216 { 217 Button b = Instantiate(optionButton); 218 Text text = b.GetComponentInChildren<Text>(); 219 text.text = o.Text; 220 b.onClick.AddListener(() => o.Action()); 221 b.onClick.AddListener(() => ClearButtons()); 222 b.transform.SetParent(buttonPanel, false); 223 } 224 } 225 } 226 227 void ClearButtons() 228 { 229 foreach (Transform t in buttonPanel) 230 { 231 Destroy(t.gameObject); 232 } 233 } 234} 235 236

試したこと

・SetNextMessage();の上の行にDebug.Log("Test");を記述して再生時クリック後にConsole確認しましたがTestは表示されませんでした

・IsPointerOverGameObjectが常にTrueという事について、RaycastTargetのチェックを全て外してみました。結果変わりませんでした。ためしに if (Input.GetKey(KeyCode.UpArrow))に変更して↑押してみましたが結果変わりません

・ if(currentScenario != null)と{if(Input.GetMouseButtonDown(0))の間に Debug.Log("Test2");を入れたらConsoleに大量に表示されました。
if(Input.GetMouseButtonDown(0))と{if(EventSystem.current.IsPointerOverGameObject())の間では表示されません(クリックをして)
根本的に入力の処理がされない気がします

・何回かコンソールチェックすると Assets\script\GameController.cs(15,15): warning CS0649: Field 'GameController.buttonPanel' is never assigned to, and will always have its default value null と警告が出るようになりました。(最初数回は出ない、5回位再生すると出る)
調べてみると変数の初期値がNULLとの事。currentScenarioがnullの可能性?これをnull以外にする方法を調べます

・unityをのverを再インストールして最新にしました。その後まったく同じチュートリアルの手順で作成し最初はまったく同じ状況(クリックしても進まない)になりました。

・以前ブロック崩しを作った時prefabを作ったらヒエラルキーからオブジェクトを削除していた事を思い出し試しにbuttonを削除してみたところ、クリックしたら"どうする?"まで表示されるようになり、エラーが入るようになりました。
ArgumentException: The Object you want to instantiate is null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at <94c5f4c38cdc42d2b006f8badef04394>:0)
UnityEngine.Object.Instantiate[T] (T original) (at <94c5f4c38cdc42d2b006f8badef04394>:0)
GameController.SetOptions () (at Assets/Script/GameController.cs:217)
GameController.ExitScenario () (at Assets/Script/GameController.cs:192)
GameController.SetNextMessage () (at Assets/Script/GameController.cs:180)
GameController.SetScenario (GameController+Scenario scenario) (at Assets/Script/GameController.cs:165)
GameController.ExitScenario () (at Assets/Script/GameController.cs:201)
GameController.SetNextMessage () (at Assets/Script/GameController.cs:180)
GameController.Update () (at Assets/Script/GameController.cs:152)

エラーの内容をググってみたところ、オブジェクトが無くなった事によるものかな?と思いbuttonをprefabからヒエラルキーに戻し、再度GameControllerオブジェクトのスクリプトのOption Buttonにbuttonをアタッチしました。すると直り、クリックして進むようになって、その後ボタンの選択も出来るようになりゲームとして機能するようになりました。エラーも出なくなりました。

・原因が不明のままなので、再度古いverをインストールして最初から作ってみる事と、新しいverで最初から作ってみる事を実施してみます。同じ状況がまた出ると思うのですが、buttonのオブジェクトが何かしら邪魔をしているのか?調べてみます。

補足情報(FW/ツールのバージョンなど)

unityのverは 2018.4.10f1です。
2019.3.1f1に変更しました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hawn

2020/02/14 06:37 編集

・SetNextMessage();の上の行にDebug.Log("Test");を記述して再生時クリック後に「Console」へTestが表示されるか確認 ・デバッガを使用してブレークポイントをSetNextMessage();の行に置き止まるか確認 まずは上記デバッグ作業どちらかおこなって下さい。 その結果を試したことに書いておいてください。
nob02281219

2020/02/14 06:47

お返事ありがとうございます。まずは Debug.Log("Test");記載で再生しましたがConsoleに表示されませんでした。 デバッカはまだ使ったことが無いのでググってからやってみます。
Hawn

2020/02/14 09:25

その調子で原因究明までお願いします。
guest

回答1

0

現状だと下記どちらかの可能性が高いです。

・currentScenarioがnull
・IsPointerOverGameObjectが常にTrue

下の可能性が高いので背景画像や下のテキストパネルにあるRaycastTargetのチェックを外して直るか試して下さい。

・試して頂いた後での追記

根本的に入力の処理がされない気がします

試して頂いた内容を見る限りではその判断は正しいかと思います。

しかしチュートリアルの方でもInput.GetMouseButtonDown(0)を使っているのでそちらで機能していてこちらが動かないというのが謎です。
作業途中に**「UnityのInput設定を変えてしまった」**など何かしら気付かないミスがあるかもしれません。

ちなみに私の方でも記事通り作ってみましたが問題無く動作しました。
取り合えずコードやブログの説明には問題ありません。

イメージ説明

投稿2020/02/14 09:36

編集2020/02/15 16:02
Hawn

総合スコア1222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問