2.4K Views
December 10, 23
スライド概要
【年末だよ】Unity お・と・なのLT大会 2023 で使用した資料です
Photon Fusion for Unityで 障害物生成型2Dアクションオン ライン対戦ゲームを作る 2023/12/10 【年末だよ】Unity お・と・なのLT大会2023 by ニム式
自己紹介 ● 名前 ニム式 ● サイト http://nimushiki.com ● twitter https://twitter.com/ni26mu ● Photon Fusionアンバサダーとして奮闘中 ● UnityバイブルR5夏号、UNIBOOK14、Qiita ● 猫3匹と同棲
障害物生成型2Dアクション オンライン対戦ゲーム
アジェンダ ● Photon Fusion公式サンプルについて ● オブジェクトの生成 方法 ● オブジェクトの生成 ルール
Photon Fusion公式サンプルについて
ベースとなる公式サンプル ● Razor Madness ● プラットフォーマーレーシングゲーム ● https://doc.photonengine.com/ja-jp/fusion/cu rrent/game-samples/fusion-razor-madness
Razor Madness ● リアルタイム ● 2Dアクション ● スタートからゴールへ行く順番を競う
足りない要素はトラップ周り ● 生成する ● バリエーションを用意する ● スコアの計算をする
足りない要素はトラップ周り ● 生成する ● バリエーションを用意する ● スコアの計算をする 今回の発表内容
オブジェクトを生成する
入力の処理~通常 ● マウス位置の取得 Camera.main.ScreenToWorldPoint(Input.mousePos ition)
入力の処理~注意点 ● ローカルの入力を判定する必要がある Input.mousePosition Player2オブジェクト どっちの入力!? メインカメラ Input.mousePosition Player1オブジェクト Player1(Host)
入力の処理~注意点 ● 各々のカメラ位置を判定する必要がある Camera.main.ScreenToWorldPoint Player2オブジェクト メインカメラ 追尾 Camera.main.ScreenToWorldPoint Player1オブジェクト Player1(Host) Player2のカメラは… Player1のところにあるな! (バグ)
入力の処理~実装①OnInputコールバック ● 入力権限(InputAuthority)があると動作 ● ≒自プレイヤーオブジェクト OnInput InputAuthority==false OnInput InputAuthority==true Player2オブジェクト Player2オブジェクト OnInput InputAuthority==true OnInput InputAuthority==false Player1オブジェクト Player1オブジェクト Player1(Host) Player2(Client)
入力の処理~実装②座標変換 ● マウス位置→ワールド座標→Tilemap座標 var worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); var cellPosition = _tilemap.WorldToCell(worldPosition);
入力の処理~実装③NetworkInput ● Photon Fusionが自動で同期 public class InputController : NetworkBehaviour, INetworkRunnerCallbacks{ public void OnInput(NetworkRunner runner, NetworkInput input) InputData currentInput = new InputData(); //入力を処理 input.Set(currentInput); } } {
オブジェクトの生成 ● Object Instantiate ○ 同期されない ○ ローカルでのみ有効
オブジェクトの生成 ● Runner.Spawn ○ 同期される ○ 使い方はInstantiateと同じ
詳しくはQiita記事で ● 実際のコード ● より詳細な解説 「Photon Fusion for Unityで障害物生成型2Dアクショ ンオンライン対戦ゲームを作る」 https://qiita.com/nimushiki/items/bd172b828a8a0 f617a78
オブジェクト生成のルール ● 時間を制限 ● 回数を制限 ● 場所を制限
オブジェクト生成 時間を制限① ● ゲーム開始前の数秒間 ロード ゲーム開始前 ゲーム開始後
オブジェクト生成 時間を制限① ● カウント制御 ○ LevelBehaviour.cs ○ Fusion.TickTimer StartTimer ● カウントの終了判定 ○ StartTimer.Expired ○ →これを返す関数を追加 https://doc.photonengine.com/ja-jp/fusion/current/manual/ticktimer
オブジェクト生成 時間を制限② ● リスポーンまでの数秒間 ● リスポーンの管理 ○ PlayerBehaviour.cs ○ Respawningフラグを流用
オブジェクト生成 回数を制限 ● 初期値の設定 ● 生成ごとにカウントマイナス ● 行動開始時に初期化
オブジェクト生成 場所を制限 ● マップはTilemap製 ● いくつかのレイヤーに分かれている
オブジェクト生成 場所を制限 ● 生成可能エリアを設定 ● 生成時に判断 生成可 生成不可
オブジェクト生成 場所を制限 ● _tilemap.GetTile(cellPosition) ● nullでないなら生成可能 not null
補足 ● 詳しい実装 ● 紹介してない実装 →Unityアドカレ2023 12/24 https://qiita.com/advent-calendar/2023
ご清聴ありがとうございました!