こんにちは、Unityエンジニアのオオバです。

「クリックした座標にものを表示したい」
っていうときありませんか?

スマホゲーム開発だと タップにエフェクト

タップした座標にエフェクトを表示させて
タップ(タッチ)した感を演出します。

Unityエディタ上ではクリック。
スマホではタップ。

この両者 似ているようで違います し、
実装も変わってきます。

本記事では クリックとタッチの違い について解説します。

Inputからそれぞれクリックとタッチを取得する

【Unity】クリックとタッチの違いを理解しよう_0

結論を簡単にまとめます。

ソースコードにするとコチラ。

💻ソースコード : クリック座標の取得
void Update()  
{
    if (Input.GetMouseButtonDown(0))  
    {
        var pos = Input.mousePosition;  
    }
}
💻ソースコード : タッチ座標の取得
void Update()  
{
    if (Input.touchCount > 0)  
    {
        var touch = Input.GetTouch(0);  
        if (touch.phase == TouchPhase.Began)  
        {
            var pos = touch.position;  
        }
    }
}

これらのコードでクリック、タッチ
それぞれの座標を取得可能です。

詳細について解説していきます。

→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

クリックはGetMouseButtonDownを使う

【Unity】クリックとタッチの違いを理解しよう_1

Input.GetMouseButtonDownメソッドが
trueのときクリックタイミングです。

そのときのマウス座標が クリック座標 となります。

ソースコードで表すと以下です。

💻ソースコード : クリック座標取得サンプル
if (Input.GetMouseButtonDown(0))  
{
    var pos = Input.mousePosition;  
}

またInput.mousePositionVector3型
Z値は常に0 です。

タッチはTouchPhaseを使う

【Unity】クリックとタッチの違いを理解しよう_2

タッチは少し複雑です。
そもそもタッチはクリックと違い、
複数指をつかった マルチタッチが可能 です。

そのため、タッチ座標を取得する前に
どのタッチを採用するか決めます。

今回はシングルタッチを前提に解説します。
ソースコードを見ていきましょう

💻ソースコード : タッチ座標取得サンプル
if (Input.touchCount > 0)  
{
    var touch = Input.GetTouch(0);  
    if (touch.phase == TouchPhase.Began)  
    {
        var pos = touch.position;  
    }
}

3点解説します。

1. タッチしていない時にタッチ取得禁止

まずタッチしていない時にタッチを取得してはいけません。
ランタイムエラーになります。
if (Input.touchCount > 0)
このif文でタッチの数を確認しています。
1以上のときにタッチを取得しましょう。

2. タッチ座標はpositonプロパティ

タッチが1つ以上存在すれば、
var touch = Input.GetTouch(0);
とタッチを取得し position プロパティで
タッチ座標を取得できます。

touch.positionVector2型 です。

3. TouchPhaseでタッチ開始を判定

タッチの開始タイミングかどうかを判定するために、
if (touch.phase == TouchPhase.Began)
チェックしています。

Beginであればタッチ開始です。

クリック処理とはだいぶ違いますが、
これでタッチ座標の取得ができました。

スマホとUnityエディタで座標の取得先を切り替える

【Unity】クリックとタッチの違いを理解しよう_3

UnityエディタとスマホではInputの取得方法が違います。

Unityエディタとスマホの処理切り替える方法はいくつも存在しますが、
よく使うのは シンボルを使った切り替え です。

#if UNITY_EDITOR
// Unityエディタの処理  
#else
// スマホの処理(※厳密にはUnityエディタ以外の処理)  
#endif

このように UNITY_EDITORシンボルで切り替えられます。
このシンボルをクリックとタッチの
切り替えに適用したのが以下のコードです。

💻ソースコード : クリックとタッチをシンボルで切り替えたサンプル
void Update()  
{
#if UNITY_EDITOR
    if (Input.GetMouseButtonDown(0))  
    {
        var pos = Input.mousePosition;  
        Debug.Log(pos);  
    }
#else
    if (Input.touchCount > 0)  
    {
        var touch = Input.GetTouch(0);  
        if (touch.phase == TouchPhase.Began)  
        {
            var pos = touch.position;  
            Debug.Log(pos);  
        }
    }
#endif
}

補足になりますが
取得座標の型が違う ため注意です。

まとめ : クリックとタッチの違いを理解しよう

【Unity】クリックとタッチの違いを理解しよう_4

記事の内容を簡単にまとめます。

こんな感じです。

スマホゲーム開発時に発生する、
タッチ座標の取得。

Unityエディタ上ではクリックになるため
ややこしいですよね。

本記事でクリックとタッチの基礎を紹介しました。
参考にしてもらえれば幸いです。

「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!

最後まで読んでいただきありがとうございました!
すばらしいUnity開発ライフをお過ごしください。

オススメ記事
検証環境