Blueless
概要
このサンプルは全ソースコードを公開しています。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)
ハイライト
テクニカル
- カスタムステアリングを実装したキャラクターコントローラー3D。
- デルタムーブメントに基づくレイキャスト・プロジェクタイル。
- データ駆動型ポリモフィズム。
- エンティティプロトタイプをともなうリスポーンポイント。
- アクティブでないプレイヤーの切断システム。
ゲームプレイ
- 高速な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