はじめに
前回、敵を増殖できたので、この敵への当たり判定とゴールオブジェクトの当たり判定をPhysicsを使って実装してみたいと思います。
前回の記事
Physicsの当たり判定の種類
2種類あります。
Collisionモード…衝突モード。オブジェクトが当たった場合と、跳ね返りの衝突も検知される。ので、オブジェクト同士が当たると跳ね返る。
状態 | メソッド |
---|---|
当たった瞬間 | OnCollisionEnter2D |
当たってる間 | OnCollisionStay2D |
当たり終わった瞬間 | OnCollisionExit2D |
Triggerモード…すり抜けモード。オブジェクトが当たった場合のみ検知される。跳ね返りは検知されないのでオブジェクト同士が当たってもすり抜ける感じになる。
状態 | メソッド |
---|---|
当たった瞬間 | OnTriggerEnter2D |
当たってる間 | OnTriggerStay2D |
当たり終わった瞬間 | OnTriggerExit2D |
敵に当たり判定をつける
Physicsを使うため、敵(🦐)のPrefabにCircle Collider 2Dコンポーネントをアタッチします。
重力もつけたいので、Rigidbodyもアタッチします。
※本当は増殖させる前に原本で当たり判定作っておくのが良かったかも。
敵(🦐)のPrefabを以下のように書き換えます。
public class EnemyController : MonoBehaviour
{
Rigidbody2D rigidbody2;
float walkForce = 30.0f;
float maxWalkSpeed = 2.0f;
bool isTouch = false;
void Start()
{
this.rigidbody2 = GetComponent<Rigidbody2D>();
}
void Update()
{
// 画面外まで下に落ちたら消える
if (transform.position.y < -5)
{
Destroy(gameObject);
}
// 地面に落ちたら左移動
if (this.isTouch)
{
// 速度
float speed = Mathf.Abs(this.rigidbody2.velocity.x);
// 左横移動
if (speed < this.maxWalkSpeed)
{
this.rigidbody2.AddForce(transform.right * -1 * this.walkForce);
}
}
}
//
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.name == "Kani")
{
Debug.Log("ゲームオーバー");
} else
{
this.isTouch = true;
}
}
🦀に当たるとゲームオーバーに(ここでは一旦コンソール表示)、地面に着地した場合はそのまま左に移動して落ちていくようにしました。
左横に移動する処理は以前Physicsを使った横移動で🦀にかいたスクリプトと同じ内容です。
ゴールを追加して当たり判定をつける
ゴールオブジェクトを追加します。
追加したゴールオブジェクトにBox Collider 2Dコンポーネントをアタッチします。
追加したら、Box Collier 2Dの「Is Trigger」にチェックを入れます。
チェックをいれると、すり抜けモードとなり、下のスクリプトで登場するOnTriggerEnter2Dメソッドが使えるようになります。
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("ゴール");
}
おわりに
このゲームの完成も近づいてきた感じがします。
次回、ゴールをするとクリアシーンに遷移するようにしたいと思います。