quantum | v2 switch to V1  

Blueless

Level Intermediate

概要

このサンプルは全ソースコードを公開しています。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を使用します。 狙いを定めるにはマウスカーソル、撃つには左マウスボタンを使用します。

トップに戻る
 

便利なパターン

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

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

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を使用して、プレイヤーが存在するかを確認しています。このため、しばらく存在していないプレイヤーのエンティティはシミュレーションから削除されます。

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);
    }
  }
}

ドキュメントのトップへ戻る