見出し画像

【Day18】ネットワーク実装:検討編

夏休みも残り3日。
モックとはいえ通信対戦を入れると決めたら入れ切りたいので、今日も開発に勤しんでいます。
ネットワーク周りはかなり難題。
日々プログラマとして仕事をされている方には頭が上がらない思いです。

本日の作業

ネットワーク実装方法の検討と実装

本日はこれに尽きます。
Photon PUN2を使うことは決めていたのだけど、
・ネットワークオブジェクトをメインで使うか
・RPCに絞ってやりくりするか
その中での実装方法を検討。

RPCだけで頑張る説①

それぞれのプレイヤーがチップを用いて作ったプログラムを相手に送り、それぞれのローカルでバトルをしたら結果が同じになるのでは?
という考えのもと、実装してみました。

実装を進めていくうち、RPCではListを渡すことができないことを知りました。(プログラムはチップのListという形で管理している)
これでは渡せないので、チップのID(int)の配列を渡して、受け取った側でチップのListを作るという方法を試してみました。
こちらは成功。
ただ、条件分岐や繰り返しのチップの中に何が設定されているかまで取得することは難しい… 

結構考えても上記の実装方法が思いつかなかったので、この説は没にしました。

RPCだけで頑張る説②

それぞれのプレイヤーが行うアクションをRPCで送信したらうまく行くのでは?という思いのもと、実装してみました。

結果的に、カクつかないし、うまく動いている!
と思ったのですが、プレイヤー1とプレイヤー2の画面がすごくずれていることが発覚。
そりゃそうですよね、アクションを実行するタイミングに通信の誤差があるのだから、結果はずれていくし、バトル時間が長ければ長いほどどんどんずれていきます。

対応策として、プレイヤー1の画面でのキャラクターの位置を1/2秒に1回プレイヤー2の画面のキャラクターに伝え、同期を取ってみるということをやってみました。

こちらは半分成功。
位置ズレはなくなりましたが、プレイヤー2の画面はだいぶカクつくようになってしまいました。

対戦はできるようになったけど、これはNGかな…

というわけで

RPCだけでどうこうするのは、仕組み上も僕のスキル上も難しいということがわかったので、明日はネットワークオブジェクトとRPCを併用してみたいと思います。

つらつらと色々書いてみましたが、かなり試行錯誤をしながら進めていたので、すごく頭を使い、へとへとになってしまったので、本日の文章は読みづらくてごめんなさい。
ただ、ネットワーク関連の実装を進めるにあたり、すごく勉強になった1日だったなあと思います。

ネットワークは「ゲーム性によって、手法を取捨選択する」のが大事だなと、今日は改めて思いました。

成果

次回の作業

・ネットワークオブジェクトとRPCを併用して、ネットワーク周りの実装を解決する
・不具合対応とリファクタリング

この記事が気に入ったらサポートをしてみませんか?