画面をクリックすると、Consoleウィンドウにcsvのデータを1つずつ表示する。
ゲームのプレイヤー操作は、ユーザーがマウス操作やクリック、キーボードによって行います。
例えば、アクションゲームでジャンプをマウス右クリックで処理をする場合、
右クリックをしたとき、クリックしているとき、クリックを離したとき。
3つのパターンで処理が変わることもあります。
Unityでは、それぞれマウスクリックによる操作をプログラムすることができます。
本記事では、マウスのクリックで処理をする方法を紹介します。
- Unityでマウス操作を追加したい。
- 画面クリックで表示して文字を制御したい。
マウスクリック
Unityでマウスボタンが押されているかどうかを検出するためには、
「Input.GetMouseButton」メソッドを使用します。
このメソッドは、以下のようにタイミングで使い分けることができます。
メソッド | 備考 |
Input.GetMouseButton | ボタンが押されていたら動作 |
Input.GetMouseButtonDown | ボタンが押されたら動作 |
Input.GetMouseButtonUp | ボタンが離れたら動作 |
3つの中でも「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ウィンドウにアタッチして再生ボタンを押します。
実際の動作は次のようになります。
マウスクリックの回数だけCSVを表示する
マウス入力は、Input.GetMouseButtonメソッドを使用します。
マウスクリックの例として、画面クリックに応じて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は、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
ビックセール開催中(12月19日まで)
対象のコースが1500円から(最大95%OFF)
- 【Unity C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
- 名前空間
初めに名前空間に「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メソッドは更新を繰り返すので、基本的に変数はその場で定義しない。