見出し画像

[Unity]LAN内のマッチングで、マルチ対応アプリを作っていきましょう

ネットワークゲームって作るために、サーバーを設置するもしくは何かしらのクラウドサービスを利用する必要があって、何か少し敷居高くないですか?

そこでふと思ったので、サーバーなしで 同じネットワーク(LAN内) のみでマルチプレイ出来るようなサンプルもあって良いんじゃないかと・・・

■LAN内のみで出来るといいこと
・サービス等を一切使わないのでお金はかからない
・サービスが止まってしまった、上限超えてしまった等の理由で遊べなくなるようなことも避けられます
・展示会場とかで出すときに、外のネットワークが安定してつながっているとは限らないので、LAN内で完結するなら安定しやすい

こんな感じでLAN内で出来ると、いいことも多いです。

■でも・・・出来ないこと
遠隔地の人と一緒に出来ないっていう最大の問題がありますが、そこは目をつむりましょう。
思い返してみると2000年代の携帯用ゲーム機も、今のようにオンラインネットワークに接続して遊ぶような形はあまりなかったと思います。
ゲーム機を持ち寄ってアドホック通信で一緒に遊んでいたと思います。あの頃のようなイメージですね。

また昔のPCゲームでもLANでのマルチプレイをサポートしているタイトルはそこそこあったと思いますね.

■サンプル作りました
ということで早速サンプルのUnityプロジェクトを作りました。
今回のものはコチラになります。

これは Broadcastアドレス(255.255.255.255)にUDPでデータを送出する事で実現しています。
Broadcast宛のデータは同じネットワーク内の人に対して一斉送信しているようなイメージです。
これにRoom情報を載せる事で処理しています。

※詳しい機能とかは githubのReadMeに書いているので、こちらを見てもらえれば…

■動作の様子

この様子は、Android、Mac、WindowsPCでマッチングしている様子です。

画像1

最初にルームを誰かが立てます、そしてその後他の人はルームを探し、立てた部屋につなぎにいくというものになっています。

こんな感じでLAN内でのみ完結すれば、サーバーの設置も、アカウントセットアップもなく、マルチプレイが実現できます。
(※もちろん1台のPC上でも可能なように作っています)

■気軽にと言いましたが…

「気軽にマルチプレイをやってみていこう」といったものの、マルチプレイ自体が実は難しんですよね…

「どういう情報をやり取りすれば、同期できるのか?」この辺が実は難しいんですよね…。これはアプリによって異なってきます。
すべての情報を送ろう情報量が多くなってしまうので、適切に情報量を減らしつつかつ同期させる必要があります…。
また、ネットワーク上でデータを送ると遅延はするので…
ユーザー間での情報取得タイミングの違いなどから、ユーザー間で矛盾が起きたりすることもあります。
(たとえばレースゲームでのゴールの順位がユーザーごとに違うなどが簡単に起こりえます)

どういう情報をやりとりして、どう同期させるのか?矛盾やエラー時の処理…じつは、そういった所の難しさがあります・・・。

一口にマルチプレイと言っても、色々な選択肢があってどうするか…という事は以前に書いたコチラの記事も見ていただければと思います。


マルチプレイはそこの難しさにあたる前に…サーバーセットアップやらで詰まることが多いというのも聞く話です。
なので…今回はそういう障壁取っ払ってみました。気軽にマルチプレイやってみて、あっこれって思ったより考える事多いんだなぁと思ってもらえたら幸いです。

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