【Unity】マウス操作をゲームに導入する画面クリックで処理

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

画面をクリックすると、Consoleウィンドウにcsvのデータを1つずつ表示する。

マウス入力でCSV出力

ゲームのプレイヤー操作は、ユーザーがマウス操作やクリック、キーボードによって行います。

例えば、アクションゲームでジャンプをマウス右クリックで処理をする場合、
右クリックをしたとき、クリックしているとき、クリックを離したとき。
3つのパターンで処理が変わることもあります。

Unityでは、それぞれマウスボタンによる操作をプログラムすることができます。

本記事では、画面をクリックすると、CSVファイルのデータを1つずつ表示する方法を紹介します。

本記事は次の人におすすめ
  • Unityでマウス操作を追加したい。
  • 画面クリックで表示して文字を制御したい。
スポンサーリンク

マウスクリック

Unityでマウスボタンが押されているかどうかを検出するためには、
Input.GetMouseButton」メソッドを使用します。

このメソッドは、以下のようにタイミングで使い分けることができます。

メソッド備考
Input.GetMouseButtonボタンが押されていたら動作
Input.GetMouseButtonDownボタンが押されたら動作
Input.GetMouseButtonUpボタンが離れたら動作

太字のメソッド「Input.GetMouseButtonDown」は特に使用します。

また、マウスクリックの取得は以下のような0や1のような引数を使用します。

引数検出対象
0左クリック
1右クリック
2マウスホイール

それでは、メソッド「Input.GetMouseButton」を使ってマウス入力を取得していきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseClick : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))//マウス左押下
        {
            Debug.Log("左クリックされました");
        }
        else if (Input.GetMouseButtonDown(1))//マウス右押下
        {
            Debug.Log("右クリックされました");
        }
        else if (Input.GetMouseButtonDown(2))//マウスホイール押下
        {
            Debug.Log("ホイールクリックされました");
        }
    }
}

スクリプト「MouseClick」をHierarchyウィンドウにアタッチして再生ボタンを押します。

実際の動作は次のようになります。

マウス入力によるUnityの出力

マウスクリックした回数だけCSVのテキストを表示する

マウス入力は、Input.GetMouseButtonメソッドを使用します。
マウスクリックの例として、画面クリックに応じてCSVのテキストを表示します。

CSVテキストの読み込み方法を紹介しています。

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;   //追加

public class csvReader : MonoBehaviour
{
    private TextAsset csvFile; 
    private List<string[]> csvData = new List<string[]>(); 
    int i = 0; // 現在の行を示すインデックス

    void Start()
    {
        csvFile = Resources.Load("Sample") as TextAsset; // "Sample.csv"を読み込む
        StringReader reader = new StringReader(csvFile.text); // CSVファイルの内容をテキストとして読み込む
        while (reader.Peek() != -1) // テキストの終端に達するまでループ
        {
            string line = reader.ReadLine(); // 1行読み込む
            csvData.Add(line.Split(',')); // 読み込んだ行をカンマで分割し、リストに追加する
        }
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウスの左ボタンが押された場合
        {
            // 現在の行のデータをログに表示
            Debug.Log("日本語:" + csvData[i][0] + ", English:" + csvData[i][1]);

            if (i < csvData.Count) // 現在の行がデータの最後の行でない場合
            {
                i++; // インデックスを次の行に進める
            }
        }
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

ビックセール開催中(10月25日まで)
対象のコースが1800円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大94%OFF

終了まで

時間

解説

  • 名前空間

初めに名前空間に「using System.IO;」を追加します。

これにより、「File」クラスを使用してファイルを読み込んだり、書きこんだり、データを列挙することが可能になります。

using System.IO;   //追加
  • フィールド(メンバ変数)

「csvFile」:読み込んだCSVファイルを格納するための変数です。
「csvData」:CSVファイルのデータを格納するリストです。各行は文字列の配列として格納されます。
「i」:現在の行を示すインデックスです。

csvFileはTextAsset型の変数で、CSVファイルの内容を格納します。
Resources.Loadメソッドを使用して、”Sample”という名前のCSVファイルを読み込んでいます。このCSVファイルはUnityのResourcesフォルダ内に配置されている必要があります。

  • Startメソッド

Resources.Load(“Sample”) を使って、Resourcesフォルダから “Sample.csv” を読み込み、TextAssetとしてcsvFileに格納します。
StringReaderを使ってcsvFile.text をテキストとして読み込みます。
while ループを使用して、CSVファイルの各行を読み込みます。
各行をカンマで分割し、その結果を csvData リストに追加します。

  • Updateメソッド

Input.GetMouseButtonDown(0) を使用して、マウスの左ボタンが押されたことを検出します。
左ボタンが押されると、csvData の現在の行のデータをログに表示します。
もしiがcsvDataの最後の行に達していない場合、iをインクリメントして次の行に進みます。

For文・Updateメソッドの注意点

「Unity」を開発していくときに、このプログラムで正常に動くか確認をするときはDebug.Log()を使います。

For文・Updateメソッドどちらも使用頻度は高いですが、
安易に使用すると無限ループから抜け出せず、パソコンフリーズしてしてしまう可能性があります。

最悪の場合、開発していたデータが消えてしまう恐れもあります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    int num;

    void Update()
    {
        num++;
        Debug.Log(num);
    }
}

上記のソースコードを実行すると、Consoleウィンドウには、数字が永遠に加算されて表示されます。

データ破損しないように十分に扱いは気を付けてください。

実演

スクリプト「csvReader」は前回と同様なため、ソースコードを保存(「Ctrl」+「S」)すれば、再度Hierarchyウィンドウにアタッチする必要はありません。

再生ボタンを押すと、冒頭で紹介したように、画面のクリックするごとにキャラクターそのセリフが表示されます。

まとめ

CSVを読み込んだ「Unity」のテキストをマウスクリックで1つずつ進めるには、if文でメソッド「Input.GetMouseButtonDown(0)」を使用します。

付録.エラーを解決

ここからは「Unity」の開発で想定しうるエラーを提示します。

本製作以外でも、エラー文が表示されないけれど、思うように実行ができないことは多くあります。

変数が進まない

前回はStartメソッドにあったFor文をUpdateメソッドに入れて、ループしないようにif文に修正しました。このとき、以下のようなコードを作成しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;   //追加

public class csvReader : MonoBehaviour
{
    private TextAsset csvFile;
    private List<string[]> csvData = new List<string[]>();

    void Start()
    {
        csvFile = Resources.Load("Sample") as TextAsset; // "Sample.csv"を読み込む
        StringReader reader = new StringReader(csvFile.text); // CSVファイルの内容をテキストとして読み込む
        while (reader.Peek() != -1) // テキストの終端に達するまでループ
        {
            string line = reader.ReadLine(); // 1行読み込む
            csvData.Add(line.Split(',')); // 読み込んだ行をカンマで分割し、リストに追加する
        }
    }

    void Update()
    {
    ///////////////////Updateメソッドに導入//////////////////
        int i = 0; 
    ///////////////////////////////////////////////////////
        if (Input.GetMouseButtonDown(0)) // マウスの左ボタンが押された場合
        {
            // 現在の行のデータをログに表示
            Debug.Log("日本語:" + csvData[i][0] + ", English:" + csvData[i][1]);

            if (i < csvData.Count) // 現在の行がデータの最後の行でない場合
            {
                i++; // インデックスを次の行に進める
            }
        }
    }
}

エラー文がでなかったものの、実行をすると、次のデータが表示されない。つまり、変数が0のままで進まない。

対処法

ポイントは、Updateメソッド内でint iがあること。

前回のスクリプトからfor文を崩しているので、同じメソッド内に置けばよいと考えやすいです。

しかし、Updateメソッドは更新を繰り返すので、この中で初期化すると、どんな処理を加えてもその変数は変わらず、iは1のまま変化しません。

したがって、前述したように、csvReadrクラスの直下、あるいは、Startメソッド内に移せば、解決します。

Updateメソッドは更新を繰り返すので、基本的に変数はその場で定義しない。

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました