ここ最近、Unityに時間を割くことが多くなりました。
そんな中、PCでオブジェクトを動かして、複数のSPでその位置情報をもとに描画をするARを作る事になりました。
正直、「初心者には、難易度には高すぎない?」と思いつつ、頑張ってやる事になりました。
調査を進める中で、
分かったことをまとめていきたいと思います。
そもそも、オンラインでやり取りするするには
まず、オンラインでリアルタイムに行うという事は、かなりややこしい事をするという事です。
アプリケーションだけでは解決できず、ネットワークが絡んできます。
Webの場合
非同期で常にデータをやり取りする事自体はかなり前からありました。
例えば、次のような方法があります 。
- jsで定期的、あるいはアクションを実施したタイミングでAPIを叩く
- websocketを介してデータをやり取りする
自分の見解
Webしか経験が無い自分が出せる方法としたら、次のやり方があるのではないかと考えます。
- ソケット通信でPCとSPを接続する。
- WebSocket
- Socket.IO
- DBサーバーを立ててデータを取りまわす。
- APIを作成して、端末からデータを取るようにする。
ソケット通信については、実装経験が無く想像が出来ませんでしたのでDBサーバーを立てる案で色々探ってみます。
DB設計をしてみるが…
兎に角、異なる環境下でデータをやり取りするためのDBを設計する必要があります。 しかし、設計以前に次の不安がよぎります。
- 1テーブルにひたすら、各要素の座標データと、向きデータで、これをひたすら更新し続ける事で本当にいいのか?
- 体感的に、1フレーム/コンマ秒。この通信でDBの処理する事なんて可能なのか?
- むしろ、そんな高速な通信できるのか??
- 体感的に、1フレーム/コンマ秒。この通信でDBの処理する事なんて可能なのか?
色々思考を巡らせる中で、
「これってオンラインゲームと同じ原理なんじゃ…。」
という考えに至りました。
オンラインゲームを調べる上でのキーワード
マルチプレイ
ネットを介し、多人数が同時アクセスしてゲームを行う事を総称です。
オンラインゲームを作るうえで必要な言葉
色々と読み漁ってみると次のような言葉が出てくる事を知りました。
通信関係の情報を読み漁る中で、今後この言葉を目にすることになると感じます。
パケットとフレームの関係
パケットとは、データを一定のサイズに区切った物で、
フレームはその区切ったファイルに情報を持たせたもの。
精肉に例えると、牛(データ)を解体して200g(パケット)ずつ、部位毎のパック(フレーム)にして肉屋に卸すみたいな感じでしょうか。
ホストとゲストの関係
オンラインゲームの場合、ホストがゲームの大本を構成し、ゲストが相乗りさせてもらうような形になります。
ホストは、ゲームサーバーが担う場合もあれば、ゲスト(ユーザー)が担う場合もあるようです。
同期
オンラインゲームの場合、(前述した)フレーム毎にユーザーが行動します。
フレームにユーザーの操作を付与し、ホストで操作を元に計算を行います。
その結果をもとに、それぞれのユーザーに同じ結果を返します。
これが同期です。
また、アプリケーションによっては、ゲスト側でそれぞれ計算させる場合もあるようです。
参考URL
オンラインゲームの概要
パケットとフレームの関係
PhotonCloud
オンラインゲームを作る上で必要な、バックエンドの仕組みや装置(サーバー、ネットワーク構成)等を簡単に作るためのサービスです。
オンラインゲーム開発向けネットワークエンジンと言う言葉を使わる事もある用です。
Unity用のアセットも用意されており、気軽にオンラインゲームを作れるようになる(そうです。)
無料のプランからあるので、検証に使用することも可能です。
参考図書
オンラインゲームについて調べようとなると、この2つが候補に挙がります。
どちらも、電子版は出ています。
オンラインゲームのしくみ Unityで覚えるネットワークプログラミング
- 作者: 河田匡稔
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/09/06
- メディア: 単行本
- この商品を含むブログを見る
オンラインゲームを支える技術 ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)
- 作者: 中嶋謙互
- 出版社/メーカー: 技術評論社
- 発売日: 2011/03/24
- メディア: 単行本(ソフトカバー)
- 購入: 33人 クリック: 1,696回
- この商品を含むブログ (57件) を見る
オンラインゲームのしくみについては、2018年9月6日現在、kindle版が安く購入できるので少し試し読みしてみる位の気持ちで購入することが可能です。
以上。
今日はここまで。