この記事は金沢工業大学 Advent Calendar 2023の24日目です。
自己紹介
メリークリスマス!金沢工業大学メディア情報学科の学生です。CA Tech Accelに参加中でUnityモチベ高すぎな人。
本題
SceneViewをクリックしたらそこの座標を知りたい!
意外に最新版での方法がネットに書いてなさそうだったので、サクッと書きます。備忘録です。
また、ネットに書いてあるものはEditor拡張なのにMonoBehaviour
を使っていたり、、、個人的には少し違和感を感じたので、Editor
を使っての実装です。
コード
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);
}
}
}
}
using UnityEngine;
[CreateAssetMenu]
public class SomethingAsset : ScriptableObject
{
// なんか
}
説明
このコードは、SomethingAsset
をクリックしたときにSceneViewPositon
のOnEnable
が呼ばれその中の処理が実行されます。このOnEnable
の中がSceneViewをクリックしたときのイベントを登録するモノです。
昔の記事ではonSceneGUIDelegate
を使うパターンが紹介されていますが、これは非推奨になっており、代わりにduringSceneGui
が提供されています。
OnSceneViewClick
の中は一般的なEvent処理を行っています。コードのコメントを読めば何とかなると思います。
結論
結論としては、SceneView.duringSceneGui
にイベントを登録すれば良いということなので、登録方法によっては色々なものに使いまわせるのではないでしょうか。
終わりに
これを使って少しツールを作成しているので、いずれパッケージとしてリリースできるといいですね。
2月中旬ぐらいまでにはします。(Accelがそのくらいに終わるため。)たぶん。たぶん。
良ければX(Twitter)フォローしてください。