Mirrativ Tech Blog

株式会社ミラティブの開発者(バックエンド,iOS,Android,Unity,機械学習,インフラ, etc.)によるブログです

新しいUnity AnalyticsとUnity Cloud Diagnosticsの紹介と使い方

こんにちは。ミラティブUnityエンジニアの菅谷です。今回はUnityのサービスであるUnity AnalyticsとUnity Cloud Diagnosticsについて紹介します。2つのサービスはゲーム開発者がゲームのパフォーマンスを追跡し、ユーザーエクスペリエンスを改善するための強力なツールです。ミラティブではUnity Cloud Diagnosticsはこれまでも使っていましたが、最近のプロダクトではUnity Analyticsも活用し始めています。

Unity Analytics

Unity Analyticsは、ゲーム内のイベントやKPI(Key Performance Indicator)を取得するツールです。日々のイベントやKPIを可視化し、ゲームのパフォーマンスを詳細に追跡することが可能になります。さらに、使い方によってはエラー数の検知やエラー発生時のトレースなどにも使えます。以前までもUnity Analyticsは存在していましたが、Unityゲームサービスプラットフォームという新しいサービスの一つの機能として提供されるようになりました。また、それに伴いシステムやUIなども大きく変わっており、以前までの仕組みはLegacy Analyticsとなっています。今回は新しいほうのUnity Analyticsの使い方の紹介です。

docs.unity.com

セットアップやデータの確認はプロジェクトダッシュボードのAnalyticsの項目から確認できます。

Unity Analyticsの主要な機能

Unity Analyticsには複数の機能が存在しますが、ミラティブでは主にEvent Manager、Event Browser、Data Explorerの3つの機能を使用しています。

Event Manager:取得したいイベントを定義します。イベント名や取得するパラメータを設定し、プロダクト内のコードからイベントを送信します。

Event Browser:送信されたイベントを時系列順のログとして確認します。

Data Explorer:KPIとして日々のイベント数を確認します。

データ取得の流れとしては、Event Managerで定義したイベントをプロダクトから送り、Event Browserでイベント詳細を確認し、Data Explorerでは日々のKPIとしてイベントを分析する、となります。

Unity Analytics上でのEvent Browser(上)とData Explorer(下)の使用イメージ。

Unity Analyticsのセットアップ

実際にUnity Analyticsをセットアップして使用する手順です。 具体的な手順はセットアップガイドに記載しているため概要のみ記載します。

Unityプロジェクトのセットアップ

Unityでの操作です。イベントを送れるようにします。

1. プロジェクトをUnity Servicesと紐付ける Unity Services のためのプロジェクトの設定

2. PackageManager経由でAnalyticsをインストールする

3. プロジェクトに存在する共通のシーンやプレハブに以下のスクリプトを持つオブジェクトを作成する。

private async void Start()
{
    try
    {
        await UnityServices.InitializeAsync();
        // Data privacy and consent の設定。地域によってはデータを取得するために同意が必要となる
        // 詳細:https://docs.unity.com/analytics/en/manual/ManagingDataPrivacy
        List<string> consentIdentifiers = await AnalyticsService.Instance.CheckForRequiredConsents();
    } catch (ConsentCheckException e)
    {
        // Something went wrong when checking the GeoIP, check the e.Reason and handle appropriately.
    }
}

4. AnalyticsService.Instance.CustomDataでイベントを送信する。

public static void SendEvent()
{
    // Dictionaryでパラメータセットを用意
    var parameters = new Dictionary<string, object>();
    parameters["TestParameterString"] = "テストイベントメッセージ";
    // イベント名を指定してパラメータセットを送る
    AnalyticsService.Instance.CustomData("testEvent", parameters);
}

Event Managerでイベント定義

送りたいイベントは事前にEvent Managerで定義しておく必要があります。

Event ManagerのAdd NewからCustom Eventを選択し作成します。イベント名やパラメータはコードで指定した名前と一致させる必要があります。パラメータが未定義の場合はAdd New Parameterから定義してイベントにアサインします。

1. Event Managerから取得したいイベントを作る。

2. イベント名や説明、イベントパラメータを設定する。

3. 必要なパラメータは作成してイベントに紐付ける。既存のパラメータも利用できる。デフォルトでもclientVersionやplatformといった共通情報となるパラメータは自動で付与される。

Event Browserでの確認

プロジェクトからイベントが送られるとEvent Browserに表示されます。 コード内でUnityServices.ExternalUserIdを指定しておくとUserIdが取得でき、フィルタリング時に活用できます。 最新48時間以内の100件のログは詳細も見られ、<>を押すことでイベントごとに仕込んだ個別のパラメータや詳細が確認できます。

送られたイベントが一覧表示されます。

イベントに指定しておいたTestParameterStringがパラメータとして取得できています。

Data Explorerでの確認

Data Explorerでイベントを指定することでグラフ化して見られます。 フィルタリングや複数の項目の同時確認も可能です。

Event Browserで確認したイベントの合計値をData ExplorerでKPIとして確認できます。

Unity Analyticsを使用する上での注意点

テストしたプロジェクトではイベント送信から受信まで約20分のラグがありました。すぐにダッシュボードに送信結果が反映されるわけではないため、今すぐキャッチしたいエラーなどのイベントを確認したい場合は後述のUnity Cloud Diagnosticsの使用をおすすめします。Unity Analyticsはイベントごとにパラメータをカスタマイズできたり、複数のイベントを比較したりが得意です。

イベントは即送られるわけではなく、60秒ごとにまとめて送信を行っています。そのためクライアントの起動状況によっては正確に送られない場合があります。AnalyticsService.Instance.Flush() を呼び出すと即時でイベントを送るため、重要なイベントでは使用をおすすめします。 今のところUnity Analyticsの導入による負荷の増加は問題になるぐらいではありませんでした。

Data Explorerでの表示される時間はUTCなので日本時間とズレがあります。日本時間への設定の変更を知っている方がいれば教えてください!

Unity Cloud Diagnostics

Unity Cloud Diagnosticsは、Unity内で発生したExceptionやCrashを追跡するツールです。このツールを使用すると、エラーの発生時刻や発生バージョンなどの情報が付与され、エラーの原因を特定しやすくなります。Unity Analyticsと異なりプロジェクトダッシュボードのLiveOpsの項目から確認できます。

Unity Cloud Diagnosticsの主要な機能

Unity Cloud Diagnosticsは、基本的には入れるだけで自動で標準のエラーを追跡できます。さらに、Debug.LogExceptionを明示的に行うことでもエラーを取得できます。ただし、Exceptionのメッセージが同一なら1つのエラーとしてまとめられるので、Exceptionのメッセージ内に変化するパラメータを入れてしまうとログ自体が別々のもの扱いになってしまうため、共通のパラメータはCrashReportHandler.SetUserMetadataで設定します。ユーザーIDなどはSetUserMetadataでの設定をおすすめします。

Unity Cloud Diagnosticsはログが比較的すぐに送られるので、デバッグ時にも便利です。ユーザーID等のユニーク情報を仕込んでおけば誰がいつ発生させたエラーかが特定でき、追跡が容易になります。さらに、ログの直前に吐かれたDebug.Logなどのログ情報やException発生時のスタックトレースも確認できます。

エラーログの一覧表示で件数や発生頻度が確認できます。

Metadataの設定によりUserIdなどの共通パラメータを設定できます。

一部プラットフォームを除きスタックトレースも表示されるので直接エラー箇所が確認でき、原因の素早い特定に繋がっています。

また、SlackやDiscordといったツールとの通知連携にも対応しています。新規に発生したエラーがすぐに通知されるため、エラーの早期発見・対応に役立ちます。

Unity Cloud Diagnosticsにはエラー取得以外にもUser Reportingといった、ユーザーが手動でバグを報告するためのツールもあります。開発中のテストで特に効果が見込めます。

Unity Cloud Diagnosticsの導入方法やUser Reportingの詳細については以下が参考になりました。

note.com

Unity Cloud Diagnosticsを使用する上での注意点

PlayerSettings内の「Capture exceptions that occur when running in Play mode」をオンにするとUnityエディタ使用中に発生したExceptionも検知できます。ただし、開発中はエラーが出やすくノイズになるのでオフにしておいたほうが無難です。

ミラティブではアプリのリリース後など定期的に新規エラーを確認するようにしています。これにより実際に起っているエラーやデグレで発生したエラーなどを検知しています。

We are hiring!

サービスの継続的な改善にはエラーやクラッシュの調査は欠かせません。Unity AnalyticsやUnity Cloud DiagnosticsはUnityエンジニアだけで簡単に導入でき、Personalプランでも無料で利用できます(一部制限あり)。開発中・リリース後の両方で使用できるツールなので活用していきたいですね。

ミラティブではユーザーへの向き合いに集中できる環境を共に作っていくエンジニアを募集しています!!

www.mirrativ.co.jp

speakerdeck.com

mirrativ.notion.site