Assets/Materials/Guide/RectGuidance.mat | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/Common/GameConfig.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/GameAnalytics_SDK/GA_SDK_Manager.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/Guide/GuideCtrl.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs | ●●●●● patch | view | raw | blame | history |
Assets/Materials/Guide/RectGuidance.mat
@@ -83,7 +83,7 @@ - _UseUIAlphaClip: 0 - _ZWrite: 1 m_Colors: - _Center: {r: -150, g: -198, b: 0, a: 0} - _Center: {r: 6, g: -198, b: 0, a: 0} - _Color: {r: 1, g: 1, b: 1, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] Assets/Scripts/Common/GameConfig.cs
@@ -10,7 +10,7 @@ /// <summary> /// LoadingScene 载入下一个场景的场景名 /// </summary> public static string NextSceneName = "GemBattle"; public static string NextSceneName = "Endless"; public static bool IsDebug = false; public static string TestLoginUrl = "http://10.5.3.227:9000/user/login"; Assets/Scripts/GameAnalytics_SDK/GA_SDK_Manager.cs
@@ -11,12 +11,48 @@ return _Ins; } } /// <summary> /// Awake is called when the script instance is being loaded. /// </summary> //用来记录是否首次登录 bool isFirstStart; string firstStart = "GemBattleFirstStart"; //漏斗流统计(去重) int statisticsStep; string statisticsStr = "GemBattleStatistics"; //新手引导 int guideStep; string guideStepStr = "GemBattleGuideStep"; int maxLevel;//达到的最大关 int maxWave;//达到最大波次 string maxLevelStr = "GemBattleMaxLevelStr"; string maxWaveStr = "GemBattleMaxWaveStr"; void Awake() { _Ins = this; //PlayerPrefs.DeleteAll(); //Debug.LogError("清除了数据"); isFirstStart = PlayerPrefs.GetInt(firstStart) == 0; statisticsStep = PlayerPrefs.GetInt(statisticsStr); guideStep = PlayerPrefs.GetInt(guideStepStr); maxLevel = PlayerPrefs.GetInt(maxLevelStr); maxWave = PlayerPrefs.GetInt(maxWaveStr); } //清空数据 public void Reset() { Debug.LogError("清除了数据"); PlayerPrefs.DeleteAll(); isFirstStart = PlayerPrefs.GetInt(firstStart) == 0; statisticsStep = PlayerPrefs.GetInt(statisticsStr); guideStep = PlayerPrefs.GetInt(guideStepStr); maxLevel = PlayerPrefs.GetInt(maxLevelStr); maxWave = PlayerPrefs.GetInt(maxWaveStr); } public string GetDeviceId() @@ -48,13 +84,253 @@ account.SetAccountType(AccountType.ANONYMOUS); } /* 0.注册人数统计:以成功进入到战斗界面为注册成功 ---登录了就跳转页面 1.启动漏斗流统计(去重) (1)成功加载启动页的人数 (2)成功加载登陆界面的人数 启动首页 (3)点击登陆按钮的人数 点击登录 (4)成功生成注册信息的人数 登录成功 (5)成功加载游戏战斗界面的人数 跳转页面 (6)成功进入到新手引导step_1的人数 新手引导1 (7)成功完成step_1的人数 完成新手引导1 2.引导步数统计 (1)定义新手引导第n步 = step_n (2)完成step_n,状态记为n (3)需要统计每个玩家的n的值 (4)可根据每一个n的值统计人数 3.玩家每日的启动次数 4.每次启动的游玩时长,按1min为1个区间,统计各区间每日玩家人数 5.每次游玩过程中,点击【重新开始】按钮的次数,每次重新开始记做一轮 7.每一轮游戏中成功使用技能宝石的次数 8.每一轮游戏中成功开启的塔位置数量 9.每一轮游戏中成功购买塔的数量 10.玩家在结算界面点击【对pvp感兴趣】按钮次数 11.玩家打到第x关y波的人数(去重) 12.玩家达到第x关y波的次数(不去重) */ //0.注册人数统计:以成功进入到战斗界面为注册成功 public void ArriveBattle() { if (isFirstStart) { Debug.LogError("注册人数统计"); //只记录一次 Dictionary<string, object> dic = new Dictionary<string, object> { { "ArriveBattle", "Done"}, }; OnEvent("注册人数统计", dic); isFirstStart = false; PlayerPrefs.SetInt(firstStart, 1); } } /// <summary> /// 启动漏斗流统计(去重) ///(1)成功加载启动页的人数 ///(2)成功加载登陆界面的人数 启动首页 ///(3)点击登陆按钮的人数 点击登录 ///(4)成功生成注册信息的人数 登录成功 ///(5)成功加载游戏战斗界面的人数 跳转页面 ///(6)成功进入到新手引导step_1的人数 新手引导1 ///(7)成功完成step_1的人数 完成新手引导1 /// </summary> /// <param name="step"></param> public void Statistics(int step) { if (step > statisticsStep) { string key = ""; switch (step) { case 1: key = "成功加载登陆界面的人数"; break; case 2: key = "点击登陆按钮的人数"; break; case 3: key = "成功生成注册信息的人数"; break; case 4: key = "成功加载游戏战斗界面的人数"; break; case 5: key = "成功进入到新手引导step_1的人数"; break; case 6: key = "成功完成step_1的人数"; break; } Dictionary<string, object> dic = new Dictionary<string, object> { { key, 1} }; // Dictionary<string, object> dic = new Dictionary<string, object> // { // { "成功加载登陆界面的人数", 0}, // { "点击登陆按钮的人数", 0}, // { "成功生成注册信息的人数", 0}, // { "成功加载游戏战斗界面的人数", 0}, // { "成功进入到新手引导step_1的人数", 0}, // { "成功完成step_1的人数", 0} // }; //dic[key] = 1; Debug.LogError("漏斗流统计:" + key); OnEvent("漏斗流统计", dic); statisticsStep = step; PlayerPrefs.SetInt(statisticsStr, step); } } //单人统计一次 历史最高 // 2.引导步数统计 //(1)定义新手引导第n步 = step_n //(2)完成step_n,状态记为n //(3)需要统计每个玩家的n的值 //(4)可根据每一个n的值统计人数 public void GuideStep(int step) { if (step > guideStep) { Debug.LogError("引导步数统计:" + step); Dictionary<string, object> dic = new Dictionary<string, object> { { "Guide", step.ToString()} }; OnEvent("引导步数统计", dic); guideStep = step; PlayerPrefs.SetInt(guideStepStr, step); } } //5.每次游玩过程中,点击【重新开始】按钮的次数,每次重新开始记做一轮 public void OnClickRestartBtn() { Debug.LogError("重新开始按钮次数"); Dictionary<string, object> dic = new Dictionary<string, object> { { "OnClickRestartBtn", 1} }; OnEvent("重新开始按钮次数", dic); } //7.每一轮游戏中成功使用技能宝石的次数 public void OnUseSkill(int count) { Debug.LogError("每一轮游戏中成功使用技能宝石的次数:" + count); Dictionary<string, object> dic = new Dictionary<string, object> { { "使用次数", count+"次"} }; OnEvent("每一轮游戏中成功使用技能宝石的次数", dic); } //8.每一轮游戏中成功开启的塔位置数量 public void OnOpenTower(int towerCount) { Debug.LogError("每一轮游戏中成功开启的塔位置数量:" + towerCount); Dictionary<string, object> dic = new Dictionary<string, object> { { "购买次数", towerCount+"次"} }; OnEvent("每一轮游戏中成功开启的塔位置数量", dic); } //9.每一轮游戏中成功购买塔的数量 public void OnClickTowerBuyBtn(int buyCount) { Debug.LogError("每一轮游戏中成功购买塔的数量:" + buyCount); Dictionary<string, object> dic = new Dictionary<string, object> { { "购买次数", buyCount+"次"} }; OnEvent("每一轮游戏中成功购买塔的数量", dic); } //10.玩家在结算界面点击【对pvp感兴趣】按钮次数 public void OnClickPVPBtn() { Debug.LogError("对pvp感兴趣"); Dictionary<string, object> dic = new Dictionary<string, object> { { "OnClickPVPBtn", 1} }; OnEvent("对pvp感兴趣", dic); } /// <summary> /// 11.玩家打到第x关y波的人数(去重) 这里只穿最大值 /// </summary> /// <param name="level">第几关</param> /// <param name="wave">第几波</param> public void MaxWave(int level, int wave) { bool canSend = false; if (level >= maxLevel) { if (level > maxLevel) { canSend = true; } else if (level == maxLevel && wave > maxWave) { canSend = true; } } if (canSend) { Debug.LogError($"玩家最高打到第{level}关{wave}波"); Dictionary<string, object> dic = new Dictionary<string, object> { { "MaxWave", $"第{level}关{wave}波"} }; OnEvent("玩家最高打到第x关y波", dic); } } /// <summary> /// 12.玩家达到第x关y波的次数(不去重) /// </summary> /// <param name="level">第几关</param> /// <param name="wave">第几波</param> public void WaveDone(int level, int wave) { Debug.LogError($"玩家达到第{level}关{wave}波"); Dictionary<string, object> dic = new Dictionary<string, object> { { $"第{level}关{wave}波", 1} }; OnEvent("玩家完成第x关y波的次数", dic); } /// <summary> /// 使用自定义事件 /// </summary> /// <param name="actionId">事件名称</param> /// <param name="dic">需要传递的值</param> public void OnEvent(string actionId, Dictionary<string, object> dic) private void OnEvent(string actionId, Dictionary<string, object> dic) { //示例: // Dictionary<string, object> dic = new Dictionary<string, object> @@ -65,6 +341,7 @@ // TalkingDataGA.OnEvent("action_id", dic); TalkingDataGA.OnEvent(actionId, dic); } private void OnDestroy() Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs
@@ -19,20 +19,22 @@ void Start() { GA_SDK_Manager.Ins.SDKInit(ChannelID.Gm.ToString()); GA_SDK_Manager.Ins.Statistics(1);//成功加载登陆界面的人数 isLogining = false; transform.Find("Panel/Button").GetComponent<Button>().onClick.AddListener(OnClickLoginBtn); // if (Application.platform == RuntimePlatform.Android) // { // GetetDeviceIMEI();//获取安卓手机IMEI // } // else if (Application.platform == RuntimePlatform.WindowsEditor) // { // imei0 = "MyTestGemBattle1"; // } if (Application.platform == RuntimePlatform.Android) { //GetetDeviceIMEI();//获取安卓手机IMEI imei0 = GA_SDK_Manager.Ins.GetDeviceId();//使用设备ID } else if (Application.platform == RuntimePlatform.WindowsEditor) { imei0 = "MyTestGemBattle123"; } imei0 = GA_SDK_Manager.Ins. GetDeviceId();//使用设备ID } @@ -69,8 +71,8 @@ private void OnClickLoginBtn() { Debug.Log("登录"); LoginRequest(); GA_SDK_Manager.Ins.Statistics(2);//埋点 } @@ -82,6 +84,19 @@ { if (!isLogining) { Debug.Log("登录"); if (Application.platform == RuntimePlatform.WindowsEditor) { Debug.Log("编辑器直接登录"); GA_SDK_Manager.Ins.Login(imei0); GA_SDK_Manager.Ins.Statistics(3);//埋点 //StartCoroutine(loginMy()); StartCoroutine(LoadScene()); return; } isLogining = true; string url = GameConfig.IsDebug ? GameConfig.TestLoginUrl : GameConfig.LoginUrl; JsonData data = new JsonData(); @@ -163,9 +178,11 @@ if (login.Errorcode == 0) { Debug.Log("--------------------- 登录成功 ---------------------"); UserDataMsg userData = login.Userdata; //UserDataMsg userData = login.Userdata; GA_SDK_Manager.Ins.Login(imei0); GA_SDK_Manager.Ins.Statistics(3);//埋点 //StartCoroutine(loginMy()); StartCoroutine(LoadScene()); Assets/Scripts/Guide/GuideCtrl.cs
@@ -175,6 +175,8 @@ if (currentIndex == -1)//初始化本步 { CommonDebugHelper.DebugError("第1步开始"); GA_SDK_Manager.Ins.Statistics(5);//埋点 currentIndex = 0; needIndex = 2; panel.SetGuideUI(true); @@ -190,6 +192,8 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第2步开始"); GA_SDK_Manager.Ins.Statistics(6);//埋点 GA_SDK_Manager.Ins.GuideStep(1);//埋点 currentIndex = 0; needIndex = 2; @@ -235,6 +239,8 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第3步开始"); GA_SDK_Manager.Ins.GuideStep(2);//埋点 currentIndex = 0; needIndex = 2; panel.Step2(currentIndex); @@ -255,6 +261,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第4步开始"); GA_SDK_Manager.Ins.GuideStep(3);//埋点 currentIndex = 0; needIndex = 2; @@ -286,6 +293,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第5步开始"); GA_SDK_Manager.Ins.GuideStep(4);//埋点 currentIndex = 0; panel.Step4(currentIndex, allGuideDic[currentStep][currentIndex]); @@ -305,6 +313,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第6步开始"); GA_SDK_Manager.Ins.GuideStep(5);//埋点 EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateFirstWave); panel.Step5(currentIndex, ""); @@ -332,6 +341,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第7步开始"); GA_SDK_Manager.Ins.GuideStep(6);//埋点 panel.SetGuideUI(false); //恢复出怪 @@ -363,6 +373,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第8步开始"); GA_SDK_Manager.Ins.GuideStep(7);//埋点 currentIndex = 0; needIndex = 1; @@ -389,6 +400,7 @@ if (currentIndex == -1)//初始化本步 { CommonDebugHelper.DebugError("第9步开始"); GA_SDK_Manager.Ins.GuideStep(8);//埋点 GameConfig.CanOpenNewTower = false; currentIndex = 0; @@ -409,6 +421,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第10步开始"); GA_SDK_Manager.Ins.GuideStep(9);//埋点 currentIndex = 0; needIndex = 2; @@ -448,6 +461,7 @@ if (currentIndex == -1)//初始化本步 { CommonDebugHelper.DebugError("第11步开始"); GA_SDK_Manager.Ins.GuideStep(10);//埋点 currentIndex = 0; needIndex = 2; @@ -467,6 +481,7 @@ if (currentIndex == -1) { CommonDebugHelper.DebugError("第12步开始"); GA_SDK_Manager.Ins.GuideStep(11);//埋点 currentIndex = 0; needIndex = 1; @@ -502,6 +517,7 @@ if (currentIndex == -1)//初始化本步 { CommonDebugHelper.DebugError("第13步开始"); GA_SDK_Manager.Ins.GuideStep(12);//埋点 currentIndex = 0; needIndex = 3; @@ -519,6 +535,8 @@ private void Finish() { UnityEngine.Debug.Log("新手指导已经完成了"); GA_SDK_Manager.Ins.GuideStep(13);//埋点 GameConfig.CanOpenNewTower = true; EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.GuideFinish); Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs
@@ -52,6 +52,9 @@ // Start is called before the first frame update void Start() { GA_SDK_Manager.Ins.ArriveBattle();//埋点 GA_SDK_Manager.Ins.Statistics(4);//埋点 bVibrate = new bool[4]; bVibrate[0] = bVibrate[1] = bVibrate[2] = bVibrate[3] = false;