白黒羊

【Unity】2Dの移動とか衝突判定でハマったところ

このようなクォータービューの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

【Unity】当たり判定が反応しない原因 – ユニツール

Collider (2D)の一部を削除したい

Polygon Collider 2DをアタッチするとSpriteに合わせて自動的に良い感じのColliderを作ってくれますが、頂点が多すぎたり線が重なったり、複雑に作りすぎてしまうこともあります。

自動生成されたPoligon Collider

一部のedgeを削除するには、Inspectorで Edit Collider をオンにして、

Polygon Collider 2DなどのコンポーネントをInspectorで確認

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版) – テラシュールブログ