UnityでRPGを作る場合にマップとかってどうやって作るんだろうと疑問に思った、
内部的なプログラム実装ではなくマップチップを組み合わせるエディタやツールをどうするのかという話です。
そういう専用のシーンを用意してPlayして組み上げていけばいいかなと、
当初は考えていたんですが、Stopした時点でプロパティはリセットされるし、
Play中にInstantiateしたゲームオブジェクトも消えてしまうのは都合が悪い。
もちろんStop前に必ずシリアライズ化する運用などでカバーもできるかもだが、
俺は運用でカバーという言葉を何よりも信用していない。
(運用でカバーの話を掘り下げると時間が足りなくなるので割愛)
アセットツールのProBuilderやProGridは非Play状態で様々な機能を提供しているので
何らかの方法があるんだろうなと調べていたらありました。
「エディターウィンドウ」です。
この機能と共に「ExecuteInEditMode」を活用すると上手く行きそう。
(参考記事:スクリプトを Edit モードで実行)
マップエディターとしての機能はさておきやりたかった事は実現できそうですが、
ちょいちょい落とし穴があったので備忘録を残しておきます。
Updateの更新が毎フレームではない
シーン内の何かが更新された時にコールされる様です。
具体的にはよくわからないですが、オブジェクトを移動させたりすると呼ばれました。
マウスカーソルに合わせてグリッドにそったキャレットみたいなものを動かしたかったんですが、
Updateでは上手くいかなかった。
Input.mousePositionでマウス座標とれない
Play中はゲームビューを見る事になりますが、Edit中はシーンビューです。
シーンビューの場合は「Event.current.mousePosition」で座標をとるのが正しいらしいです。
(参考記事:SceneView上でクリックした時などのイベントを取得する【Unity】【エディタ拡張】)
シーンビューのカメラを使用する
Camera.mainで取得できるカメラはゲームビューで使用されるカメラなので、
シーンビューで使用するカメラはSceneView.currentDrawingSceneView.cameraで取得
ゲームオブジェクトの破棄
オブジェクトの破棄はDestroyではなくDestroyImmediateという地味な違いがある
記事の内容を簡潔にまとめたサンプルを用意しました、よければ参考にしてください。
https://github.com/yametai2kin/demoeditorwindow