# Unity Sdk

Unity SDKライブラリを使用して、UnityアプリケーションからTreasure Dataにデータを送信できます。この方法では、モバイルアプリのアクティビティを追跡するためにサーバー側に何もインストールする必要はありません。

## GDPRコンプライアンス

欧州一般データ保護規則などの国内およびグローバルなデータプライバシー要件へのコンプライアンスをサポートするために、当社のSDKは、アプリケーションやWebサイトにおける個人データとメタデータの収集と追跡を制御するメソッドを提供しています。企業が個人データに関するデータプライバシーポリシーを定義する場合、コード内でこれらのメソッドを使用してデフォルトのデータ収集動作を実装し、個人がデータ収集とプライバシーを自分で管理するためのコントロールを追加できます。

Treasure Dataのお客様は、個人データを収集する使用を含むSDKの使用が、Treasure Dataサービスへのアクセスと使用を管理する法的契約、特に以下に準拠していることを保証する必要があります：

| **Treasure Data** | **URL** |
|  --- | --- |
| Terms of Service | [https://www.treasuredata.com/terms/](https://www.treasuredata.com/terms/) |
| Privacy Policy | [https://www.treasuredata.com/privacy/](https://www.treasuredata.com/privacy/) |
| Privacy Statement for Customer Data | [https://www.treasuredata.com/td-downloads/Privacy-Statement-for-Customer-Data.pdf](https://www.treasuredata.com/td-downloads/Privacy-Statement-for-Customer-Data.pdf) |


## 前提条件

- Unity開発の基本的な知識
- Treasure Dataの基本的な知識


Unity SDKはGitHubから入手できます。最新のSDKを確実に入手するには、リポジトリを確認してください。

- [https://github.com/treasure-data/td-unity-sdk-package](https://github.com/treasure-data/td-unity-sdk-package)


## ライブラリのインストール

1. 最新バージョンの[Unityパッケージ](https://github.com/treasure-data/td-unity-sdk-package)をダウンロードします。
2. Assets > Import Package > Custom Packageを使用してUnityプロジェクトにインポートします。


### iOSアプリケーション開発の場合

Xcodeで、次の手順を完了する必要があります：

1. Build Phases > Link Binary With Librariesで。
2. libz.tbdを追加します
3. Build Phases > Compile Sourcesで。
4. NativePlugin.mmに-fno-objc-arcコンパイルフラグを追加します


## ライブラリの初期化

次に、アプリでライブラリを次のように初期化します。


```csharp
public class MyTreasureDataPlugin : MonoBehaviour {
#if UNITY_IPHONE || UNITY_ANDROID
  [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
  static void OnRuntimeInitialization() {
    TreasureData.InitializeApiEndpoint("https://in.treasuredata.com");
    TreasureData.InitializeApiKey("YOUR_API_KEY");
    ...
    /*
     * This is optional, but you can encrypt the buffered data on mobile devices.
     * You can prevent people from checking the buffered events on the disk.
     */
    // TreasureData.InitializeEncryptionKey("RANDOM_STRING_TO_ENCRYPT_DATA");
  }

  void OnApplicationPause(bool pauseStatus) {
    // Make an open request whenever app is resumed
    if (!pauseStatus) {
      TreasureData.Instance.UploadEvents(
        delegate() { Debug.LogWarning ("UploadEvents Success!!! "); },
        delegate(string errorCode, string errorMsg) { Debug.LogWarning ("UploadEvents Error!!! errorCode=" + errorCode + ", errorMsg=" + errorMsg); }
      );
    }
  }
#endif
}
```

API KeyはTreasure コンソールから取得できます。SDKには[書き込み専用APIキー](https://docs.treasuredata.com/smart/project-product-documentation/about-access-control)を使用することをお勧めします。ビルドの問題がある場合は、[お知らせください](/ja/int/unity-sdk#__clhTop)。

バッファされたイベントをいつ、どのくらいの頻度でアップロードするかは、アプリケーションの特性によって異なります。アップロードに適したタイミングは次のとおりです：

- 現在の画面が閉じているか、バックグラウンドに移動しているとき
- アプリケーションを閉じるとき


## クラウドへのイベント送信

次に、アプリケーション内の適切なタイミングで`AddEvent()`関数を呼び出します。次の例は、データベース`database_a`内のテーブル`table_b`にイベントが送信される様子を示しています。


```csharp
Dictionary<string, object> ev = new Dictionary<string, object>();
ev["str"] = "strstr";
ev["int"] = 12345;
ev["long"] = 12345678912345678;
ev["float"] = 12.345;
ev["double"] = 12.3459832987654;
ev["bool"] = true;
TreasureData.Instance.AddEvent("database_a", "table_b", ev);
```

IPホワイトリストは、iOSまたはAndroid SDKからのインポートには適用されません。また、多くのiOSまたはAndroidデバイスが無効なタイムスタンプ（1970/01/01など）を持っているケースを多く見てきたので、現在、7日より古く、3日より先のタイムスタンプを持つログを無視しています。

## アプリケーションライフサイクルイベントの追跡

オプションで、Unity SDKがアプリのライフサイクルイベントを自動的にキャプチャできるようにすることができます（デフォルトでは無効）。このオプションを明示的に有効にする必要があります。`DefaultTable`を通じてターゲットテーブルを設定できます：


```csharp
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void OnRuntimeInitialization() {
  // TreasureData client setup...
  TreasureData.DefaultTable = "app_lifecycles";
  TreasureData.Instance.EnableAppLifecycleEvent();
}
```

自動的に追跡される3種類のイベントがあります：

- Application Open
- Install
- Update


これらのイベントは、イベントの特定のタイプに応じて関連メタデータとともにキャプチャされます：

Application Open


```csharp
{
    "td_unity_event": "TD_UNITY_APP_OPEN",
    "td_app_ver": "1.0",
    ...
}
```

Application Install


```csharp
{
    "td_unity_event": "TD_UNITY_APP_INSTALL",
    "td_app_ver": "1.0",
    ...
}
```

Application Update


```csharp
{
    "td_unity_event": "TD_UNITY_APP_UPDATE",
    "td_app_ver": "1.1",
    "td_app_previous_ver": "1.0",
    ...
}
```

## アプリ内購入イベントの追跡

有効にすると、Treasure Data SDKは、自分で`addEvent`をリッスンして呼び出すことなく、IAPイベントを自動的に追跡できます。次の方法でこの追跡機能を有効にします：


```
TreasureData.sharedInstance.enableInAppPurchaseEvent();
```

常にデフォルトで無効になっていますが（他のオプション：アプリライフサイクルイベントやカスタムイベントとは異なり、この選択は永続化されません）、次の方法でこの機能を明示的に無効にできます：


```
TreasureData.sharedInstance.disableInAppPurchaseEvent();
```

ゲームが実行されているネイティブプラットフォームによって、イベントのスキーマが異なる場合があります。Androidでは、IAPイベントのカラムは次のもので構成されます：

- td_android_event
- td_iap_product_id
- td_iap_order_id
- td_iap_product_price
- td_iap_quantity
- td_iap_product_price_amount_micros
- td_iap_product_currency
- td_iap_purchase_time
- td_iap_purchase_token
- td_iap_purchase_state
- td_iap_purchase_developer_payload
- td_iap_product_type
- td_iap_product_title
- td_iap_product_description
- td_iap_package_name
- td_iap_subs_auto_renewing
- td_iap_subs_status
- td_iap_subs_period
- td_iap_free_trial_period
- td_iap_intro_price_period
- td_iap_intro_price_cycless
- td_iap_intro_price_amount_micros


iOSの場合：

- td_ios_event
- td_iap_transaction_identifier
- td_iap_transaction_date
- td_iap_quantity
- td_iap_product_identifier
- td_iap_product_price
- td_iap_product_localized_title
- td_iap_product_localized_description
- td_iap_product_currency_code


これらのカラムの値の詳細については、次を参照してください：

- Treasure Data Android SDK - IAP Tracking
- Treasure Data iOS SDK - IAP Tracking


## オプトアウト

ユーザーのプライバシーを尊重することは、あらゆるビジネスにとって重要です。Treasure Data SDKは、特定のデバイスのすべてのイベント追跡をオプトアウトし、`td_uuid`をリセット（または完全に無効化）することでユーザーを非識別化できます。すべての後続イベントについて、`td_uuid`を別のIDに変更できます：


```csharp
TreasureData.Instance.disableCustomEvent();         // disable your own events, ones that collect through manual calls to addEvent...
TreasureData.Instance.disableAppLifecycleEvent();   // disable the auto-collected app lifecycle events
TreasureData.Instance.disableInAppPurchaseEvent();  // disable the auto-collected in-app purchase events
```

他のオプションフラグとは異なり、enable/disableCustomEventおよびenable/disableAppLifecycleEventは永続的な設定です。つまり、設定はアプリの起動間で保持されます。ユーザーが追跡されたくないことを示した場合は常に、disableCustomEventとdisableAppLifecycleEventの呼び出しを使用することが重要です。すべてのTreasure Dataクライアント設定でオプションを呼び出す必要はありません。


```csharp
TreasureData.Instance.resetUniqId();
TreasureData.Instance.disableAppendUniqId();

// temporary configuration, call Treasure Data for client setup
```

`resetUniqId`は、`DefaultTable`に監査イベントも追加します


```csharp
{
    "td_unity_event": "forget_device_uuid",
    "td_uuid": old_uuid,
    <configured_additional_parameters...>
}
```

## アップロードの再試行と重複排除

モバイルまたはUnity SDKデータ転送中の重複レコードを回避するために、Treasure Dataはレコードごとの重複排除を提供しています。

レコードごとの重複排除は、レコード内で顧客が提供するUUIDフィールド（またはメタデータとして提供される内部的に割り当てられたUUID）に基づいています。

SDKは、これらの機能の組み合わせで1つのスタイルでイベントをインポートします：

- このSDKは、一意のキーを追加することでバッファされたイベントを保持し、イベントがサーバー側にアップロードされ保存されたことを確認するまで再試行します（少なくとも1回）
- サーバー側は、デフォルトで過去1時間以内のすべてのイベントの一意のキーを記憶し、重複インポートを防ぐことができます。


重複排除は、同じデータセット内で同じ識別子を持つレコードが最大で過去1時間以内、または過去4096レコード以内（どちらか先に来る方）に見られた場合に重複レコードを識別するベストエフォート型システムです。