# Unity 的印象级别收入集成

> 使用展示级别收入(ILR)解决方案来轨道每个展示量的广告收入数据，与第三方数据分析服务平台集成。

## 先决条件##prerequisites

确保已将 LevelPlay SDK 9.5.0+ 正确集成到应用程序中。请参阅 [Unity 软件包集成](/grow/levelplay/sdk/unity/package-integration.md)。

有关展示级别收入 (ILR) SDK 功能和先决条件的更多信息，请参阅[展示级别收入服务器端 API](/grow/levelplay/platform/api/impression-level-revenue-server-side.md)。

## 实现印象事件##implement-the-impression-event

LevelPlay SDK 会触发回传以通知您显示的广告。`OnAdImpressionDataReady`事件是一个可选事件，您可以在每个广告对象上订阅以接收展示数据。此监听器将为您提供有关所有广告单位的信息，并且您可以使用展示量收入来识别不同的广告服务。

要将 ImpressionData 监听器添加到应用程序中，请确保在初始化 LevelPlay SDK 之前声明监听器，以避免任何信息丢失。

LevelPlay SDK 将在背景线程上触发器一个回调，以通知您的监听器器成功的展示数据回传：

```cs
// This event is triggered on a background thread, not the Unity main thread.
LevelPlay.OnImpressionDataReady += ImpressionDataReadyEvent;
private void ImpressionDataReadyEvent(LevelPlayImpressionData impressionData){}
```

### 设置展示事件##set-up-the-impression-event

订阅每个广告对象的`OnAdImpressionDataReady`。在构建广告对象之后以及加载或展示广告对象之前立即订阅，这样就不会错过展示。每个事件仅为其所属的广告实例提供展示量。

> **Note:**
>
> `OnAdImpressionDataReady` 在后台线程上调用，而不是在 Unity 主线程上调用。

```cs
LevelPlayInterstitialAd interstitialAd = new LevelPlayInterstitialAd("adUnitId");
interstitialAd.OnAdImpressionDataReady += OnInterstitialImpressionDataReady;

void OnInterstitialImpressionDataReady(LevelPlayImpressionData impressionData)
{
    Debug.Log($"Interstitial OnAdImpressionDataReady: {impressionData}");
}

LevelPlayRewardedAd rewardedAd = new LevelPlayRewardedAd("adUnitId");
rewardAd.OnAdImpressionDataReady += OnRewardedImpressionDataReady;

void OnRewardedImpressionDataReady(LevelPlayImpressionData impressionData)
{
    Debug.Log($"Rewarded OnAdImpressionDataReady: {impressionData}");
}

LevelPlayBannerAd bannerAd = new LevelPlayBannerAd("adUnitId");
bannerAd.OnAdImpressionDataReady += OnBannerImpressionDataReady;

void OnBannerImpressionDataReady(LevelPlayImpressionData impressionData)
{
    Debug.Log($"Banner OnAdImpressionDataReady: {impressionData}");
}
```

## 删除印象事件##remove-the-impression-event

要停止接收广告对象的展示数据，请使用 `-=` 取消订阅。

```cs
interstitialAd.OnAdImpressionDataReady -= OnInterstitialImpressionDataReady;
rewardedAd.OnAdImpressionDataReady -= OnRewardedImpressionDataReady;
bannerAd.OnAdImpressionDataReady -= OnBannerImpressionDataReady;
```

## 集成 ILR 数据##integrate-the-ilr-data

订阅展示事件后，您可以将展示数据发送到您自己的专有 BI 工具和 DWH，或者将其与第三方工具集成。

> **Important:**
>
> 返回的数据可能包括 null 值。为避免潜在的崩溃，请确保在分配数据之前添加保护。

您可以单独引用每个字段，也可以使用 allData 方法获取所有信息：

```cs
private void OnInterstitialImpressionDataReady(LevelPlayImpressionData impressionData)
{
   string allData = impressionData.AllData;
   string adNetwork = impressionData.AdNetwork;
   double? revenue = impressionData.Revenue;
}
```

有关可用 ILR 数据的完整列表，包括字段描述和类型，请参阅[展示级收入服务器端 API](/grow/levelplay/platform/api/impression-level-revenue-server-side.md)。

以下示例详细介绍了如何将展示级别收入 SDK API 数据与 Google Firebase 数据分析服务集成。您可以按原样使用，或进行任何必要的更改，以便与第三方报告工具或您自己的专有优化工具和数据库集成。

> **Important:**
>
> 确保内部参数不为 null。

```cs
private void OnInterstitialImpressionDataReady(LevelPlayImpressionData impressionData) {
    Debug.Log("unity-script:ImpressionDataReadyEvent impressionData = " + impressionData);
    if (impressionData != null) {
        Firebase.Analytics.Parameter[] AdParameters = {
            new Firebase.Analytics.Parameter("ad_platform", "LevelPlay"),
            new Firebase.Analytics.Parameter("ad_source", impressionData.AdNetwork),
            new Firebase.Analytics.Parameter("ad_format", impressionData.AdFormat),
            new Firebase.Analytics.Parameter("ad_unit_name", impressionData.InstanceName),
            new Firebase.Analytics.Parameter("currency", "USD"),
            new Firebase.Analytics.Parameter("value", impressionData.Revenue ??0) // 为 null 值添加保护
        };
        Firebase.Analytics.FirebaseAnalytics.LogEvent("custom_ad_impression", AdParameters);
    }
}
```
