Photon Fusion for Unityで 障害物生成型2Dアクションオンライン対戦ゲームを作る

2.5K Views

December 10, 23

スライド概要

【年末だよ】Unity お・と・なのLT大会 2023 で使用した資料です

profile-image

都内勤務のWeb寄りエンジニア 趣味でゲームを作成

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Photon Fusion for Unityで 障害物生成型2Dアクションオン ライン対戦ゲームを作る 2023/12/10 【年末だよ】Unity お・と・なのLT大会2023 by ニム式

2.

自己紹介 ● 名前 ニム式 ● サイト http://nimushiki.com ● twitter https://twitter.com/ni26mu ● Photon Fusionアンバサダーとして奮闘中 ● UnityバイブルR5夏号、UNIBOOK14、Qiita ● 猫3匹と同棲

3.

障害物生成型2Dアクション オンライン対戦ゲーム

4.

アジェンダ ● Photon Fusion公式サンプルについて ● オブジェクトの生成 方法 ● オブジェクトの生成 ルール

5.

Photon Fusion公式サンプルについて

6.

ベースとなる公式サンプル ● Razor Madness ● プラットフォーマーレーシングゲーム ● https://doc.photonengine.com/ja-jp/fusion/cu rrent/game-samples/fusion-razor-madness

8.

Razor Madness ● リアルタイム ● 2Dアクション ● スタートからゴールへ行く順番を競う

9.

足りない要素はトラップ周り ● 生成する ● バリエーションを用意する ● スコアの計算をする

10.

足りない要素はトラップ周り ● 生成する ● バリエーションを用意する ● スコアの計算をする 今回の発表内容

11.

オブジェクトを生成する

12.

入力の処理~通常 ● マウス位置の取得 Camera.main.ScreenToWorldPoint(Input.mousePos ition)

13.

入力の処理~注意点 ● ローカルの入力を判定する必要がある Input.mousePosition Player2オブジェクト どっちの入力!? メインカメラ Input.mousePosition Player1オブジェクト Player1(Host)

14.

入力の処理~注意点 ● 各々のカメラ位置を判定する必要がある Camera.main.ScreenToWorldPoint Player2オブジェクト メインカメラ 追尾 Camera.main.ScreenToWorldPoint Player1オブジェクト Player1(Host) Player2のカメラは… Player1のところにあるな! (バグ)

15.

入力の処理~実装①OnInputコールバック ● 入力権限(InputAuthority)があると動作 ● ≒自プレイヤーオブジェクト OnInput InputAuthority==false OnInput InputAuthority==true Player2オブジェクト Player2オブジェクト OnInput InputAuthority==true OnInput InputAuthority==false Player1オブジェクト Player1オブジェクト Player1(Host) Player2(Client)

16.

入力の処理~実装②座標変換 ● マウス位置→ワールド座標→Tilemap座標 var worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); var cellPosition = _tilemap.WorldToCell(worldPosition);

17.

入力の処理~実装③NetworkInput ● Photon Fusionが自動で同期 public class InputController : NetworkBehaviour, INetworkRunnerCallbacks{ public void OnInput(NetworkRunner runner, NetworkInput input) InputData currentInput = new InputData(); //入力を処理 input.Set(currentInput); } } {

18.

オブジェクトの生成 ● Object Instantiate ○ 同期されない ○ ローカルでのみ有効

19.

オブジェクトの生成 ● Runner.Spawn ○ 同期される ○ 使い方はInstantiateと同じ

20.

詳しくはQiita記事で ● 実際のコード ● より詳細な解説 「Photon Fusion for Unityで障害物生成型2Dアクショ ンオンライン対戦ゲームを作る」 https://qiita.com/nimushiki/items/bd172b828a8a0 f617a78

21.

オブジェクト生成のルール ● 時間を制限 ● 回数を制限 ● 場所を制限

22.

オブジェクト生成 時間を制限① ● ゲーム開始前の数秒間 ロード ゲーム開始前 ゲーム開始後

23.

オブジェクト生成 時間を制限① ● カウント制御 ○ LevelBehaviour.cs ○ Fusion.TickTimer StartTimer ● カウントの終了判定 ○ StartTimer.Expired ○ →これを返す関数を追加 https://doc.photonengine.com/ja-jp/fusion/current/manual/ticktimer

24.

オブジェクト生成 時間を制限② ● リスポーンまでの数秒間 ● リスポーンの管理 ○ PlayerBehaviour.cs ○ Respawningフラグを流用

25.

オブジェクト生成 回数を制限 ● 初期値の設定 ● 生成ごとにカウントマイナス ● 行動開始時に初期化

26.

オブジェクト生成 場所を制限 ● マップはTilemap製 ● いくつかのレイヤーに分かれている

27.

オブジェクト生成 場所を制限 ● 生成可能エリアを設定 ● 生成時に判断 生成可 生成不可

28.

オブジェクト生成 場所を制限 ● _tilemap.GetTile(cellPosition) ● nullでないなら生成可能 not null

30.

補足 ● 詳しい実装 ● 紹介してない実装 →Unityアドカレ2023 12/24 https://qiita.com/advent-calendar/2023

31.

ご清聴ありがとうございました!