こんにちは、Unityエンジニアのオオバです。
「クリックした座標にものを表示したい」
っていうときありませんか?
スマホゲーム開発だと タップにエフェクト 。
タップした座標にエフェクトを表示させて
タップ(タッチ)した感を演出します。
Unityエディタ上ではクリック。
スマホではタップ。
この両者 似ているようで違います し、
実装も変わってきます。
本記事では クリックとタッチの違い について解説します。
Inputからそれぞれクリックとタッチを取得する
結論を簡単にまとめます。
- クリックした座標 : Input.mousePosition
- タッチした座標 : Input.GetTouch(0).position
ソースコードにするとコチラ。
💻ソースコード : クリック座標の取得
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;
}
}
}
これらのコードでクリック、タッチ
それぞれの座標を取得可能です。
詳細について解説していきます。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
クリックはGetMouseButtonDownを使う
Input.GetMouseButtonDown
メソッドが
trueのときクリックタイミングです。
そのときのマウス座標が クリック座標 となります。
ソースコードで表すと以下です。
💻ソースコード : クリック座標取得サンプル
if (Input.GetMouseButtonDown(0))
{
var pos = Input.mousePosition;
}
またInput.mousePosition
は Vector3型。
Z値は常に0 です。
タッチはTouchPhaseを使う
タッチは少し複雑です。
そもそもタッチはクリックと違い、
複数指をつかった マルチタッチが可能 です。
そのため、タッチ座標を取得する前に
どのタッチを採用するか決めます。
今回はシングルタッチを前提に解説します。
ソースコードを見ていきましょう
💻ソースコード : タッチ座標取得サンプル
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.position
は Vector2型 です。
3. TouchPhaseでタッチ開始を判定
タッチの開始タイミングかどうかを判定するために、
if (touch.phase == TouchPhase.Began)
で
チェックしています。
Begin
であればタッチ開始です。
クリック処理とはだいぶ違いますが、
これでタッチ座標の取得ができました。
スマホとUnityエディタで座標の取得先を切り替える
UnityエディタとスマホではInputの取得方法が違います。
- Unityエディタ : クリック座標
- スマホ : タッチ座標
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
}
- mousePosition : Vector3型
- touch.position : Vector2型
補足になりますが
取得座標の型が違う ため注意です。
まとめ : クリックとタッチの違いを理解しよう
記事の内容を簡単にまとめます。
- クリックした座標 : Input.mousePosition
- タッチした座標 : Input.GetTouch(0).position
- クリック座標:Vector3型、タッチ座標:Vector2型と異なるので注意
- Unityエディタとスマホ実機では座標の取得先を切り替える必要あり
こんな感じです。
スマホゲーム開発時に発生する、
タッチ座標の取得。
Unityエディタ上ではクリックになるため
ややこしいですよね。
本記事でクリックとタッチの基礎を紹介しました。
参考にしてもらえれば幸いです。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいUnity開発ライフをお過ごしください。
- Unity2020.3.19f1