あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

衝突を取得する/接触を取得する

物理計算のため、RigidBodyコンポーネントを追加すると、コリジョン(衝突)を取得できる。
取得は基本的に OnCollisionEnter()で取得する。

void OnCollisionEnter(Collision col){
  if (col.gameObject.tag == "Player"){
    //処理
  }
}

剛体物理を適用したくない場合は、インスペクタの ***Collider のところでIs Triggerを入れて、以下で取得する。

void OnTriggerEnter(Collider col){
  if (col.gameObject.tag == "Player"){
    //処理
  }
}

通常のコリジョンの取り方は、

void OnCollisionEnter(Collision col){...} //あたりはじめ
void OnCollisionStay(Collision col){...} //あたっている間
void OnCollisionExit(Collision col){...} //あたりおわり

IsTriggerをONにしたものは剛体物理が適用されず、範囲に入ったかの判定に使われる。

void OnTriggerEnter(Collider col){...}
void OnTriggerStay(Collider col){...}
void OnTriggerExit(Collider col){...}

コリジョン内ではContactPointをチェックできるので、あたった位置はそれで判定できる。

void OnCollisionStay(Collision col) {
  foreach (ContactPoint contact in col.contacts) {
    Debug.Log(contact.name);
  }
}

CharactorControllerを使えばコリジョンの位置が上か下か横かというフラグが取れるらしい。

あらかじめ

Physics.IgnoreCollision(collider1, collider2);

とすると、1と2の衝突を無効にできる。

Triggerで取って一部のオブジェクトにのみ衝突判定を発生する方法が欲しいのだがわかっていない。