(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

エディタを実行していない時にSceneView上でクリックした座標を取得する【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 5.6.0f3


はじめに

今回はタイトル通り、

エディタを実行していない時にSceneView上でクリックした座標を取得する方法のご紹介です!

イメージは以下のような感じ。


f:id:kan_kikuchi:20170511055804g:plain


GameViewでも同様の事は可能ですが、SceneViewは表示範囲を簡単に変更出来るので、

1画面で収まらない時などに使うと便利です。


ClickPositionOnSceneGetter

早速ですがプログラムは以下の通りです。



このClickPositionOnSceneGetterをGameObjectにアタッチすると、

最初のイメージのようにクリックした座標がログとして出力されるようになります。


プログラムの要点は以下の3点です。


エディタを実行していない時かつSceneView上での処理なので、

OnGUIやUpdateでなく、OnDrawGizmosを使っている点。


エディタが実行されていない時、Input.mousePositionではマウスの位置が取得できないので、

Event.current.mousePositionでマウスの位置を取得している点。

How to get mouseposition in scene view?


SceneView.currentDrawingSceneViewで現在表示されているSceneViewを取得し、

座標を変換している点。

How to get mouseposition in scene view?


おわりに

これを使えば「シーン上でクリックした所にオブジェクトを配置」なんて事も出来るようになります。

mousePosition.z = 0;
GameObject newObject = Instantiate(Prefab);
newObject.transform.position = mousePosition;

f:id:kan_kikuchi:20170511063204g:plain


ただし、例の実装のままだと、常に実行され続けるので注意が必要です。


------------追記

Retinaディスプレイだとズレるよようなので、以下のような対応が必要になります。



------------追記おわり