LoginSignup
3
1

【Unity】SceneViewからRaycastを飛ばして座標を取得したい。

Last updated at Posted at 2023-12-24

この記事は金沢工業大学 Advent Calendar 2023の24日目です。

自己紹介

メリークリスマス!金沢工業大学メディア情報学科の学生です。CA Tech Accelに参加中でUnityモチベ高すぎな人。

本題

SceneViewをクリックしたらそこの座標を知りたい!

意外に最新版での方法がネットに書いてなさそうだったので、サクッと書きます。備忘録です。
また、ネットに書いてあるものはEditor拡張なのにMonoBehaviourを使っていたり、、、個人的には少し違和感を感じたので、Editorを使っての実装です。

コード

SceneViewPosition.cs
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(SomethingAsset))]
public class SceneViewPositon : Editor 
{
    public void OnEnable()
    {
        SceneView.duringSceneGui -= OnScemeViewClick;
        SceneView.duringSceneGui += OnScemeViewClick;
    }
    public void OnSceneViewClick(SceneView sceneView)
    {
        // イベントを変数として保存
        var e = Event.current;

        // マウスの左クリックのときtrue
        if ((e.type == EventType.MouseDrag || e.type == EventType.MouseDown) && e.button == 0)
        {
            // 座標のズレが起きないようにマウスのポジションを取得
            var mousePosition = new Vector3(e.mousePosition.x, 
                Camera.current.pixelHeight - e.mousePosition.y,
                0);

            // レイキャストを飛ばす
            if (Physics.Raycast(Camera.current.ScreenPointToRay(mousePosition), out var hit))
            {
                Debug.Log(hit.point);
            }
        }
    }
}
SomethingAsset.cs
using UnityEngine;

[CreateAssetMenu]
public class SomethingAsset : ScriptableObject
{
    // なんか
}

説明

このコードは、SomethingAssetをクリックしたときにSceneViewPositonOnEnableが呼ばれその中の処理が実行されます。このOnEnableの中がSceneViewをクリックしたときのイベントを登録するモノです。

昔の記事ではonSceneGUIDelegateを使うパターンが紹介されていますが、これは非推奨になっており、代わりにduringSceneGuiが提供されています。

OnSceneViewClickの中は一般的なEvent処理を行っています。コードのコメントを読めば何とかなると思います。

結論

結論としては、SceneView.duringSceneGuiにイベントを登録すれば良いということなので、登録方法によっては色々なものに使いまわせるのではないでしょうか。

終わりに

これを使って少しツールを作成しているので、いずれパッケージとしてリリースできるといいですね。
2月中旬ぐらいまでにはします。(Accelがそのくらいに終わるため。)たぶん。たぶん。

良ければX(Twitter)フォローしてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1