Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MMOの作り方

F9c4e8b768c5857ee6b7003e283765a0?s=47 kenjihanada
February 22, 2019

 MMOの作り方

by july1997

F9c4e8b768c5857ee6b7003e283765a0?s=128

kenjihanada

February 22, 2019
Tweet

Transcript

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

  2. 自己紹介 HN: july1997 • 東北学院大学教養学部情報科学3年 本間 心 • 現在(wdm合同会社・仙台)ー プログラマー • たまにクラウドソーシングでプログラミング

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

  4. 4

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

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

    動画の取得、再生
  7. 開発環境 Visual Studio 2017 使用言語:C++ 使用ライブラリなど • Bullet 2.87 •

    Crypto++ 5.6.5 • DXライブラリ Ver 3.20a • EffekseerRuntime 1.40 対象プラットフォーム WIndows、Android 7
  8. ライブラリの紹介 描画処理 DXライブラリ • DirectXのラッパー(最近はAndroidにも 対応) • MMDモデル等に対応 • 更新頻度が高く初心者にオススメ

    URL : http://dxlib.o.oo7.jp/index.html 物理演算 Bullet Physics • オープンソースの物理演算エンジン • ゲーム内では常に物理演算 • 色々な市販のゲームなどに使われたりし てる URL : http://bulletphysics.org/wordpress/ 8
  9. ネットワーク関係の実装 • 描画の処理と別スレッドでメッセージを送受信 (TCP) • std::shared_ptrを用いてスレッドセーフに • 通信機能自体はDXライブラリにある機能を利用 9 Server

    Player1 Player2 Player3 TCP
  10. ID 1byte mess 3~6 byte データ (UTF-8) nbyte 10 プロトコル

    • 通信の種別(ID)と通信内容(mess)をつけて 送信、スペース区切り • サーバーはプレイヤーの IDを付けたりして他 のプレーヤーに送信 Server Player1 Player2 3 RES 1 こんにちは! Player1 : こんにちは! 3 RES こんにちは! プロトコル TCP
  11. 送信データ • 移動時は30フレームごとに進行方向 のベクトルと回転の速度を送信、それ をもとに補完処理 • 加えて300フレームごとに座標と回転 値(x,y,z,w)を送信 • アニメーションは切り替わったタイミン

    グで適時送信 11 方向データ キャラの方向ベクトル、 ±回転速度 座標データ キャラの絶対座標と キャラの姿勢 アニメーション 情報 再生するアニメーショ ン サーバー 受け取ったタイミ ングで他のプレイ ヤーに送信
  12. プレーヤーの同期 • 一定期間でサーバー側がプレーヤーとの距離などで、そのプレーヤーがどのプレイヤーと同 期するのか決定 • サーバーから同期するプレーヤーのリストを受け取り、リストから消えたユーザーは削除処 理、加わったプレーヤーは追加処理を行う • モデルIDを送信して、クライアントが所持してなければダウンロードさせる 12

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

    13
  14. 14 サーバー編 やっていること • プレーヤーの同期 • ユーザーデータの管理 • セキュリティ対策 •

    バージョンの通知 • モデルデータの同期
  15. 開発環境/サーバー サーバー • Ubuntu 18.04.1 LTS(AWS EC2) 開発環境 • Visual

    Studio Code • 使用言語:C++ • SSH FSという拡張機能を使って編集 (おすすめ) 使用ライブラリなど • Boost 1.66 • Crypto++ • MySQL Connector/C++ 15
  16. サーバーの種類 ゲームサーバー • プレイヤーの座標などの同期、ゲームに 関する機能を持つサーバー • ログインやデータベース登録、暗号化の 鍵交換なども全部自作 • Port

    13939で常に通信待機 16 ウェブサーバー • PHPのサーバー、Laravelで作成 • 通常の表示の他、モデルファイルのアッ プロードとダウンロードを担当 • 他にもバージョンを通知したり、アップ デート等があればここに接続
  17. ゲームサーバー 使用ライブラリ Boost.Asio • Linuxで動かすためC++でTCPが直接扱えるBoostを使用 • 実際のオンラインゲームのサーバーでも使われる • データベースへの接続は MySQL

    Connector/C++を使用 17
  18. データベース 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, … テーブル構成
  19. セキュリティ 暗号化 • サーバーから 4096bit RSA 公開鍵を送信 • クライアントは 128bit

    AES CFB 共通鍵を暗号化し送信、以後は AESで暗号化して通信 • 公開鍵はランダムで作成し送信、署名を発行し、中間者攻撃以外には対応 • AESのセットアップ完了後通信開始、ログイン処理等 Dos対策 • 一定時間でデータ量が規定値を超えるとコマンド無視 • さらに座標値をチェックし、不正な移動の場合は座標初期化 • ログイン時は3回間違えたら切断 19
  20. モデル同期 • モデルデータはサイトにアップロード、バリ デーション、データベース登録 • ダウンロード時にモデル IDを指定、アクセ スキーを取得 • 受け取ったデータ(Zip)は自動解凍して、

    フォルダに配置(/Models/【モデルID】) • 読み込み時は設定ファイル (/Models/.config/【モデルID】.json)の情報 から読み込み処理 *アクセスキーは10桁のランダムな文字列 20 ゲームサー バー クライアント ダウンロード要求 アクセスキー ウェブサー バー アクセスキー (クエリに指定) モデルデータ(Zip) ウェブサー バー ユーザー モデルデータアップロード (Zip) モデルID
  21. 最後に 21

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

    • コーディングでは積極的にテストを書いて行くのが良いと思う(あまり書けていない) 22
  23. C++関係オススメの本 C++テンプレートテクニック 23 珠玉のプログラミング 人生を変える一冊。 テンプレートを使ったことない 人も、ある人も読める。 テンプレートの理解が根本から 変わる。 あとコーディングの参考にもな

    る。 色々なアルゴリズムが乗ってい る。 ソートやらなにやら プログラムの最適化、高速化 にどうぞ 競プロにも使えそう。
  24. 終わり 24 twitter : @AQUA_july Email:july1997@outlook.jp

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