ゲーム会社でのruby : rails活用事例
TRANSCRIPT
ゲーム会社でのRuby / Rails活用事例
About me
植森康友
twitter: @wakaba260yen
github: yuemori
所属:株式会社AimingWebエンジニア
RailsでのAPIサーバやWebアプリケーション開発
インフラサイドも少し
今日のテーマ: 「ゲーム会社でのRuby / Rails活用事例」
「ゲーム会社でRuby / Railsって何に使ってるの?」についてお話します
Aimingについて
ソーシャルゲーム・オンラインゲーム開発
企画、開発から運営・プロデュースまで
主なエンジニアリング領域
ゲームクライアント開発
ゲームサーバ開発
リアルタイムサーバ
WebAPIサーバ
バッチサーバ
開発環境
基盤開発
インフラ
運用
主なエンジニアリング領域
ゲームクライアント開発
ゲームサーバ開発
リアルタイムサーバ
WebAPIサーバ
バッチサーバ
開発環境
基盤開発
インフラ
運用
ゲーム開発
RailsによりゲームのAPIサーバを開発
バックグラウンドサーバにも活用
ゲーム開発
WebAPI
RailsによるゲームのWebAPIの開発
ゲームクライアント、リアルタイムサーバとやり取りする
データフォーマットはMessagePackを採用
内製のIDLを利用して異なる言語間でのプロトコルを定義Unity(C#),リアルタイムサーバ(C++)などとのやり取りに利用
IDL = Interface Description Language
詳しくは後述
ゲーム開発
バッチサーバ
ResqueやSidekiqといったgemによるバッチ処理用サーバ
利用シーンはプロジェクトにより様々
キャラクターへのギフト配布
データベースのお掃除
Push通知の送信
開発環境
開発環境の効率化にRubyを活用
シェルスクリプトよりも複雑な作業を自動化する
開発環境
IDL
IDL = インターフェース記述言語
RubyのDSLを使って異なる言語間でのメッセージを定義する
専用のパーサを使って定義を読み込んだ後、ERBを使ったテンプレートで各言語のコードを生成する
IDL
Contract(インターフェース定義)例
rpc(:create_sample) { url '/sample/create' method 'POST'
request { param 'id', :int, 'ID' param 'name', :string, '素敵な名前' }
response { param 'sample', :sample, '作成したさんぷる' }}
IDL
コードテンプレート例
<%‐ document.each_rpc do |rpc| ‐%>module <%= rpc.name.camelize %> class Request < Type::Base <%‐ rpc.response.params.each do |param|‐%> attribute <%= param.name %>, <%= param.type %> <%‐ end ‐%> end
class Response < Type::Base <%‐ rpc.response.params.each do |param|‐%> attribute <%= param.name %>, <%= param.type %> <%‐ end ‐%> endend<%‐ end ‐%>
生成されるコード例
module Sample::Create class Request < Type::Base attribute :id, Integer attribute :name, String end class Response < Type::Base attribute :sample, Type::Sample endend
IDL
レスポンスの例
sample = Type::Sample.new(id: 1, name: 'foo')response = Sample::Create::Response.new(sample: sample)
respond_to do |format| format.msgpack(body: response.to_msgpack)end
生成された型を使ってMessagePackでシリアライズ・デシリアラ
イズをする
Contractからコードを自動生成するメリット
各言語のテンプレートを用意することで、異なる言語間での型
の違いなどを吸収しやすい
開発効率の上昇
インターフェースのドキュメント化
開発環境
rakeタスク
マスターデータのインポート
大量のデータを扱うゲーム開発ではExcelなどで設定を行うことが多い
データベースにExcelからデータをインポートするなど
コードジェネレータの実行など
定形作業を自動化する
クライアント、リアルタイムサーバ、WebAPIサーバと異なる
開発環境で複数の定形作業が発生することが多々ある
Jenkinsなどでのバッチ処理CIや簡単なスクリプトなどをRubyスクリプトで記述して実行
共通基盤開発
各プロジェクトでの車輪の再発明を防ぐための基盤開発
ゲーム開発・運用に必須の機能をシステムとして提供する
共通基盤開発
認証・課金基盤システム
複数のプロジェクトをまたいで利用できる認証、課金用の基盤シス
テム
RailsでWebAPI+管理用ツールを実装
簡易的なOauth Providerとして振る舞う
SNS連携や端末の引き継ぎなどもサポートされている
共通基盤開発
会計ツール
毎月の売上を自動で計上する基盤システム
ゲーム内の仮想通貨を売上に換算する
プロジェクトによって仮想通貨の単価が異なる
各プロジェクトでの収入を単価に応じてレポートにする
日本国外の通貨にも対応
海外展開が増えてきたため、正確な収入を出す必要があった
共通基盤開発
KPI分析ツール
KPI分析に必要な指標を日時で表示するためのツール
AU
ARPPU
課金率
継続率
FQ5など
SQLクエリを登録するとグラフにして出力するのが主な機能OSSのRe:Dashと似た機能を持つ
CSV出力などにも対応している
インフラ
主にデプロイ、バッチ処理などにRubyを利用
ミドルウェアのPluginなども必要に応じて内製ツールを作成
インフラ
Deploy / Provisioning
WebAPIでは定番のCapistranoを主に利用している
WebAPIだけならメンテナンスを挟まずにアップデートやバグ修正
が可能
gitが利用しづらいシーンではcapistrano‑scm‑copyも使っている海外展開などで諸事情によりソースコード履歴をサーバに置き
たくないとき
特定のディレクトリだけをコピーしてデプロイしたいとき
ProvisioningにChefを使っているところもあるメインはansible
インフラ
バッチ処理
Aimingではログデータ保存先にgoogleのbigqueryを利用している
各種ゲームサーバの出力したログをバッチ処理でアップロード
ログがアップロードされているかのチェックなども
シェルスクリプトよりもRubyの方が柔軟で、リトライ処理な
ども記述しやすい
インフラ
ミドルウェアPlugin
fluentdやembulkなど、RubyでPluginが書けるものでは内製Pluginを作成することも
fluentd: 特殊なログのデータ加工
embulk:マスターデータのインポート時のデータ加工
運用
お問い合わせ対応
インゲーム告知
お詫びのアイテム配布
など、多くの作業を非エンジニアさんが作業する必要がある
運用
管理ツール
プロジェクトで運用業務をするために必要な機能を持つWebアプリケーション
主な機能
キャラクターや所持アイテム、課金履歴などのゲーム内検索
アイテム操作履歴やクエスト受託履歴などのログ検索
対象キャラクターへのギフト配布
DBからのデータ検索だけでなく、bigqueryからのデータ取得・閲
覧にも対応
プランナー向け機能として、デバッグ環境でのデータ変更なども
まとめ
様々な技術領域が求められるゲーム開発では、Rubyにはたくさんの利用シーンがある
なぜRubyを使うのか?
すばやく価値を届けられる
スピード感の求められるゲーム開発では重要
柔軟に書けて活用できる領域が広い
Rubyエンジニアの文化も社内に良い影響を与えていると感じる名前重要
テストコード
ツール、自動化
Happy Hacking!