12/08/2018, 15:13

Day 11 - Talk with NPC

さて、続きです。 Current status NPC周りの判定に近づく → 判定に触れ、会話の指示 → そのボタンを押すと会話イベント発生 → UIが表示される → 会話の内容がUIに表示される → クリックかキーを押すと会話が進んでいく → 会話終了 現在こちらの2番目、会話の指示までが作れた所です。 Fキーを押して会話を出来る、と指示は出ますがFキーを押しても何も起きない状態です。 Talk with NPC では、Fキーを押した時に会話が発生するようにしていきます。 まず「Fキーを押した」というのを判定 ...

さて、続きです。

Current status

NPC周りの判定に近づく → 判定に触れ、会話の指示 → そのボタンを押すと会話イベント発生 →
UIが表示される → 会話の内容がUIに表示される → クリックかキーを押すと会話が進んでいく → 会話終了

現在こちらの2番目、会話の指示までが作れた所です。 Fキーを押して会話を出来る、と指示は出ますがFキーを押しても何も起きない状態です。

Talk with NPC

では、Fキーを押した時に会話が発生するようにしていきます。 まず「Fキーを押した」というのを判定するコマンドは

if (Input.GetKeyDown(KeyCode.F))
{
}

こんなのですね。 ↑はもしFキーが押されたら、下の内容が実行されますよというものです 今回はそこに会話UIをアクティブにして会話の内容を表示するという処理にすればOKですね

じゃんじゃん書いていきます。 まずは、NPCに近づいているかどうかの判定をするために tikai というbool型の変数を定義します NPCに近づくとtikaiはtrueになり、trueならば会話UIがアクティブになるというスクリプトです。

    void Update()
    {
        if (tikai)
        {
            if (Input.GetKeyDown(KeyCode.F))
            {
                kaiwaui.SetActive(true);
            }
        }
    }

コイツを組み込んでNPCの近くでFを押してやると

下の会話UIが表示されました。 しかし、Press "F" to talk が会話中にも表示されています。

では、会話開始時にこいつを非アクティブにしましょう

            if (Input.GetKeyDown(KeyCode.F))
            {
                talkf.SetActive(false);
                kaiwaui.SetActive(true);
            }

これで…

消えました。

Conversation content

では、次は会話内容の表示です。 内容はまあ、Helloの次にNice to meet youと表示されるぐらいでいいでしょう。

とりあえずただ単に表示されるものを作ってみましょう。

そんでクリックしたら次の会話に行くように… 今回は簡単にクリックしたらテキストを上書きしてしまいます。

しかし、何かTextで宣言しようと思ったらエラーが吐かれる。

using UnityEngine.UI;

これを最初に忘れていたためだった。

ちゃんと書いてあげてクリック時に会話を上書きする処理を書く

 if (Input.GetKeyDown(KeyCode.F))
            {
                kaiwachu = true;
                talkf.SetActive(false);
                kaiwaui.SetActive(true);
                kaiwanaiyou.text = "Hello.";
                if (Input.GetMouseButtonDown(0))
                {
                    kaiwanaiyou.text = "Nice to meet you.";
                }
            }

なんか長くなってきました。 実際に動かしてみると、最初のHelloは表示されるけどクリックしてもなんの反応もない。

どうやら、マウスクリックが反応していないみたい。 ではここをキーボード入力に変えてみます。KeyCode.Rに置き換えて起動。

しかし、何の反応も得られず。 なら多分ifの中にifを入れてしまっているのが問題で処理出来てないのかな?

Bulldoze

じゃあ、ifの外に出してやればいいのかな?…とは思ったけど、それだとキー入力の所で動作がおかしくなりそう。 一応ゴリ押しで実装出来るけど…

  if (tikai)
        {
            if (Input.GetKeyDown(KeyCode.F))
            {
                kaiwachu = true;
                talkf.SetActive(false);
                kaiwaui.SetActive(true);
                kaiwanaiyou.text = "Hello.";
                
             }
            if (kaiwachu)
            {
                if (Input.GetMouseButtonDown(0))
                {
                    kaiwanaiyou.text = "Nice to meet you(Press Esc to Exit) ";
                    kaiwachu2 = true;
                }
            }
            if (kaiwachu2)
            {
                if (Input.GetKeyDown(KeyCode.Escape))
                {
                    talkf.SetActive(true);
                    kaiwaui.SetActive(false);
                    kaiwachu = false;
                }
            }

まあつまりは会話の段階ごとに新しいbool型変数でtruefalseを判定してif文を何回も何回も書いてゴリ押しで会話を成立させてます。 同じボタンで会話を進めようとすると一気に最後まで進んでしまうため会話を進めるボタンは段階ごとに変えなければいけないとかいう仕様。

一応はver1.2が完成したけど…もっと改善しなければ、これは流石に頭が悪すぎる。 3枚以上の会話が出てきたら絶対にめんどくさくなるしなあ。土日に勉強して改善しよう。 何か入力待ちのような状態を作れるコマンドを使えばいいのかな…? 今日はここまで。

0