Input」タグアーカイブ

ScreenToWorldPointでクリックした位置のWorld座標が取得できない場合

マウスでクリックした位置に対応するWorld座標を取得したい場合、Camera.ScreenToWorldPointを使うと思いますが、たまに正しい値が取得できないことがあります。

Camera.main.ScreenToWorldPoint (Input.mousePosition);

そういう場合は、CameraのProjectionOrthographicに設定してみるとうまくいくこともあるみたいです。

ちなみに、Perspectiveで正しい値が取得できない理由はよく分かりませんでした。

リンク

Unity で ScreenToWorldPoint が常に同じ座標を返す件 – nirasan’s tech blog
http://nirasan.hatenablog.com/entry/2014/03/28/093924

Unity – Scripting API: Camera.ScreenToWorldPoint
https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

「タッチデバイス」「マウス操作」両方に対応する場合に参考になりそうなドキュメント

Unityを使っていると、WindowsとAndroid/iOS両方に対応したゲームを作ることもあるかなと思います。その際、Windowsではマウス、Android/iOSではタッチデバイスが基本操作になってくると思いますが、どんな感じに対応すれば良いのか悩む場面もあるかもしれません。

Microsoftのドキュメントですが、そういう場合に参考になりそうな資料がこちらです。

Windows Touch Gestures Overview | Microsoft Docs
https://docs.microsoft.com/en-us/windows/desktop/wintouch/windows-touch-gestures-overview

一部を抜粋するとこんな感じ。

Tap ⇔ Click
Panning ⇔ Scrolling
Press ⇔ Right-click
Zoom ⇔ CTRL+Scroll

実際には、画面サイズとかいろいろ悩みの種はありますが、ビルド自体は簡単に通ってしまうところがUnityの利点かなと思います。

リンク

Unity – Scripting API: Touch
https://docs.unity3d.com/ScriptReference/Touch.html

UnityでマウスがUI上にあるかどうかチェックするスクリプト

Unityでは、Physics.Raycastを使ってマウスがオブジェクト上にあるかどうか調べることができます。

Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (ray, out hit)) {
  // 処理したい内容
}

ただし、上のスクリプトはUIでは使えません。

マウスがUIのオブジェクト上にあるかどうか調べたい場合はUnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObjectを使うと良いそうです。

using UnityEngine.EventSystems;
if (EventSystem.current.IsPointerOverGameObject ()) {
  // 処理したい内容
}

リンク

Unity – スクリプトリファレンス: EventSystems.EventSystem.IsPointerOverGameObject
https://docs.unity3d.com/jp/current/ScriptReference/EventSystems.EventSystem.IsPointerOverGameObject.html