【Unity】すぐ解決! 2Dアクションゲームでキャラクターが地面を貫通してしまう原因

【Unity】すぐ解決! 2Dアクションゲームでキャラクターが地面を貫通してしまう原因

 3Dアクションゲームの要領で当たり判定などを作ってしまうと使う関数の違いなどにより、オブジェクト間のすり抜けなどが発生してしまいます。陥りがちな原因と解決方法について調べた結果をまとめました。移動させる処理に transformを使っていたり意外とやりがちな原因が多いので最後までよろしくお願いします。

OnTriggerEnter()を使っている

 スクリプトでOnTriggerEnter()を使っているのが原因の可能性が考えられます。

 OnTriggerEnter()は3D用なので、Rigidbody2Dなどの2D用で使用する場合はOnTriggerEnter2D()を使いましょう。

オブジェクトにアタッチしたトリガーの中に別のオブジェクトが入ったときに呼び出されます。(2D 物理挙動のみ)

入ったオブジェクトに関する詳細な情報は呼び出し時に渡される Collision2D 引数に代入されます。

Unity/MonoBehaviour.OnTriggerEnter2D(Collider2D)

OnTriggerEnter2D()を定義する場所

 衝突を検知する関数はStart()やUpdate()内に定義してはいけません。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
  void Start(){}

  void Update(){}

  void OnCollisionEnter2D(Collision2D other){}
}

キャラクターと地面のどちらにもRigidbody2Dがついていない

 少なくとも片方は Rigidbody2D コーポネントを付けてあげる必要があります。

 また、Collider 2Dは両方につけてあげましょう。

  Rigidbody2D と Collider 2D の説明を記載しておきますね。

Rigidbody2D 物理的動作をさせるためのコーポネントの2D版。重力や摩擦以外にも、衝突検知を行える重要なコーポネントである。
Collider 2D 当たり判定を決定する重要なコーポネントの2D版。アクションゲームではキャラクターの体以外に当たり判定がないように注意する必要がある。

すべてUpdate()内で処理しようとしている

 操作入力の取得などはUpdate()内で処理する必要がありますが、物理判定や移動を行うものについては、Update()ではなくFixedUpdate()を使います。

移動させる処理transformにしている

 transformだと決まった距離を強制的に動かすので、地面をすり抜けてしまいます。

 Rigidbody2Dを使って移動させましょう。rigidbody2DComponent.MoveRotation()などですね。