官网链接:http://www.talkingdata.com/

进入官方给出的demo网页统计

API使用文档:http://doc.talkingdata.com/posts/65#%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90-%E9%9B%86%E6%88%90%E6%A3%80%E6%9F%A5%E5%88%97%E8%A1%A8

下面是配置流程

第一步:常规注册登录

创建游戏产品

填写游戏名称类型等

下载对应平台的SDK。点击对应图标即可进入

配置需要下载的定制SDK文件

点击完成下一步

然后会出现这个界面


一会就会收到talkingdata发来的sdk压缩包,下载解压


主要得到两个文件 android的jar和ios的.a文件


分别把这两个文件放到unity的文件夹中:

  • Android 平台 将最新的 .jar 文件复制到 Assets/Plugins/Android 目录下
  • iOS 平台 将最新的 .a 文件复制到 Assets/Plugins/iOS 目录下

    进入官方给出的github上面的网址:https://github.com/TalkingData/GameAnalytics_SDK_Unity

把下载的文件放到unity响应的目录中

把网站上对应的AppID替换掉

挂上脚本运行

打包运行,只有真机上才好使

显示触发的各种事件

注意IOS需要添加依赖框架

添加权限,方便其他同事查阅

更新数据时间

OVER,大功告成!!!

在官方示例的基础带上添加了对应的注释和用法,在官网都可以找到

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Threading;public class CustomDemoScript : MonoBehaviour
{int index = 1;int level = 1;string gameserver = "";TDGAAccount account;const int left = 90;const int height = 50;const int top = 60;int width = Screen.width - left * 2;const int step = 60;#regionvoid OnGUI(){int i = 0;GUI.Box(new Rect(10, 10, Screen.width - 20, Screen.height - 20), "Demo Menu");if (GUI.Button(new Rect(left, top + step * i++, width, height), "创建用户唯一标识")){account = TDGAAccount.SetAccount(TalkingDataGA.GetDeviceId());index++;}if (GUI.Button(new Rect(left, top + step * i++, width, height), "用户等级提升1级")){if (account != null){account.SetLevel(level++);}}if (GUI.Button(new Rect(left, top + step * i++, width, height), "传入玩家登入的区服")){if (account != null){gameserver = "国服01";account.SetGameServer(gameserver);}}if (GUI.Button(new Rect(left, top + step * i++, width, height), "Charge Request 10")){TDGAVirtualCurrency.OnChargeRequest("order01", "iap", 10, "CH", 10, "PT");}if (GUI.Button(new Rect(left, top + step * i++, width, height), "Charge Success 10")){TDGAVirtualCurrency.OnChargeSuccess("order01");}if (GUI.Button(new Rect(left, top + step * i++, width, height), "Reward 100")){TDGAVirtualCurrency.OnReward(100, "reason");}if (GUI.Button(new Rect(left, top + step * i++, width, height), "任务开始")){TDGAMission.OnBegin("任务001");}if (GUI.Button(new Rect(left, top + step * i++, width, height), " 任务完成")){TDGAMission.OnCompleted("任务001");}if (GUI.Button(new Rect(left, top + step * i++, width, height), "Item Purchase 10")){TDGAItem.OnPurchase("itemid001", 10, 10);}if (GUI.Button(new Rect(left, top + step * i++, width, height), "Item Use 1")){TDGAItem.OnUse("itemid001", 1);}if (GUI.Button(new Rect(left, top + step * i++, width, height), "自定义事件")){Dictionary<string, object> dic = new Dictionary<string, object>();dic.Add("StartApp" + "StartAppTime", "startAppMac" + "#" + "02/01/2013 09:52:24");dic.Add("IntValue", 1);TalkingDataGA.OnEvent("自定义事件Str01", dic);}}#endregionvoid Start(){Debug.Log("start...!!!!!!!!!!");
#if UNITY_IPHONE
#if UNITY_5UnityEngine.iOS.NotificationServices.RegisterForNotifications(UnityEngine.iOS.NotificationType.Alert |UnityEngine.iOS.NotificationType.Badge |UnityEngine.iOS.NotificationType.Sound);
#elseNotificationServices.RegisterForRemoteNotificationTypes(RemoteNotificationType.Alert |RemoteNotificationType.Badge |RemoteNotificationType.Sound);
#endif
#endifTalkingDataGA.OnStart("C2E1B36A7A12412A88E13BED666D22D8", "想什么渠道就什么渠道渠道,应用宝,豌豆荚随便");account = TDGAAccount.SetAccount("User01");//必须设置}void Update(){if (Input.GetKey(KeyCode.Escape)){Application.Quit();}
#if UNITY_IPHONETalkingDataGA.SetDeviceToken();TalkingDataGA.HandleTDGAPushMessage();
#endif}void OnDestroy(){TalkingDataGA.OnEnd();Debug.Log("onDestroy");}void Awake(){Debug.Log("Awake");}void OnEnable(){Debug.Log("OnEnable");}void OnDisable(){Debug.Log("OnDisable");}
}
// SDK Version: 3.2.14using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System;
using System.Threading;public class TalkingDataGA {
#if UNITY_IPHONE[DllImport ("__Internal")]private static extern void tdgaOnStart(string appId, string channelId);[DllImport ("__Internal")]private static extern void tdgaOnEvent(string eventId, string []keys, string []stringValues, double []numberValues, int count);[DllImport ("__Internal")]private static extern string tdgaGetDeviceId();[DllImport ("__Internal")]private static extern void tdgaSetSDKFramework(int tag);[DllImport ("__Internal")]private static extern void tdgaSetVerboseLogDisabled();[DllImport ("__Internal")]private static extern void tdgaSetDeviceToken(string deviceToken);[DllImport ("__Internal")]private static extern void tdgaHandlePushMessage(string message);private static bool hasTokenBeenObtained = false;
#elif UNITY_ANDROID//init static class --save memory/spaceprivate static AndroidJavaClass agent;private static AndroidJavaClass unityClass;private static string JAVA_CLASS = "com.tendcloud.tenddata.TalkingDataGA";private static string UNTIFY_CLASS = "com.unity3d.player.UnityPlayer";public static void AttachCurrentThread() {AndroidJNI.AttachCurrentThread();}public static void DetachCurrentThread() {AndroidJNI.DetachCurrentThread();}
#endifprivate static string deviceId = null;public static string GetDeviceId() {//if the platform is real deviceif (deviceId == null && Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONEdeviceId = tdgaGetDeviceId();
#elif UNITY_ANDROIDif (agent == null) {agent = new AndroidJavaClass(JAVA_CLASS);}AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");deviceId = agent.CallStatic<string>("getDeviceId", activity);
#elif UNITY_WP8deviceId = TalkingDataGAWP.TalkingDataGA.getDeviceID();
#endif}return deviceId;}public static void OnStart(string appID, string channelId) {//if the platform is real deviceif (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONE
//          tdgaSetSDKFramework(2);tdgaOnStart(appID, channelId);
#elif UNITY_ANDROIDAndroidJavaClass dz = new AndroidJavaClass("com.tendcloud.tenddata.game.dz");dz.SetStatic<int>("a", 2);if (agent == null) {agent = new AndroidJavaClass(JAVA_CLASS);}// agent.SetStatic<int>("sPlatformType", 2);unityClass = new AndroidJavaClass(UNTIFY_CLASS);AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");agent.CallStatic("init", activity, appID, channelId);agent.CallStatic("onResume", activity);
#elif UNITY_WP8TalkingDataGAWP.TalkingDataGA.init(appID, channelId);
#endif}}public static void OnEnd() {if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_ANDROIDif (agent != null) {AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");agent.CallStatic("onPause", activity);agent = null;unityClass = null;}
#endif}}public static void OnKill() {if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_ANDROIDif (agent != null) {AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");agent.CallStatic("onKill", activity);agent = null;unityClass = null;}
#endif}}/// <summary>/// 自定义事件/// 开发者可以自行定义eventId,在游戏中需要追踪的位置进行调用,注意eventId中仅限使用中英文字符、数字和下划线,不要加空格或其他的转义字符/// 除了可以统计某自定义eventId的触发次数,还可以通过key-value参数来对当时触发事件时的属性进行描述。如定义 eventId 为玩家死亡事件,可通过 key-value 添加死亡时关卡、死亡时等级、死亡时携带金币等属性。/// 每款游戏可定义最多10000个不同eventId,每个eventId下,可以支持100种 不同 key 的 1000种不同 value 取值(NSString 类型),但是每次事件发生时最多只能同时附带 50 种不同 key/// </summary>/// <param name="actionId">自定义事件名称,最多支持 32 个字符</param>/// <param name="parameters">key 类型必须是string,一次事件最多只支持 50 个参数。如果 value 为 string,/// Game Analytics 会统计每种 value 出现的次数;如果为 number 类型,那么 Game Analytics 会统计 value 的总和。</param>public static void OnEvent(string actionId, Dictionary<string, object> parameters) {if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONEif (parameters != null && parameters.Count > 0) {int count = parameters.Count;string []keys = new string[count];string []stringValues = new string[count];double []numberValues = new double[count];int index = 0;foreach (KeyValuePair<string, object> kvp in parameters) {if (kvp.Value is string) {keys[index] = kvp.Key;stringValues[index] = (string)kvp.Value;} else {try {double tmp = System.Convert.ToDouble(kvp.Value);numberValues[index] = tmp;keys[index] = kvp.Key;} catch(System.Exception) {count--;continue;}}index++;}tdgaOnEvent(actionId, keys, stringValues, numberValues, count);} else {tdgaOnEvent(actionId, null, null, null, 0);}
#elif UNITY_ANDROIDif (parameters != null && parameters.Count > 0) {int count = parameters.Count;AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap", count);IntPtr method_Put = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");object[] args = new object[2];foreach (KeyValuePair<string, object> kvp in parameters) {args[0] = new AndroidJavaObject("java.lang.String", kvp.Key);if (typeof(System.String).IsInstanceOfType(kvp.Value)) {args[1] = new AndroidJavaObject("java.lang.String", kvp.Value);} else {args[1] = new AndroidJavaObject("java.lang.Double", ""+kvp.Value);}AndroidJNI.CallObjectMethod(map.GetRawObject(), method_Put, AndroidJNIHelper.CreateJNIArgArray(args));}if (agent != null) {agent.CallStatic("onEvent", actionId, map);}} else {if (agent != null) {agent.CallStatic("onEvent", actionId, null);}}
#elif UNITY_WP8TalkingDataGAWP.TalkingDataGA.onEvent(actionId, parameters);
#endif}}public static void SetVerboseLogDisabled() {if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONEtdgaSetVerboseLogDisabled();
#elif UNITY_ANDROIDif (agent == null) {agent = new AndroidJavaClass(JAVA_CLASS);}agent.CallStatic("setVerboseLogDisabled");
#elif UNITY_WP8
#endif}}#if UNITY_IPHONE
#if UNITY_5public static void SetDeviceToken() {if (!hasTokenBeenObtained) {byte[] byteToken = UnityEngine.iOS.NotificationServices.deviceToken;if(byteToken != null) {string deviceToken = System.BitConverter.ToString(byteToken).Replace("-","");tdgaSetDeviceToken(deviceToken);hasTokenBeenObtained = true;}}}public static void HandlePushMessage() {UnityEngine.iOS.RemoteNotification[] notifications = UnityEngine.iOS.NotificationServices.remoteNotifications;if (notifications != null) {UnityEngine.iOS.NotificationServices.ClearRemoteNotifications();foreach (UnityEngine.iOS.RemoteNotification rn in notifications) {foreach (DictionaryEntry de in rn.userInfo) {if (de.Key.ToString().Equals("sign")) {string sign = de.Value.ToString();tdgaHandlePushMessage(sign);}}}}}
#elsepublic static void SetDeviceToken() {if (!hasTokenBeenObtained) {byte[] byteToken = NotificationServices.deviceToken;if(byteToken != null) {string deviceToken = System.BitConverter.ToString(byteToken).Replace("-","");tdgaSetDeviceToken(deviceToken);hasTokenBeenObtained = true;}}}public static void HandlePushMessage() {RemoteNotification[] notifications = NotificationServices.remoteNotifications;if (notifications != null) {NotificationServices.ClearRemoteNotifications();foreach (RemoteNotification rn in notifications) {foreach (DictionaryEntry de in rn.userInfo) {if (de.Key.ToString().Equals("sign")) {string sign = de.Value.ToString();tdgaHandlePushMessage(sign);}}}}}
#endif
#endif
}

转载自:https://www.jianshu.com/p/0bbb915f8953

TalkingData中Unity3D集成文档: http://doc.talkingdata.com/posts/65

Unity 数据统计SDK TalkingData相关推荐

  1. unity 接入友盟数据统计SDK

    1.下载UnitySDK 友盟SDK官网链接:SDK_开发者中心 - 友盟+ (umeng.com) 如下图. 解压后长这样 然后进入Unity3D文件夹,分别导入两个unitypackge包 ①.导 ...

  2. 移动数据统计平台分析

    数据统计对于各位移动开发的童鞋并不陌生,小到Bug统计,大到数据分析,一款性能稳定.用户体验良好的APP一定离不开数据统计的支持,为此我将给大家科普一下常用的六大数据统计平台. 统计平台列表表,外加体 ...

  3. 移动应用数据统计平台(之一)

    本文由雷锋网整理自 ZDnet,内容有改动,仅供各位热衷于移动应用开发推广运营的朋友参考. 目前市面上比较常见,使用比较多的移动应用统计平台大概有3.4家,国外比较流行的是Flurry,功能上非常全面 ...

  4. 个推数据统计产品(个数)iOS集成实践

    2019独角兽企业重金招聘Python工程师标准>>> 最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新 ...

  5. 移动端数据统计,精细化运营的永动机

    2019独角兽企业重金招聘Python工程师标准>>> 前言 随着移动互联网市场快速发展,以往"跑马圈地"式的粗犷运营时代已成为过去时.大环境的改变,也导致移动端 ...

  6. axure9数据统计插件_WMDA:大数据技术栈的综合实践

    一.概述 WMDA是58自主开发的用户行为分析产品,同时也是一款支持无埋点的数据采集产品,只需要在第一次使用的时候加载一段SDK代码,即可采集全量.实时的PC.M.APP三端以及小程序的用户行为数据. ...

  7. 移动开发必知必会的六大数据统计平台(入门篇)

    数据统计对于各位移动开发的童鞋并不陌生,小到Bug统计,大到数据分析,一款性能稳定.用户体验良好的APP一定离不开数据统计的支持,为此我将给大家科普一下常用的六大数据统计平台. 先说说国内的三家,从友 ...

  8. 推荐几个2021年App数据统计平台,分析数据运营必备工具

    第一个:酷传 www.kuchuan.com 酷传是国内手机统计监测平台,可以看到苹果实时办单,排名上升和热搜版单的工具 第二个:七麦数据 七脉数据可以获取榜单.关键词覆盖.搜索指数等ASO核心数据. ...

  9. uni-app 微信小程序 + 友盟统计 sdk

    在开发小程序时,有些功能会需要统计用户点击次数.登录人数.访问时长等数据,用来分析用户的一些行为:这里分享一下用 uni-app 开发微信小程序借助友盟 SDK 在前端页面中埋点统计的实现过程: 1. ...

  10. Android之友盟多渠道打包与数据统计(非原创)

    文章大纲 一.多渠道打包与数据统计介绍 二.友盟实现多渠道打包实战 三.友盟数据统计实战 四.项目源码下载 五.参考文章 一.多渠道打包与数据统计介绍   多渠道打包,相信很多同学都知道.在Andro ...

最新文章

  1. 王彪20162321 2016-2017-2 《程序设计与数据结构》第7周学习总结
  2. java输出流缓冲区内容清除,Java输入输出流与缓冲区的使用
  3. 14.PTD与的基址
  4. n型半导体和p型半导体的区别_王煜JMCA: N, P掺杂碳负载的PtP2纳米颗粒自转化为核壳型Pt/PtP2:一种高效和稳定的ORR催化剂...
  5. c语言中主函数创建链表,主函数怎么调用函数(数据结构,创建链表)
  6. knn k的选取_KNN - 初窥K近邻算法
  7. 蓝图中实现人物移动1
  8. 修改、读取txt文档
  9. 机器学习笔记(十二)——马尔科夫模型
  10. Exchange Server 2010核心服务器角色介绍
  11. CodeForces 484B Maximum Value
  12. iOS插件化研究之一——JavaScriptCore
  13. matlab bwdist
  14. 终极算法【5】——进化学派
  15. 天天向上的力量python代码解释_天天向上的力量 B
  16. 镂空针织衫 内搭外穿皆优雅
  17. linux开机自启任务和定时任务
  18. mysql数据库管理-innode undo表空间
  19. linux 温度控制软件,linux下的cpu温度监控软件 lm-sensors
  20. MT6261芯片设计最新参考资料分享

热门文章

  1. matlab 分数阶的预估校正算法及实现
  2. 用Python进行数据整理
  3. AWT:实现简单的java计算器
  4. Android简易计算器的制作(源码)(两种方法)
  5. linux系统Nginx下limit_req模块burst参数超详细解析
  6. 计算机输入设备和输出设备怎么区分,输入设备和输出设备的区别
  7. 现代内衣百年:性感无罪,无尺码也不是终局
  8. Windows10使用屏幕键盘
  9. 企业选人的三个阶段和几个标准
  10. ptf进入网站空间服务器,性能调优框架PTF