# Unity 埋点 SDK

{% hint style="success" %}
GitHub Demo： <https://github.com/growingio/GrowingSDK-Unity-GameTrack>

Unity 全版本支持

App适配最低系统版本：iOS 8及以上、Android 4.2-10
{% endhint %}

## 1. 集成

{% tabs %}
{% tab title="Android" %}

1. 将最新的Unity埋点SDK `vds-android-agent-game-track.jar`导入 Unity 项目目录`Assets/Plugins/Android/`
2. 在Android工程中集成 Android 原生埋点SDK，并初始化，参考[Android原生端埋点SDK文档](https://docs.growingio.com/docs/sdk-integration/android-sdk/android-mai-dian-sdk)，如已集成请跳过该步骤

```
public class GameApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        GrowingIO.startWithConfiguration(this, new Configuration()     
            .setProjectId("xxxxx")
            .setURLScheme("growing.xxxxx")
            .setDebugMode(true));
        );
    }
}
```

&#x20;3\. 在`LAUNCHER Activity`的`onNewIntent`方法中调用`public GrowingIO onNewIntent(Activity activity, Intent intent)`API。如果使用的是Unity默认的`UnityPlayerActivity`为`LAUNCHER Activity`，请自定义一个`LAUNCHER Activity`。

4\. 添加`AndroidManifest.xml`文件到 Unity 项目目录`Assets/Plugins/Android/`，并注意修改`AndroidManifest.xml`中`${您的APP包名}`等关键字

&#x20;5\. 更多细节请参看[UnityDemo](https://github.com/growingio/GrowingSDK-Unity-GameTrack/tree/master/UnityDemo)和[Android原生端埋点SDK文档](https://docs.growingio.com/docs/sdk-integration/android-sdk/android-mai-dian-sdk)
{% endtab %}

{% tab title="iOS" %}

1. 将最新的埋点SDK `GrowingCoreKit.framework` 参考[iOS原生端埋点SDK](https://docs.growingio.com/docs/sdk-integration/ios-sdk-1/mai-dian-sdk-ji-cheng)，导入 Unity 项目目录 `Assets/Plugins/iOS/` 中
2. 将 `BuildPostProcessor` 脚本文件导入 Unity 项目目录 `Assets/Editor`中
3. 配置 URLScheme：将在GrowingIO官网申请到的应用的 `URL Scheme` 填入到 `BuildPostProcessor` 中的 `AddInfoPlist(path, "XXXXX");` XXXXX 处并保存
4. 在iOS工程中集成 iOS 原生埋点SDK，并初始化，参考[iOS原生端埋点SDK文档](https://docs.growingio.com/docs/sdk-integration/ios-sdk-1/mai-dian-sdk-ji-cheng)，如已集成请跳过该步骤

```
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
     [Growing startWithAccountId:@"xxxxx"];
     return YES;
}
```

&#x20;5\. Unity 工程中可以通过 `GrowingIOGame.cs`脚本调用指定的埋点方法

&#x20;6\. 更多细节请参考[UnityDemo](https://github.com/growingio/GrowingSDK-Unity-GameTrack/tree/master/UnityDemo)和[iOS原生端埋点SDK文档](https://docs.growingio.com/docs/sdk-integration/ios-sdk-1/mai-dian-sdk-ji-cheng)
{% endtab %}
{% endtabs %}

## 2. 自定义数据上传

### 采集自定义事件

```javascript
public static void Track(string eventId)
public static void Track(string eventId, double number)
public static void Track(string eventId, Dictionary<string, object> variable)
public static void Track(string eventId, double number, Dictionary<string, object> variable)
```

采集自定义事件 `eventId`，该事件的属性信息属于事件级变量。

在添加所需要发送的事件代码之前，需要在打点管理用户界面配置事件以及事件级变量`eventLevelVariable`。

**参数说明：**

<table data-header-hidden><thead><tr><th width="241.7142857142857">参数名称</th><th width="150">参数类型</th><th width="150">必填</th><th>说明</th></tr></thead><tbody><tr><td>参数名称</td><td>参数类型</td><td>必填</td><td>说明</td></tr><tr><td><code>eventId</code></td><td>String</td><td>是</td><td>事件标识符</td></tr><tr><td><code>eventLevelVariable</code></td><td>Dictionary</td><td>否</td><td>事件发生时所伴随的维度信息</td></tr></tbody></table>

**参数限制条件：**

参数违反以下条件将不发送数据，调用后请验证数据是否发送，事件类型`t`为`cstm`。

| 参数名称                 | 限制条件                                                                                                                                                                                                                                         |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `eventId`            | 非空，长度限制小于等于50；                                                                                                                                                                                                                               |
| `eventLevelVariable` | <p>非空，长度限制小于等于100（<code>eventLevelVariable.length()<=100</code>）；</p><p><code>eventLevelVariable</code> 内部不允许嵌套 Dictionary；</p><p><code>eventLevelVariable</code>Dictionary 中的 <code>key</code>长度限制小于等于50，<code>value</code>长度限制小等于1000。</p> |

```javascript
//Track 设置自定义事件
GrowingIOGame.Track("StringTrack");
GrowingIOGame.Track("NumberTrack", 10);
    
//Track 设置自定义事件，传递字典参数
Dictionary<string, object> dictionary = new Dictionary<string, object> {{"key1", "value1"}, {"key2", 111}, {"key3", false}};
GrowingIOGame.Track("DictionaryTrack", dictionary);

Dictionary<string, object> dictionary = new Dictionary<string, object> {{"key1", "value1"}, {"key2", 111.11}};
GrowingIOGame.Track("NumberDictionaryTrack", 66.66, dictionary
```

### 设置转化变量

```javascript
public static void SetEvar(string key, string value)
public static void SetEvar(string key, double number)
public static void SetEvar(Dictionary<string, object> variable)
```

发送一个转化信息用于高级归因分析，在添加代码之前必须在打点管理界面上声明转化变量。

转化变量是一种非常强大的变量类型，主要是为了归因而用，比如访问渠道、站外搜索关键词、站内搜索关键词等等。在 GrowingIO 里面可以定制变量的归因方式和持久性范围。

**参数说明：**

<table data-header-hidden><thead><tr><th width="215">参数名</th><th width="150">类型</th><th width="150">是否必填</th><th>描述</th></tr></thead><tbody><tr><td>参数名</td><td>类型</td><td>是否必填</td><td>描述</td></tr><tr><td>conversionVariables</td><td>Dictionary</td><td>是</td><td>转化级属性</td></tr></tbody></table>

**参数限制条件：**

| 参数名称                | 限制条件                                                                                                                                                                                                           |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| conversionVariables | <p>非空，键值对个数小于等于100；</p><p><code>conversionVariables</code> 内部不允许含有<code>Dictionary</code> 嵌套；</p><p><code>conversionVariables</code>Dictionary中的 <code>key</code>长度限制小于等于50，<code>value</code>长度限制小等于1000。</p> |

```java
 //SetEvar 设置转化变量
 GrowingIOGame.SetEvar("EvarStringKey", "EvarString");
 GrowingIOGame.SetEvar("EvarNumberKey", "100");
    
 //SetEvar 设置转化变量，传递字典参数
 Dictionary<string, object> dictionary = new Dictionary<string, object> {{"EvarKey1", "EvarValue1"}, {"EvarKey2", true}};
 GrowingIOGame.SetEvar(dictionary);
```

### 设置登录用户变量

```javascript
public static void SetPeopleVariable(string key, string value)
public static void SetPeopleVariable(string key, double number)
public static void SetPeopleVariable(Dictionary<string, object> variable)
```

设置用户自身属性相关的属性信息，比如用户姓名、邮件地址、信用等级等。

在添加代码之前必须在打点管理界面上声明用户变量。

**参数说明**

<table data-header-hidden><thead><tr><th>参数名</th><th width="150">类型</th><th width="152">是否必填</th><th>描述</th></tr></thead><tbody><tr><td>参数名</td><td>类型</td><td>是否必填</td><td>描述</td></tr><tr><td>peopleVariables</td><td>Dictionary</td><td>是</td><td>用户属性</td></tr></tbody></table>

**参数限制条件：**

<table data-header-hidden><thead><tr><th width="210">参数名称</th><th>限制条件</th></tr></thead><tbody><tr><td>参数名称</td><td>限制条件</td></tr><tr><td>peopleVariables</td><td><p>非空，长度限制小于等于100（<code>peopleVariables.length()&#x3C;=100</code>）；</p><p><code>peopleVariables</code> 内部不允许含有<code>Dictionary</code>或者；</p><p><code>peopleVariables</code> Dictionary中的 <code>key</code>度限制小于等于50，<code>value</code>长度限制小等于1000。</p></td></tr></tbody></table>

```javascript
//SetPeopleVariable 设置用户变量
GrowingIOGame.SetPeopleVariable("PeopleStringKey", "PeopleString");
GrowingIOGame.SetPeopleVariable("PeopleNumberKey", "PeopleNumber");
    
//SetPeopleVariable 设置用户变量，传递字典参数
Dictionary<string, object> dictionary = new Dictionary<string, object> {{"PeopleKey1", "PeopleValue1"}, {"PeopleKey2", 6.66}};
GrowingIOGame.SetPeopleVariable(dictionary);
```

### 设置登录用户ID

```javascript
public static void SetUserId(string userId)
```

把 GrowingIO 识别的访问用户跟应用自身的注册用户做关联，用以登录用户行为分析。

**参数说明：**

<table data-header-hidden><thead><tr><th>参数名称</th><th width="150">参数类型</th><th width="150">必填</th><th>限制条件</th></tr></thead><tbody><tr><td>参数名称</td><td>参数类型</td><td>必填</td><td>说明</td></tr><tr><td>userId</td><td>String</td><td>是</td><td><p>登录用户Id，长度限制小于等于1000；</p><p>如果值为空则清空了登录用户变量，不建议这么用，</p><p>请使用 clearUserId 清除登录用户变量。</p></td></tr></tbody></table>

```java
GrowingIOGame.SetUserId("张三");
```

注：您的 App 每次用户升级版本时无需重新登录的话，建议在用户每次升级App 版本后初次访问时重新调用上述 setUserId 方法。

### 清除登录用户ID

```javascript
public static void ClearUserId()
```

当访问用户跟注册用户关联后，之后触发的行为会绑定到该注册用户上。如果有需要解除绑定，比如用户退出登录后，可以通过该函数解决绑定。

**示例**

```javascript
GrowingIOGame.ClearUserId();
```

### 设置访问用户变量

当用户未登录时，定义用户属性变量，也可用于A/B测试上传标签。

```java
public static void SetVisitor(Dictionary<string, object> variable)
```

**参数说明：**

<table data-header-hidden><thead><tr><th width="168">参数名称</th><th width="150">参数类型</th><th width="150">必填</th><th>说明</th></tr></thead><tbody><tr><td>参数名称</td><td>参数类型</td><td>必填</td><td>说明</td></tr><tr><td><code>visitorVar</code></td><td>Dictionary</td><td>是</td><td><p>不可使用嵌套的<code>Dictionary</code>对象，即为Dictionary中不可以放入<code>Dictionary</code>；</p><p>key 长度限制小于等于50，value长度限制小等于1000，值不能为空串，也就是""。</p></td></tr></tbody></table>

```java
//SetVisitor 设置访问用户变量，传递字典参数
Dictionary<string, object> dictionary = new Dictionary<string, object> {{"VisitorKey1", "VisitorValue1"}, {"VisitorKey2", false}};
GrowingIOGame.SetVisitor(dictionary);
```

## 3. 创建应用

{% hint style="danger" %}
**添加代码之后，请先Clean项目，然后再进行编译，并在您的 App 安装了 SDK 后重新启动几次 App，保证行为采集数据自动发送给 GrowingIO，以便顺利完成检测。**
{% endhint %}

在GrowingIO平台的应用创建页面继续完成应用创建的数据检测，检测成功后应用创建成功。

## 4. 验证SDK是否正常采集数据 <a href="#id-5-yan-zheng-sdk-shi-fou-zheng-chang-cai-ji-shu-ju" id="id-5-yan-zheng-sdk-shi-fou-zheng-chang-cai-ji-shu-ju"></a>

了解GrowingIO平台数据采集类型请参考[数据模型](/v3/introduction/datamodel.md)。

GrowingIO为您提供多种验证SDK是否正常采集数据的方式：

方式一：[Mobile Debugger​​](/v3/developer-manual/debugging/mobile-debugger.md)

方式二：在SDK中设置了Debug模式后，在IDE编译器控制台查看数据采集日志。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://growingio.gitbook.io/v3/developer-manual/sdkintegrated/otherframe-sdk/unity-mai-dian-sdk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
