このようなクォータービューの2Dドット絵ゲームを作っています。
当初は移動も斜め方向にしようと思ったのですがWASDキーと相性が悪いのでやめました。
1つのキーを押したときは上下左右の各方向に、2つのキーを同時押しで斜め移動に移動するようにしています。
この作業中に得たtipsやメモを書いておきます。Collider 2Dが中心です。
Collider (2D)を設定しているのにイベントが発生しない
キャラクターとオブジェクトそれぞれにCollider 2Dをアタッチしているのに、 OnTriggerEnter2D(collider2d)
や OnTriggerStay2D(collider2d)
が呼ばれないという問題に直面しました。
原因01: Edge Collider 2D
どうやらEdge Collider 2D同士だと、衝突判定が得られないようです。Polygon Collider 2Dなど、片方を他のタイプのCollider 2Dに変更します。
原因02: スクリプトをアタッチしているコンポーネントが違う
OnTriggerEnter2D(collider2d)
を書いた MonoBehaviour
スクリプトがアタッチされているComponentの子にCollider 2Dがついていたため、イベントが発生しても受け取ることができていませんでした。
イベント関数を書いたスクリプトとCollider (2D)は同一のComponentにアタッチしましょう。
参考
No Collision with Edge Collider 2D – Unity Answers
Collider (2D)の一部を削除したい
Polygon Collider 2DをアタッチするとSpriteに合わせて自動的に良い感じのColliderを作ってくれますが、頂点が多すぎたり線が重なったり、複雑に作りすぎてしまうこともあります。
一部のedgeを削除するには、Inspectorで Edit Collider をオンにして、
Ctrlキー(Windows) / Commandキー (Mac)を押しながら緑の線をクリックすることでその部分を消すことができます。
参考
How to remove vertex islands from a Polygon Collider 2D? – Unity Answers
新Input Systemで押しっぱなしの状態が取れない
WASDキーを押し続けている間は歩き続ける、というようにしたいのですが、新Input SystemでInput Actionsという定義ファイルを使った方法では押した瞬間と押すのをやめた瞬間にイベントが走り、押しっぱなしという状態が検知できませんでした。
仕方がないので押した瞬間と離した瞬間に得られるVector2の値を利用して、 void Update()
関数で更新する方法を取りました。詳しくは参考欄のテラシュールブログさんをご覧ください。
なお Input Systemを使っていると以下のようなエラーによく出会いますが、
NullReferenceException while executing 'performed' callbacks of 'UI/Navigate[/Keyboard/upArrow,/Keyboard/downArrow,/Keyboard/leftArrow,/Keyboard/rightArrow]'
Input System自体が何かをしているというよりは、Input Systemを使って引き起こされたどこかでエラーが起きたというログなので、このエラーではなく、これの次に表示されるエラーメッセージをよく読むようにしましょう。
参考
【Unity】新・新しいInput Systemの使い方(Inputsystem ver 1.0版) – テラシュールブログ