ヴァリアントレギオンでUnity4からUnity5へバージョンアップした時に発生した問題


エンジニアの山内です。

絶賛サービス中のタイトル ヴァリアントレギオン のアプリ開発ではUnityを利用しており、開発開始時のUnityのバージョンは3.5で、現在は5.0.4と2回のメジャーバージョンアップを行っています。
Unity4 から Unity5 へバージョンアップした時に、こんな問題がありました、という紹介です。

特定の端末で文字が表示されない

特定GPUの端末で文字列が塗りつぶされて長方形になる問題が発生しました。文字の描画には unity-sysfont を使用していたのですが、5.x向けにはサポートされていないためと推測し、テクスチャ生成部分とレンダリング部分を改修して対処しました。

ビルド時間が2倍に

IL2CPPの影響でアプリのビルド時間が2倍になりました。対応として開発時はIL2CPPを切る方法が検討されましたが、その違いで不具合が発見されない方が怖いのでそのままにしています。

バイナリが制限サイズを越えた

IL2CPPの影響でアプリのサイズが大きくなり、ipaの制限である100MBを超えてしまいました。対応としてはチュートリアルで使用するデータをアプリから削って、追加ダウンロードするようにしました。
Androidでも制限を越えてしまいましたが、これはコンテンツ追加の影響だったので組み込みのテクスチャを減色・整頓しました。

Animation解放時にアプリがクラッシュする

ヴァリアントレギオンではUnity3の頃から開発していた名残でレガシーなAnimationを利用しています。Animationがついたモデルを解放するとき、アニメーションクリップをRemoveしなければクラッシュするというバグを踏みました。この問題は解放処理の前に停止処理を必ず行うようにして回避しました(Unityの不具合で現在もfixされていないようです)。
レガシーアニメーション関連の不具合は他にも余波があり、開発ツール側での問題解決ができておらず、一部の作業はUnity4で行うという事態になっています。さらにUnity5.1以上にバージョンアップした際にもAnimationで問題が出るため、現在5.0.4で足踏み中です。
現在これらを解消するべくAnimationからAnimatorに一括変換中です。

ほかにも

  • エネミーがバックステップする時にノーモーションでスッと下がる
  • メインメニュー上のアイコンの並びがガタガタになる
  • ガチャ演出で宝箱を空ける瞬間に宝箱が吹っ飛ぶ

など、見た目に楽しい(楽しくない)問題がありました。


MySQLからBigQueryへのデータロード


はじめまして、エンジニアの古堀です。

Aimingではログの分析ツールとしてGoogleのBigQueryを利用しています。
ゲームプレイのログを集計、分析して機能開発、改善の指針として活用しています。
実際に運用に乗せてみるとログだけでは情報が足りず、ユーザー情報やマスターデータなども必要であると気付きました。そこでMySQLのデータをBigQueryに反映させる試みに取り組んだので紹介したいと思います。

BigQueryの特長と言えば以下の2点ですが、実際に使用してみるとGoogleアカウントでの認証や権限設定なども便利だと感じますね。

  • クエリーの処理速度が速い(数十億件のテーブルでも数十秒で結果が返ってくる)
  • 費用が安い

Embulkの採用

MySQLのデータをBigQueryに反映するツールとして Embulk を利用しています。
以下の理由からEmbulkを採用しましたが、最新技術を使ってみて活用事例を増やしてみたいという個人的欲求もありました。

  • Java実装なのでどの環境でも動作する
  • 設定ファイルを追加するだけで動かせる
  • 社内の他のプロジェクトで動作検証済だった
  • 新しいツールだが今後の機能拡張に期待ができそう

事前準備

1. Embulkのインストール
2. 対象テーブル毎にBigQueryのスキーマ定義を作成する
3. 対象テーブル毎にEmbulkの設定ファイルを作成する

処理時間の都合で全テーブルではなく、20テーブルほどに対象を絞っています。
2、3のステップは対象テーブルが増える毎に作業が発生するのが難点です。
あとは設定ファイル毎(テーブル毎)にEmbulkのプロセスを起動しなければならず、テーブル数が増えてくると面倒になってきます。
そこで設定ファイル作成、Embulkの起動を簡単にするためのツールを作成して設定の手間を軽減しています。

実行

実際に動かしてみるとすんなり処理が完了して感動しました!Embulkは導入から実行までの敷居が低くて良いですね。ただ、オーバーヘッドが大きく、テーブルサイズによらず1テーブルあたり処理時間が1分ほどかかりました。レコード件数が2000万件を超えるとIOトラブルが起きやすいですね。

困ったこと、ハマったこと

以下の問題に直面しましたが1はMySQLのテーブル定義からBigQueryのスキーマを作成するツール、2・3はMySQLからデータをロードするSQLの生成ツールを作成して解決しました。

1.スキーマ変換

MySQLのカラムの型定義とBigQueryの型定義が異なるので互換性のある型を指定する必要があります。

2.Boolean型の変換

tinyint(1) で定義されたカラムの値がEmbulkで truefalse とし扱われてるのでBigQueryの integer 型のカラムにインサートできません。
対応としては signed に型キャストするSQLを書くか、BigQueryのカラムを boolean にする必要があります。

3.タイムゾーン

BigQueryのタイムゾーンはUTC固定なので、JSTなどの他のタイムゾーンのDBのデータは時刻補正が必要です。


hirooka

C# + MySQL + Dapper で軽量 O/R Mapper


エンジニアの廣岡です。

最近は仕事で C# を用いたサーバを書いていますが、C# で O/R Mapper (ORM) を使ったことがなくて「とりあえず動く軽量なものが欲しい」と思って見つけ出した Dapper という Micro-ORM を紹介していきます。

Dapper: https://github.com/StackExchange/dapper-dot-net

ところで Micro-ORM とは、ORM の機能のうちいくつかの機能が無いものを指すようですが、「SQL 文を作るクエリビルダの機能」がないものを指すことが多いようです。

C# + MySQL + Dapper

C# から MySQL に接続するときは、ADO.NET インターフェイスを持った MySQL 公式の Connector/Net を使うのが無難でしょう。
http://dev.mysql.com/downloads/connector/net/
これを使えば基本的な MySQL への接続・SQL 実行などはできるようになるのですが、IDataReader や DataSet といったややローレベルなインターフェイスなのでちょっと使いにくいです。
そこで ORM が登場するわけですが、Entity Framework のようなリッチな ORM の導入がちょっとめんどくさかった(というか勉強不足だった)ので、超軽量な ORM は無いのかな〜と思って探していたら Dapper という Micro-ORM を見つけました。
これがどう軽量なのかというと

  • ライブラリは SqlMapper.cs ファイルだけ(数千行ありますが)
  • 基本的には ADO.NET の IDBConnection に拡張メソッドを追加しているだけ

というもので、基本は ADO.NET として使えばよくて、SQL クエリの結果をクラスや構造体にマッピングしたい時に Dapper による拡張メソッドを呼び出すというものです。
クエリビルダは無くデータマッピングしかしないのですが、今すぐ欲しい物としては十分な機能だったので採用しました。

サンプルコード

Dapper の IDbConnection.Query を使って DB 上の Users テーブルから User クラスの一覧を取得するコード

class User
{
    public int Age { get; set; }
    public string Name { get; set; }
}

using (var connection = new MySQLConnection("設定"))
{
    connection.Open();
    var users = connection.Query<User>("SELECT * FROM Users"); // この行だけ Dapper
    foreach (var user in users)
    {
        Console.WriteLine(user.Name);
    }
}

Dapper の IDbConnection.Execute を使って DB 上の Users テーブルにレコードを挿入するコード
(あまり ORM の恩恵がないケース)

using (var connection = new MySQLConnection("設定"))
{
    connection.Open();
    var numOfAffected = connection.Execute("INSERT INTO Users (Age, Name) VALUES (23, Alice)");
}

Dapper で満足?

Dapper は急ぎで欲しかった機能を提供してくれました。ただその後、クエリビルダがないことによって恥ずかしながらテーブル名をタイポしてしまい、気づきにくいバグを作ってしまいました。
この種のバグを二度と作らないためにも Dapper 用にクエリビルダを導入するか、Linq to Entities のようなフル ORM に乗り換えるか、検討をはじめています。

Dapper は ADO.NET をもう少し便利に使いたいなーというシーンには使いどころもありますが、ゲームのサーバ側の MySQL 用に使うには機能不足感があると思います。

Unity 上で SQLite を扱うときなんかにはこの軽量さが発揮されそうですね。