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

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

ただいまの
回答率

89.63%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 193

nob02281219

score 0

前提・実現したいこと

当方プログラム自体が初心者で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

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

エラーは特にありません

該当のソースコード

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    // 
    [SerializeField]
    Text scenarioMessage;
    List<Scenario> scenarios = new List<Scenario>();

    [SerializeField]
    Transform buttonPanel;

    [SerializeField]
    Button optionButton;


    Scenario currentScenario;
    int index = 0;

    HashSet<string> items = new HashSet<string>();

    class Scenario
    {
        public string ScenarioID;
        public List<string> Texts = new List<string>();
        public List<Option> Options = new List<Option>();
        public string NextScenarioID;
    }

    class Option
    {
        public string Text;
        public Action Action;
        public Func<bool> IsFlagOK = () => { return true; };
    }

    Scenario scenario02;
    bool isCheckedKey = false;


    void Start()
    {
        var scenario01 = new Scenario()
        {
            ScenarioID = "scenario01",
            Texts = new List<string>()
         {
             "目を覚ますと、知らない世界にいた"
         },
            NextScenarioID = "scenario02"
        };

        scenario02 = new Scenario()
        {
            ScenarioID = "scenario02",
            //
            Texts = new List<string>()
            {
                "どうする?",
            },
            Options = new List<Option>
            {
                new Option()
                {
                    Text = "辺りを見渡す",
                    Action = LookAround
                },
                new Option()
                {
                    Text = "鍵を拾う",
                    Action = TakeKey,
                    IsFlagOK = () =>
                    {
                        return isCheckedKey && !items.Contains("Key");
                    }
                },
                new Option()
                {
                    Text = "扉を開ける",
                    Action = OpenDoor,
                }

            }
        };
        scenarios.Add(scenario02);
        SetScenario(scenario01);      
    }

    public void LookAround()
    {
        var scenario = new Scenario();
        scenario.NextScenarioID = "scenario02";
        if (!items.Contains("Key"))
        {
            scenario.Texts.Add("足元に鍵が落ちてる");
            isCheckedKey = true;
        }
        else
        {
            scenario.Texts.Add("足元には何もない");
        }
        SetScenario(scenario);
    }



    public void OpenDoor()
    {
        var scenario = new Scenario();
        if (items.Contains("Key"))
        {
            scenario.Texts.Add("鍵を使って扉を開いた");
            scenario.Texts.Add("クリアー");
        }
        else
        {
            scenario.Texts.Add("鍵がかかっていて開かない");
            scenario.NextScenarioID = "scenario02";
        }
        SetScenario(scenario);
    }

    public void TakeKey()

    {
        var scenario = new Scenario();
        scenario.Texts.Add("鍵を拾った");
        scenario.NextScenarioID = "scenario02";
        SetScenario(scenario);
        items.Add("Key");
    }

    //
    void Update()
    {
        if(currentScenario != null)
        {
            if(Input.GetMouseButtonDown(0))
            {
                //ボタンをクリックしたときに反応しないようにする
                if(EventSystem.current.IsPointerOverGameObject())
                {
                    return;
                }

                if(buttonPanel.GetComponentsInChildren<Button>().Length < 1)
                {
                    SetNextMessage();
                }
            }
        }

    }
    //
    void SetScenario(Scenario scenario)
    {
        currentScenario = scenario;
        scenarioMessage.text = currentScenario.Texts[0];
        if (currentScenario.Options.Count > 0)
        {
            SetNextMessage();
        }
    }


    //
    void SetNextMessage()
    {
        if (currentScenario.Texts.Count > index + 1)
        {
            index++;
            scenarioMessage.text = currentScenario.Texts[index];
        }
        else
        {
            ExitScenario();
        }
    }



   //
    void ExitScenario()
    {
        index = 0;
        if (currentScenario.Options.Count > 0)
        {
            SetOptions();
        }
        else
        {
            scenarioMessage.text = "";
            var nextScenario = scenarios.Find
                (s => s.ScenarioID == currentScenario.NextScenarioID);
            if (nextScenario != null)
            {
                SetScenario(nextScenario);
            }
            else
            {
                currentScenario = null;

            }
        }
    }

    void SetOptions()
    {
        foreach (Option o in currentScenario.Options)
        {
            if (o.IsFlagOK())
            {
                Button b = Instantiate(optionButton);
                Text text = b.GetComponentInChildren<Text>();
                text.text = o.Text;
                b.onClick.AddListener(() => o.Action());
                b.onClick.AddListener(() => ClearButtons());
                b.transform.SetParent(buttonPanel, false);
            }
        }
    }

    void ClearButtons()
    {
        foreach (Transform t in buttonPanel)
        {
            Destroy(t.gameObject);
        }
    }
}

試したこと

・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に変更しました

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ha_wn

    2020/02/14 15:29 編集

    ・SetNextMessage();の上の行にDebug.Log("Test");を記述して再生時クリック後に「Console」へTestが表示されるか確認
    ・デバッガを使用してブレークポイントをSetNextMessage();の行に置き止まるか確認

    まずは上記デバッグ作業どちらかおこなって下さい。
    その結果を試したことに書いておいてください。

    キャンセル

  • nob02281219

    2020/02/14 15:47

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

    キャンセル

  • ha_wn

    2020/02/14 18:25

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

    キャンセル

回答 1

0

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

・currentScenarioがnull
・IsPointerOverGameObjectが常にTrue

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

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

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

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

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

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

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

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