This document is about: QUANTUM 2
SWITCH TO

Blueless

Level 4

概要

このサンプルは全ソースコードを公開しています。Quantumを使用して高速アクションのオンライン2D・プラットフォームシューティングゲームを作成する方法を説明します。

免責事項: このサンプルはBitCake Studioによって、Photon Engineのために開発されました。

ダウンロード

バージョン リリース日 Download
2.1.5 2023年3月21日 Quantum Blueless 2.1.5 Build 38
2.1.1 2022年12月5日 Quantum Blueless 2.1.1 Build 37
2.1.0 2022年9月16日 Quantum Blueless 2.1.0 Build 35

起動前に

このサンプルをオンラインマルチプレイヤーモードで実行するには、まずPhotonEngine ダッシュボードでQuantum AppIDを作成し、PhotonServerSettingsアセット内のAppIdフィールドにそのAppIDをペーストしてください。
その後、「Scenes」メニューで「Menu」シーンをロードして「Play」をクリックします。

技術情報

  • Unity: 2020.3.20f1.
  • プラットフォーム: PC (Windows / Mac), WebGLおよびモバイル(Android)

ハイライト

テクニカル

ゲームプレイ

  • 高速な2Dプラットフォームシューティングゲーム。
  • ダブルジャンプ。
  • エリアダメージ。
    *グレネード。
  • 武器のリロードタイム。
  • 武器のインベントリを使用して武器を変更。

コントロール

移動にはA Sを使用し、ジャンプにはSpaceを使用します。武器の変更にはQ E、グラネードにはFを使用します。 狙いを定めるにはマウスカーソル、撃つには左マウスボタンを使用します。

便利なパターン

デルタムーブメントに基づくレイキャスト・プロジェクタイル

この方法は、高速の弾丸が壁を越えないようにするのに適しています。方向と速度にもとづいたレイキャストが使用され、次の弾丸の動きを予想し、当たりがあれば検出します。

C#

Physics2D.HitCollection hits = frame.Physics2D.LinecastAll(bulletTransform->Position, futurePosition);
for (int i = 0; i < hits.Count; i++)
{
  var entity = hits[i].Entity;
  ...
  if (entity == EntityRef.None)
  {
    bulletTransform->Position = hits[i].Point;
    // Applies polymorphic behavior on the bullet action
    data.BulletAction(frame, bullet, EntityRef.None);
    return true;
  }
}

切断システム

弊社は DeterministicInputFlagsを使用して、プレイヤーが存在するかを確認しています。このため、しばらく存在していないプレイヤーのエンティティはシミュレーションから削除されます。

C#

public override void Update(Frame frame)
{
  frame.Global->DisconnectTime += frame.DeltaTime;

  var robotsFilter = frame.Filter<PlayerID, Status>();
  while (robotsFilter.NextUnsafe(out var robot, out var playerID, out var robotStatus))
  {
    DeterministicInputFlags flags = frame.GetPlayerInputFlags(playerID->PlayerRef);

    if ((flags & DeterministicInputFlags.PlayerNotPresent) == DeterministicInputFlags.PlayerNotPresent)
    {
      robotStatus->DisconnectedTicks++;
    }
    else
    {
      robotStatus->DisconnectedTicks = 0;
    }
    if (robotStatus->DisconnectedTicks >= 15)
    {
      frame.Destroy(robot);
    }
  }
}
Back to top