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

MMOの作り方

kenjihanada
February 22, 2019

 MMOの作り方

by july1997

kenjihanada

February 22, 2019
Tweet

More Decks by kenjihanada

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    サーバー
    受け取ったタイミ
    ングで他のプレイ
    ヤーに送信

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. データベース
    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,

    テーブル構成

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide