Unity 数据统计SDK TalkingData

简介: 官网链接: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。

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

img_a0c8655e07a8d9b5ab334c40e65cd080.png

进入官方给出的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

img_809b8b66933c66102e75d1ef27aa73fe.png

下面是配置流程

第一步:常规注册登录

img_a564cb9785915be37365f9d8160a96e5.png

img_8574d01a2fa3e083c72256c6180d6d16.png

创建游戏产品
img_44c80680bd24c561ba429bf9f5a77047.png

填写游戏名称类型等
img_e6a3f235ecc07b519abb38cfd9139fbf.png

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

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

img_723efd9b05765bf1235b68c7e94f266d.png

点击完成下一步

img_b137675dcadd7c2c22151624d9b8786a.png

然后会出现这个界面
img_036daf3a3636e0c6c8f7fdb35cdca8e7.png

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

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

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

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

img_5b73f3ce57ff500dde8ad12abc5c3f4f.png

img_0b2e1d9cf4466e061189d9976553b4ac.png

把网站上对应的AppID替换掉

img_a84a740cfdf3c89b5ceb32e5c834ffc3.png

img_d6b7c67677f045f4e46c9f2e2fd28abc.png

挂上脚本运行

img_909ab1ef4a02f786c81089f7b70e2584.png

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

img_19d3f777026d7f47e94c47a12f78413f.png

显示触发的各种事件
img_dac137e428c4acc7d1251d1d9152699e.png

注意IOS需要添加依赖框架

img_d7f6c8c6352e7432b5a5750c57146546.png

img_a1dfa52016d4f31c11302256c2495817.png

img_50fd5e8938b4d0bc7bf94b331fba43e9.png

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

img_2c683f05ec12c4fd6c548d0c878b4eb5.png

img_ee83604d39b40b4852e16abf2e55072c.png

更新数据时间

img_a6fbfeeb07f115a91370304ce776cfdb.png

OVER,大功告成!!!

img_d444c4f72d000c784b2c1175bf806da6.png

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

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;

    #region
    void 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);
        }
    }
    #endregion
    void Start()
    {
        Debug.Log("start...!!!!!!!!!!");
#if UNITY_IPHONE
#if UNITY_5
        UnityEngine.iOS.NotificationServices.RegisterForNotifications(
            UnityEngine.iOS.NotificationType.Alert |
            UnityEngine.iOS.NotificationType.Badge |
            UnityEngine.iOS.NotificationType.Sound);
#else
        NotificationServices.RegisterForRemoteNotificationTypes(
            RemoteNotificationType.Alert |
            RemoteNotificationType.Badge |
            RemoteNotificationType.Sound);
#endif
#endif
        TalkingDataGA.OnStart("C2E1B36A7A12412A88E13BED666D22D8", "想什么渠道就什么渠道渠道,应用宝,豌豆荚随便");
        account = TDGAAccount.SetAccount("User01");//必须设置
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }
#if UNITY_IPHONE
        TalkingDataGA.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.14

using 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/space
    private 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();
    }
#endif
    private static string deviceId = null;

    public static string GetDeviceId() {
        //if the platform is real device
        if (deviceId == null && Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONE
            deviceId = tdgaGetDeviceId();
#elif UNITY_ANDROID
            if (agent == null) {
                agent = new AndroidJavaClass(JAVA_CLASS);
            }
            AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
            deviceId = agent.CallStatic<string>("getDeviceId", activity);
#elif UNITY_WP8
            deviceId = TalkingDataGAWP.TalkingDataGA.getDeviceID();
#endif
        }
        return deviceId;
    }
    
    public static void OnStart(string appID, string channelId) {
        //if the platform is real device
        if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONE
//          tdgaSetSDKFramework(2);
            tdgaOnStart(appID, channelId);
#elif UNITY_ANDROID
            AndroidJavaClass 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_WP8
            TalkingDataGAWP.TalkingDataGA.init(appID, channelId);
#endif
        }
    }
    
    public static void OnEnd() {
        if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_ANDROID
            if (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_ANDROID
            if (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_IPHONE
            if (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_ANDROID
            if (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_WP8
                TalkingDataGAWP.TalkingDataGA.onEvent(actionId, parameters);
#endif
        }
    }
    
    public static void SetVerboseLogDisabled() {
        if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) {
#if UNITY_IPHONE
            tdgaSetVerboseLogDisabled();
#elif UNITY_ANDROID
            if (agent == null) {
                agent = new AndroidJavaClass(JAVA_CLASS);
            }
            agent.CallStatic("setVerboseLogDisabled");
#elif UNITY_WP8
#endif
        }
    }

#if UNITY_IPHONE
#if UNITY_5
    public 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);
                    }
                }
            }
        }
    }
#else
    public 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
}

相关文章
|
前端开发 Linux 开发工具
Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册
Unity接入环信IM SDK,实现用户登录与注册功能。
195 1
Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册
|
开发工具 图形学
Pico SDK在Unity中如何控制移动
Unity导入Pico SDK后如何进行实际开发呢?想必大家都很好奇。从去年的省赛到今年的国赛, 本人研究Pico有快一年了,刚开始学习的时候自己翻过很多的博主文章,都没有找到自己想要的知识,从那时起,我便下定决心,等国赛过后 自己要写写虚拟设备的使用了,那就以我的视角来为大家讲解Pico SDK的正确使用。
600 1
Pico SDK在Unity中如何控制移动
|
开发工具 vr&ar 图形学
Pico SDK导入Unity工程
2022VR国赛即将开始,对于Pico与Unity的使用已经很熟练了,想为下一届参赛选手及Unity 3D引擎爱好者或者是Pico开发者 聊一下自己的理解,目前Unity引擎的主流打包平台设备就是Pico和Steam VR,我参加的国赛采用的是Pico设备,所以今天就先讲一下Pico
543 0
Pico SDK导入Unity工程
|
XML Java 语音技术
Unity -Demo 之 ✨ 语音识别-讯飞SDK使用过程
因为工作需求,现在要选择连接一个语音识别功能接入系统中,所以目前正在尝试使用讯飞的语音识别SDK进行连接。 在使用语音识别的sdk之前先查阅了一下语音识别的基本知识 然后去讯飞的官网注册信息并创建一个应用用于使用SDK 基本步骤处理完了,下面就是下载SDK进行集成使用了,我这里用的是语音唤醒的SDK,按照官方教程做就行。教程在这-语音唤醒SDK教程 当上面这几步做完了之后,接下来就是将这个工程打包成给unity使用的aar包了。可以参考这个教程:将Android Studio的工程打包成aar包给unity使用
|
移动开发 JSON 缓存
钉钉消息机器人.Net通用C#Unity实现钉钉消息通知一个工具类(无需SDK,无其他引用)
钉钉消息机器人.Net通用C#Unity实现钉钉消息通知一个工具类(无需SDK,无其他引用) Chinar —— 心分享、心创新! 助力快速完成 .Net 通用的钉钉Post机器人消息通知 为初学者节省宝贵的时间,避免采坑! 官方文档详细,但实现方式上没有过多的说明。 本质上就是一个 POST 消息请求 所以我们只要, 完成正常发送POST 使得钉钉方从中可获取对应格式的数据 即可!
1060 0
钉钉消息机器人.Net通用C#Unity实现钉钉消息通知一个工具类(无需SDK,无其他引用)
|
Java 开发工具 Android开发
2018年Unity结合Android SDK下载安装及配置教程
原文:2018年Unity结合Android SDK下载安装及配置教程 首先声明: Unity版本2017.1f3        最近试着在Unity中利用网易做AR开发时,发布项目文件需要发布到Android平台,遇到一些问题,看了网上的一些资料,踩了一些坑,现在总结出来,希望有相同的开发者遇到时可以规避。
3964 0
|
Java API 开发工具
Unity SDK JDK 环境配置 避免各种莫名其妙的报错
在进行Unity Android打包的时候总会遇到一些错误,错误无非一下几大类 SDK版本过高或者过低 JDK版本过高或者过低 ADB环境变量没有配置 Java环境变量没有配置 SDK文件夹中的文件命名错误 以下介绍一些配置环境的流程帮助大家能够正常打包android.
2015 0
|
Java 开发工具 Android开发
|
开发工具 Android开发 图形学
|
3月前
|
安全 开发工具 Android开发
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
248 0