前回の記事でダンジョンの生成同期を行なえるようにしました。
これでプレイヤー, 敵, 弾, ステージがそろったので、ゲームとしての必要最低限のパーツは整いました。
ということで、当たり判定を設けて遊べるようにしていこうと思います。
今回の目標
当たり判定を実装します。
プレイヤーの当たり判定
まずはプレイヤーから、その8 プレイヤーの同期で実装しているPlayerクラスに追加します。
ホストで全てやるか、各クライアントでやるか
基本はホストで各クライアントの当たり判定も計算してしまうのですが、
飛んでくる弾の視認性的にホストで行った際にラグ等で起こるズレが気になるかもしれません。(FPSの銃弾ならいいんですがね...。)
ということで、今回は各プレイヤーで当たり判定を行ってもらうように実装します。
※追加するところ以外は省いてます。
/// <summary>プレイヤークラス</summary>
public class Player : UnityEngine.MonoBehaviour
{
//
private void OnTriggerEnter2D(Collider2D other)
{
if (!monobitView.isMine) { return; }
if (other.tag.Equals("EnemyBullet"))
{
--m_HealthPoint;
m_State = State.Unrivaled;
if (m_HealthPoint <= 0){ Dead(); }
}
}
/// <summary>死亡処理</summary>
private void Dead()
{
m_State = State.Dead;
m_HealthPoint = 0;
m_FlashingColor.a = 0.5f;
m_SpriteRender.color = m_FlashingColor;
tag = "Player(Dead)";
}
}
OnTriggerEnter2D
内で敵弾に当たった際にHPを減らし0になったら死亡するというシンプルな内容になっています。
OnTriggerEnter2D
の頭でmonobitView.isMine
を使い自身だけで処理を行うようにしています。
パラメータの同期については、その8 プレイヤーの同期で既に実装しているOnMonobitSerializeView
で行っているのでこれと言って特に同期する処理は新しく追加していません。
敵の当たり判定
つぎに敵の当たり判定の実装を行います。
public class Enemy : UnityEngine.MonoBehaviour
{
//
private void OnTriggerEnter2D(Collider2D other)
{
if (!MonobitNetwork.isHost) { return; }
if (other.tag.Equals("PlayerBullet"))
{
-m_HealthPoint;
if (m_HealthPoint <= 0)
{
m_HealthPoint = 0;
MonobitNetwork.Destroy(gameObject);
}
}
}
}
敵はホストで管理されているので当たり判定もホストで行うようにMonobitNetwork.isHost
で制限しています。
ヒット時のパラメータの同期等についてはプレイヤーと同じくOnMonobitSerializeView
で行っているので、同期については特に新しく追加することはありません。
弾の判定
弾は発射のタイミング同期で生成された後、ネットワークを介した処理は行っていないため、特に実装することはありません。
強いて言うなら各クライアントでどこかしらにヒットした際に弾を消す処理を加えてあげるくらいです。
記事内容的に目新しいものはなかったですね。プレイヤーの当たり判定を行うところで、ホストでやるかクライアントでやるか、が少し重要なくらいでした。
ここでゲーム内容のネットワークの実装については最後になります。
次回はリザルト画面を作りたいと思います。