【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++; // インデックスを次の行に進める
            }
        }
    }
}

思い通りのゲームが作れない

Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。

しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。

トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能

UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。

容量不足を解消

Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。

価格耐久性静音性読み書きサイズ
HDD
SSD

注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。

  • 据え置きHDD
  • 外付けSDD
  • 内蔵SSD

ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。

解説

  • 名前空間

初めに名前空間に「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メソッドは更新を繰り返すので、基本的に変数はその場で定義しない。

タイトルとURLをコピーしました