LoginSignup
1
1

More than 3 years have passed since last update.

Unityでオンラインマルチプレイなゲームを作りたい その13 当たり判定について

Last updated at Posted at 2019-09-20

前回の記事でダンジョンの生成同期を行なえるようにしました。
これでプレイヤー, 敵, 弾, ステージがそろったので、ゲームとしての必要最低限のパーツは整いました。
ということで、当たり判定を設けて遊べるようにしていこうと思います。

今回の目標

当たり判定を実装します。

プレイヤーの当たり判定

まずはプレイヤーから、その8 プレイヤーの同期で実装しているPlayerクラスに追加します。

ホストで全てやるか、各クライアントでやるか

基本はホストで各クライアントの当たり判定も計算してしまうのですが、
飛んでくる弾の視認性的にホストで行った際にラグ等で起こるズレが気になるかもしれません。(FPSの銃弾ならいいんですがね...。)
ということで、今回は各プレイヤーで当たり判定を行ってもらうように実装します。

※追加するところ以外は省いてます。

Player.cs
/// <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で行っているのでこれと言って特に同期する処理は新しく追加していません。

敵の当たり判定

つぎに敵の当たり判定の実装を行います。

Enemy.cs
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で行っているので、同期については特に新しく追加することはありません。

弾の判定

弾は発射のタイミング同期で生成された後、ネットワークを介した処理は行っていないため、特に実装することはありません。
強いて言うなら各クライアントでどこかしらにヒットした際に弾を消す処理を加えてあげるくらいです。

記事内容的に目新しいものはなかったですね。プレイヤーの当たり判定を行うところで、ホストでやるかクライアントでやるか、が少し重要なくらいでした。

ここでゲーム内容のネットワークの実装については最後になります。
次回はリザルト画面を作りたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1