Slide 1

Slide 1 text

MMOの作り方 Akatsuki Geek Live【LT会:2/22(金)】 1 twitter : @AQUA_july Email:[email protected] Github:https://github.com/july1997

Slide 2

Slide 2 text

自己紹介 HN: july1997 ● 東北学院大学教養学部情報科学3年 本間 心 ● 現在(wdm合同会社・仙台)ー プログラマー ● たまにクラウドソーシングでプログラミング ● シェーダーとかもいじれます、PBRなど 2

Slide 3

Slide 3 text

概要 MikuMikuSpace サイト:https://mikumikuspace.ddo.jp/ 好きなMMDのモデルを操作できて、みんなで動画が見られたり、チャット機能のあるオン ラインゲーム。 制作人数:1人 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

制作の目的 5 ● オンラインゲーム作りたい、技術的に関心がある ● ゲームサーバー側の処理は何をどうすればいいか学びたい

Slide 6

Slide 6 text

クライアント編 6 やっていること ● MMDモデルの描画、アニメーション ● 物理演算 ● ネットワーク通信 ● 動画の取得、再生

Slide 7

Slide 7 text

開発環境 Visual Studio 2017 使用言語:C++ 使用ライブラリなど ● Bullet 2.87 ● Crypto++ 5.6.5 ● DXライブラリ Ver 3.20a ● EffekseerRuntime 1.40 対象プラットフォーム WIndows、Android 7

Slide 8

Slide 8 text

ライブラリの紹介 描画処理 DXライブラリ ● DirectXのラッパー(最近はAndroidにも 対応) ● MMDモデル等に対応 ● 更新頻度が高く初心者にオススメ URL : http://dxlib.o.oo7.jp/index.html 物理演算 Bullet Physics ● オープンソースの物理演算エンジン ● ゲーム内では常に物理演算 ● 色々な市販のゲームなどに使われたりし てる URL : http://bulletphysics.org/wordpress/ 8

Slide 9

Slide 9 text

ネットワーク関係の実装 ● 描画の処理と別スレッドでメッセージを送受信 (TCP) ● std::shared_ptrを用いてスレッドセーフに ● 通信機能自体はDXライブラリにある機能を利用 9 Server Player1 Player2 Player3 TCP

Slide 10

Slide 10 text

ID 1byte mess 3~6 byte データ (UTF-8) nbyte 10 プロトコル ● 通信の種別(ID)と通信内容(mess)をつけて 送信、スペース区切り ● サーバーはプレイヤーの IDを付けたりして他 のプレーヤーに送信 Server Player1 Player2 3 RES 1 こんにちは! Player1 : こんにちは! 3 RES こんにちは! プロトコル TCP

Slide 11

Slide 11 text

送信データ ● 移動時は30フレームごとに進行方向 のベクトルと回転の速度を送信、それ をもとに補完処理 ● 加えて300フレームごとに座標と回転 値(x,y,z,w)を送信 ● アニメーションは切り替わったタイミン グで適時送信 11 方向データ キャラの方向ベクトル、 ±回転速度 座標データ キャラの絶対座標と キャラの姿勢 アニメーション 情報 再生するアニメーショ ン サーバー 受け取ったタイミ ングで他のプレイ ヤーに送信

Slide 12

Slide 12 text

プレーヤーの同期 ● 一定期間でサーバー側がプレーヤーとの距離などで、そのプレーヤーがどのプレイヤーと同 期するのか決定 ● サーバーから同期するプレーヤーのリストを受け取り、リストから消えたユーザーは削除処 理、加わったプレーヤーは追加処理を行う ● モデルIDを送信して、クライアントが所持してなければダウンロードさせる 12

Slide 13

Slide 13 text

動画再生の仕組み ● youtube-dl https://github.com/rg3/youtube-dl/ youtube-dlを使用して動画をダウンロードしながら再生。 ゲーム内ではテクスチャとして適用してゲーム内での動画再生を可能に キャッシュ(一時的に使用するためのダウンロード )にしているので問題は無いと思う 対応サイト1000以上 例(一部抜粋):youtube、ニコニコ動画等 13

Slide 14

Slide 14 text

14 サーバー編 やっていること ● プレーヤーの同期 ● ユーザーデータの管理 ● セキュリティ対策 ● バージョンの通知 ● モデルデータの同期

Slide 15

Slide 15 text

開発環境/サーバー サーバー ● Ubuntu 18.04.1 LTS(AWS EC2) 開発環境 ● Visual Studio Code ● 使用言語:C++ ● SSH FSという拡張機能を使って編集 (おすすめ) 使用ライブラリなど ● Boost 1.66 ● Crypto++ ● MySQL Connector/C++ 15

Slide 16

Slide 16 text

サーバーの種類 ゲームサーバー ● プレイヤーの座標などの同期、ゲームに 関する機能を持つサーバー ● ログインやデータベース登録、暗号化の 鍵交換なども全部自作 ● Port 13939で常に通信待機 16 ウェブサーバー ● PHPのサーバー、Laravelで作成 ● 通常の表示の他、モデルファイルのアッ プロードとダウンロードを担当 ● 他にもバージョンを通知したり、アップ デート等があればここに接続

Slide 17

Slide 17 text

ゲームサーバー 使用ライブラリ Boost.Asio ● Linuxで動かすためC++でTCPが直接扱えるBoostを使用 ● 実際のオンラインゲームのサーバーでも使われる ● データベースへの接続は MySQL Connector/C++を使用 17

Slide 18

Slide 18 text

データベース MySQL ● アカウント登録はemailとパスワード、名前等 ● パスワードは流出時を考え、 sha256二重で保存 ● 文字コードはutf8_binなど照合順序をちゃんと考えよう 18 //ユーザー情報テーブル CREATE TABLE user_data( `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,, `email` varchar(256) NOT NULL, `password` varchar(256) NOT NULL, `name` varchar(40) NOT NULL , `create_date` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`user_id`)); //モデル情報テーブル CREATE TABLE model_data( `model_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned, `model_name` varchar(40), `model_file_pash` varchar(256), `model_file_name` varchar(256), `model_type` TINYINT, `upload_date` DATETIME DEFAULT CURRENT_TIMESTAMP, `permit` TINYINT DEFAULT 1, PRIMARY KEY (`model_id`)); //アクセスキー CREATE TABLE access_key( `access_number` int(10) unsigned NOT NULL, `access_key` varchar(10) NOT NULL, … テーブル構成

Slide 19

Slide 19 text

セキュリティ 暗号化 ● サーバーから 4096bit RSA 公開鍵を送信 ● クライアントは 128bit AES CFB 共通鍵を暗号化し送信、以後は AESで暗号化して通信 ● 公開鍵はランダムで作成し送信、署名を発行し、中間者攻撃以外には対応 ● AESのセットアップ完了後通信開始、ログイン処理等 Dos対策 ● 一定時間でデータ量が規定値を超えるとコマンド無視 ● さらに座標値をチェックし、不正な移動の場合は座標初期化 ● ログイン時は3回間違えたら切断 19

Slide 20

Slide 20 text

モデル同期 ● モデルデータはサイトにアップロード、バリ デーション、データベース登録 ● ダウンロード時にモデル IDを指定、アクセ スキーを取得 ● 受け取ったデータ(Zip)は自動解凍して、 フォルダに配置(/Models/【モデルID】) ● 読み込み時は設定ファイル (/Models/.config/【モデルID】.json)の情報 から読み込み処理 *アクセスキーは10桁のランダムな文字列 20 ゲームサー バー クライアント ダウンロード要求 アクセスキー ウェブサー バー アクセスキー (クエリに指定) モデルデータ(Zip) ウェブサー バー ユーザー モデルデータアップロード (Zip) モデルID

Slide 21

Slide 21 text

最後に 21

Slide 22

Slide 22 text

作ってみた感想 ● 通信系の実装はデバッグなどが大変、暗号系も謎に復号化できないときがあり大変だった ● これからゲームを作りたい人は Unityを使ってください ● DXライブラリではモデルのリソース管理が困難 …(アニメーションとかその場で追加して再生が できない)、物理演算が事前計算で重い、リアルタイムだと破綻する ● コーディングでは積極的にテストを書いて行くのが良いと思う(あまり書けていない) 22

Slide 23

Slide 23 text

C++関係オススメの本 C++テンプレートテクニック 23 珠玉のプログラミング 人生を変える一冊。 テンプレートを使ったことない 人も、ある人も読める。 テンプレートの理解が根本から 変わる。 あとコーディングの参考にもな る。 色々なアルゴリズムが乗ってい る。 ソートやらなにやら プログラムの最適化、高速化 にどうぞ 競プロにも使えそう。

Slide 24

Slide 24 text

終わり 24 twitter : @AQUA_july Email:[email protected]

Slide 25

Slide 25 text

25 MikuMikuSpaceよろしくお願いします! https://mikumikuspace.ddo.jp/