つよつよにあこがれるプログラマの日記

子育てとかプログラムとか日々の事をここに残します。ぼちぼちやってます。

ほそぼそとゲーム開発。P2P、Socekt通信、よくわからん

凄く詰まって、詰まって煮詰まってちょっと抜け出せそうなので一服。

僕はモバイル用のゲームをいつかリリースすべく、ノロノロと休日プログラミングをしています。 普段はSierみたいなことをやってるので毎日Excelを開いたり閉じたりしているだけでゲームプログラミングとは無縁です。

今は「オンラインゲームのしくみ Unityで覚えるネットワークプログラミング」という本を使って写経しながら勉強してるんですが、ソケット通信でP2Pでチャットアプリを実装する所に来てピンとこなくなりました。
というのも、内容は実践的でわかりやすいんですが、肝心のチャットがPC上で実行しLocalhost内での通信になっているのでモバイル端末上で動くところがみられず、ゲーム開発初心者のよくわからなかったからです。

ソケット通信のサンプルアプリをいろいろなサイトで見てみたんですが、結構みんなLocalhost内での通信の話しかしていないので困りました。nodejsでSocket.ioを使うチャットアプリはいろいろ見たんですが、結局サーバー↔ブラウザ上の話なのでAndroidiPhone上でどうやってグローバルアドレスを取って、ポートを開けて待ち受けるのか、僕にはよくわかりませんでした。

「オンラインゲームの仕組み」とか、主語のでかいものをググると粒度の細かいものから荒いものまで色々な情報が出てきすぎて混乱しました。・・・絞って検索せねば・・・

そこで、まずはオンラインゲームの仕組みを絵に書いたりしてよく考えてみました。
P2Pで直接端末同士が通信すると、ハッキングされたり不正操作される。
・対戦中のプレイヤーの行動が取得できない(オンライン対戦でよく使われる技とかがわからない)

冷静に考えてみると、僕はPSPで実装できたとしても危ないし、不正防止のためにリレーサーバーが必要になるのではないかと思いました。 仮説が立てられたので、近しいことを書いているブログだけ見ていきました。

どうやら、やはりリレーサーバーが間にはいって対戦をさせるのが一般的なようです。

・UnityにおけるP2Pの実装
https://qiita.com/haminiku/items/ef80b6e8a4b4270efcd4

マルチプレイのサンプル
https://forum.unity.com/threads/unet-sample-projects.331978/?_ga=2.138374960.1808294958.1536805688-1235319137.153231507

・Socket.io 特定の誰かに送る
https://blog.mitsuto.com/nodejs-socketio-server-client

・Socket.io 特定の誰かに送る2
http://thr3a.hatenablog.com/entry/20141123/1416723018

・VisualStudioでデバッグ
https://docs.microsoft.com/ja-jp/visualstudio/ide/develop-code-in-visual-studio-without-projects-or-solutions?view=vs-2017

・おしえてGoo ※濃い事が書いてあってよく理解できないんだけど、なんとなくゲームの裏側で何をやっているのかわかった気がする
https://oshiete.goo.ne.jp/qa/8444808.html

今はNode.jsで対戦相手2名同士のデータを送り合うためのリレーサーバーを実装中です。 うまくいくといいなあ。

プレイヤーA ↔ サーバー ↔ プレイヤーB (お互いの行動をJsonで送り合い、クライアント側で処理)

しかし、リレーするサーバーを作ったとしていくつのコネクションまで貼れるのか、 コネクションが足りなくなったときに、マッチングサーバーを一つの世界で行いつつ並列して動けるようにサーバーを増やしていくのはどうやってやるのか。色々疑問はつきません。徐々に調べながら覚えていこうと思います。