com.guru.unity.sdk/Runtime/Code/SDK/GuruSDK.Analytics.cs

780 lines
33 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

namespace Guru
{
using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 打点管理
/// </summary>
public partial class GuruSDK
{
/// <summary>
/// 主线关卡类型
/// 只有传入此类型时才会进行 Blevel 的累加
/// </summary>
public const string LevelTypeMain = "main";
//----------------- 关卡开始类型 ---------------------
public const string EventLevelStartModePlay = "play";
public const string EventLevelStartModeReplay = "replay";
public const string EventLevelStartModeContinue= "continue";
//----------------- 关卡结束类型 ---------------------
public const string EventLevelEndSuccess = "success";
public const string EventLevelEndFail = "fail";
public const string EventLevelEndExit = "exit";
public const string EventLevelEndTimeout = "timeout";
#region 通用接口
/// <summary>
/// 自定义事件打点
/// </summary>
/// <param name="eventName"></param>
/// <param name="data"></param>
public static void LogEvent(string eventName, Dictionary<string, dynamic> data = null)
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: LogEvent {eventName} :: Please call <GuruSDK.Start()> first, before you call <LogEvent>.");
return;
}
Analytics.Track(eventName, data);
}
public static void SetScreen(string screen, string extra = "")
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: SetScreen {screen} :: Please call <GuruSDK.Start()> first, before you call <SetScreen>.");
return;
}
Analytics.SetCurrentScreen(screen, extra);
}
#endregion
#region 游戏打点
/// <summary>
/// 游戏启动打点
/// </summary>
/// <param name="levelId">关卡Id</param>
/// <param name="levelName">关卡名称: main_01_9001, daily_challenge_81011</param>
/// <param name="levelType">关卡类型: 主线:main</param>
/// <param name="puzzleId">配置/谜题/图片/自定义Id: 101120</param>
/// <param name="startType">关卡开始类型: play开始游戏replay重玩continue继续游戏</param>
/// <param name="isReplay">是否重新开始: true/false</param>
/// <param name="extra">扩展数据</param>
public static void LogLevelStart(int levelId, string startType = EventLevelStartModePlay,
string levelType = LevelTypeMain, string levelName = "", string puzzleId = "",
bool isReplay = false, Dictionary<string, object> extra = null)
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: LogLevelStart {levelId} :: Please call <GuruSDK.Start()> first, before you call <LogLevelStart>.");
return;
}
Analytics.LogLevelStart(levelId, levelName, levelType, puzzleId, startType, isReplay, extra);
}
/// <summary>
/// 游戏点击 Continue 继续游戏
/// </summary>
/// <param name="levelId"></param>
/// <param name="levelType"></param>
/// <param name="levelName"></param>
/// <param name="puzzleId"></param>
/// <param name="extra"></param>
public static void LogLevelContinue(int levelId, string levelType = LevelTypeMain,
string levelName = "", string puzzleId = "", Dictionary<string, object> extra = null)
{
LogLevelStart(levelId, EventLevelStartModeContinue, levelType, levelName, puzzleId, true, extra:extra);
}
/// <summary>
/// 游戏点击 Replay 重玩关卡
/// </summary>
/// <param name="levelId"></param>
/// <param name="levelType"></param>
/// <param name="levelName"></param>
/// <param name="puzzleId"></param>
public static void LogLevelReplay(int levelId, string levelType = LevelTypeMain,
string levelName = "", string puzzleId = "", Dictionary<string, object> extra = null)
{
LogLevelStart(levelId, EventLevelStartModeReplay,levelType, levelName, puzzleId, true, extra:extra);
}
/// <summary>
/// 关卡结束打点
/// </summary>
/// <param name="levelId">关卡Id</param>
/// <param name="result">success:成功fail:失败exit:退出timeout:超时replay:重玩...</param>
/// <param name="levelType">关卡类型: 主线:main</param>
/// <param name="levelName">关卡名称: main_01_9001, daily_challenge_81011</param>
/// <param name="puzzleId">配置/谜题/图片/自定义Id: 101120</param>
/// <param name="duration">关卡完成时长(单位:毫秒)</param>
/// <param name="step">步数(有则上报)</param>
/// <param name="score">分数(有则上报)</param>
/// <param name="extra">扩展数据</param>
public static void LogLevelEnd(int levelId, string result = EventLevelEndSuccess,
string levelType = LevelTypeMain, string levelName = "", string puzzleId = "",
int? duration = null, int? step = null, int? score = null, Dictionary<string, object> extra = null )
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: LogLevelEnd {levelId} :: Please call <GuruSDK.Start()> first, before you call <LogLevelEnd>.");
return;
}
if (InitConfig.AutoRecordFinishedLevels)
{
if(result == EventLevelEndSuccess){
if(levelType == LevelTypeMain)
{
if (levelId > Model.SuccessLevelId) Model.SuccessLevelId = levelId; // 自动记录关卡完成次数
}
Model.TotalPlayedCount++; // 自动记录关卡总次数
}
Analytics.BLevel = Model.SuccessLevelId; // 记录 BLevel
Analytics.BPlay = Model.TotalPlayedCount; // 记录 BPlay
}
Analytics.LogLevelEnd(levelId, result, levelName, levelType, puzzleId, duration, step, score, extra);
}
/// <summary>
/// 关卡首次通关
/// </summary>
/// <param name="levelType"></param>
/// <param name="levelName"></param>
/// <param name="level"></param>
/// <param name="result"></param>
/// <param name="duration"></param>
/// <param name="extra"></param>
public static void LevelFirstEnd(string levelType, string levelName, int level,
string result = EventLevelEndSuccess, int? duration = null, Dictionary<string, object> extra = null)
{
Analytics.LevelFirstEnd(levelType, levelName, level, result, duration, extra);
}
/// <summary>
/// 游戏失败打点
/// 需要为游戏记录详细的失败原因
/// </summary>
public static void LogLevelFail(int levelId,
string levelType = LevelTypeMain, string levelName = "", string puzzleId = "",
int? duration = null, int? step = null, int? score = null , Dictionary<string, object> extra = null)
{
LogLevelEnd(levelId, EventLevelEndFail, levelType, levelName, puzzleId, duration, step, score, extra);
}
/// <summary>
/// 因退出关卡导致游戏失败
/// </summary>
public static void LogLevelFailExit(int levelId,
string levelType = LevelTypeMain, string levelName = "", string puzzleId = "",
int? duration = null, int? step = null, int? score = null, Dictionary<string, object> extra = null)
{
LogLevelEnd(levelId, EventLevelEndExit, levelType, levelName, puzzleId, duration, step, score, extra);
}
/// <summary>
/// 因关卡超时导致游戏失败
/// </summary>
public static void LogLevelFailTimeout(int levelId,
string levelType = LevelTypeMain, string levelName = "", string puzzleId = "",
int? duration = null, int? step = null, int? score = null, Dictionary<string, object> extra = null)
{
LogLevelEnd(levelId, EventLevelEndTimeout, levelType, levelName, puzzleId, duration, step, score, extra);
}
/// <summary>
/// 玩家(角色)升级事件
/// </summary>
/// <param name="playerLevel"></param>
/// <param name="playerName"></param>
/// <param name="extra">扩展数据</param>
public static void LogLevelUp(int playerLevel, string playerName, Dictionary<string, object> extra = null)
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: LogLevelUp {playerLevel} :: Please call <GuruSDK.Start()> first, before you call <LogLevelUp>.");
return;
}
Analytics.LevelUp(playerLevel, playerName, extra);
}
/// <summary>
/// 玩家解锁成就
/// </summary>
/// <param name="achievementName"></param>
/// <param name="extra">扩展数据</param>
public static void LogAchievement(string achievementName, Dictionary<string, object> extra = null)
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: LogAchievement {achievementName} :: Please call <GuruSDK.Start()> first, before you call <LogAchievement>.");
return;
}
Analytics.UnlockAchievement(achievementName, extra);
}
#endregion
#region 用户属性
/// <summary>
/// 提前调用用户属性
/// </summary>
private static void InitUserProperties()
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: InitUserProperties :: Please call <GuruSDK.Start()> first, before you call <InitUserProperties>.");
return;
}
Debug.Log($"[SDK] --- PurchasedCount:{Model.PurchasedCount}");
Debug.Log($"[SDK] --- IsIapUser:{Model.IsIapUser}");
SetUserIsIAP(Model.IsIapUser); // 预先设置用户的 IAP User 属性
SetUserBLevel(Model.SuccessLevelId); // 预先设置用户的 BLevel 属性
SetUserBPlay(Model.TotalPlayedCount); // 预先设置用户的 BPlay 属性
if (Model.IsNoAds) SetBuyNoAds(true); // 设置用户已经购买了去广告
}
/// <summary>
/// 设置用户属性
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public static void SetUserProperty(string key, string value)
{
if (!IsInitialSuccess)
{
UnityEngine.Debug.LogError($"{Tag} :: SetUserProperty {key}:{value} ::Please call <GuruSDK.Start()> first, before you call <SetUserProperty>.");
return;
}
Analytics.SetUserProperty(key, value);
}
public static void SetUID(string uid)
{
SetUserProperty(Analytics.PropertyUserID, uid);
}
public static void SetUserBLevel(int blevel)
{
SetUserProperty(Analytics.PropertyLevel, $"{blevel}");
}
public static void SetUserBPlay(int bplay)
{
SetUserProperty(Analytics.PropertyPlay, $"{bplay}");
}
/// <summary>
/// 上报用户全部的 Coin (当前值)
/// </summary>
/// <param name="totalCoins"></param>
public static void SetUserTotalCoins(int totalCoins)
{
SetUserProperty(Analytics.PropertyCoin, $"{totalCoins}");
}
/// <summary>
/// 上报用户免费金币的 数量 (累加值)
/// </summary>
/// <param name="freeCoins"></param>
public static void SetUserFreeCoins(int freeCoins)
{
SetUserProperty(Analytics.PropertyNonIAPCoin, $"{freeCoins}");
}
/// <summary>
/// 上报用户付费金币的 数量 (累加值)
/// </summary>
/// <param name="freeCoins"></param>
public static void SetUserPaidCoins(int paidCoins)
{
SetUserProperty(Analytics.PropertyIAPCoin, $"{paidCoins}");
}
public static void SetUserExp(int exp)
{
SetUserProperty(Analytics.PropertyExp, $"{exp}");
}
public static void SetUserHp(int hp)
{
SetUserProperty(Analytics.PropertyHp, $"{hp}");
}
public static void SetUserGrade(int grade)
{
SetUserProperty(Analytics.PropertyGrade, $"{grade}");
}
public static void SetUserIsIAP(bool isIapUser)
{
SetUserProperty(Analytics.PropertyIsIAPUser, isIapUser? "true" : "false");
}
#endregion
#region SDK 打点
/// <summary>
/// Log SDK boost time
/// </summary>
/// <param name="time"></param>
private static void LogSDKInitTime(double time)
{
Analytics.Track(Consts.EventSDKInfo, new Dictionary<string, dynamic>()
{
{ "boost_time", time.ToString("F6") },
{ Consts.PropertyDeviceID, DeviceId },
{ "version", Version}
}, new Analytics.EventSetting()
{
EnableFirebaseAnalytics = true,
});
SetUserProperty("sdk_version", Version);
}
#endregion
#region IAP 打点
/// <summary>
/// 当付费页面打开时调用
/// </summary>
/// <param name="scene">付费页面名称, 默认为 Store</param>
/// <param name="productId">列表中首个商品的 ProductId </param>
public static void OnIAPPageOpen(string scene = "Store", string productId = "")
{
if (string.IsNullOrEmpty(productId))
{
if (GuruSettings.Instance != null && (GuruSettings.Instance.Products?.Length ?? 0) > 0)
{
productId = GuruSettings.Instance.Products[0].ProductId;
}
}
Analytics.IAPImp(scene, productId);
}
/// <summary>
/// 当付费页面关闭时调用
/// </summary>
/// <param name="scene"></param>
/// <param name="productId"></param>
public static void OnIAPPageClose(string scene = "Store", string productId = "")
{
if (string.IsNullOrEmpty(productId))
{
productId = GuruIAP.Instance.CurrentBuyingProductId;
}
Analytics.IAPClose(scene, productId);
}
#endregion
#region 经济打点
// ************************************************************************************************
// *
// * 经济打点
// * 内容详参: https://docs.google.com/spreadsheets/d/1xYSsAjbrwqeJm7panoVzHO0PeGRQVDCR4e2CU9OPEzk/edit#gid=0
// *
// ************************************************************************************************
//---------------------------------------- EARN ----------------------------------------
/// <summary>
/// 基础收入接口. 可直接调用此接口上报相关参数
/// 获取虚拟货币/道具.
/// 基础接口, 不推荐项目组直接调用
/// 请直接调用其他对应场景的统计接口
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">货币增加值 10</param>
/// <param name="balance">结算后货币总量 20 -> 30</param>
/// <param name="category">消耗类型, 默认值请赋 reward</param>
/// <param name="levelName">当前关卡或者人物等级名称</param>
/// <param name="itemName">购买道具名称</param>
/// <param name="scene">购买场景如 Store, Workbench, Sign, Ads....</param>
public static void EarnVirtualCurrency(string currencyName,
int value, int balance,
string category = "", string itemName = "",
string levelName = "", string scene = "", Dictionary<string, object> extra = null)
{
Analytics.EarnVirtualCurrency(currencyName, value, balance, category, itemName,levelName, scene, extra);
}
/// <summary>
/// 赚取组合: 货币+道具
/// </summary>
/// <param name="currencyName"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="category"></param>
/// <param name="itemName"></param>
/// <param name="props"></param>
/// <param name="levelName"></param>
/// <param name="scene"></param>
private static void EarnVirtualCurrencyAndProps(string currencyName,
int value = 0, int balance = 0,
string category = "", string itemName = "",
string levelName = "", string scene = Consts.ParameterDefaultScene,
string[] props = null, Dictionary<string, object> extra = null)
{
//---- Currency -----
if (value > 0)
{
EarnVirtualCurrency(currencyName, value, balance, category, itemName, levelName, scene, extra);
}
//---- Props --------
if (null != props)
{
int i = 0;
while (i < props.Length)
{
EarnVirtualCurrency(props[i], 1, 0, category, itemName, levelName, scene, extra);
i++;
}
}
}
/// <summary>
/// 签到奖励. 获得货币/道具
/// <li>通常类型: Coin 收入 </li>
/// <li>特殊类型: Coin + Props (道具列表) </li>
/// <li>特殊类型: Props (道具列表) </li>
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
/// <param name="scene">应用场景</param>
/// <param name="props">获取的道具名称列表</param>
public static void EarnVirtualCurrencyBySign(string currencyName,
int value = 0, int balance = 0, string levelName = "",
string scene = "home", string[] props = null, Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryReward;
string itemName = "sign";
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
/// <summary>
/// IAP 付费购买. 获得货币/道具
/// <li>通常类型: Coin 收入 </li>
/// <li>特殊类型: Coin + Props (道具列表) </li>
/// <li>特殊类型: Props (道具列表) </li>
/// </summary>
/// <param name="currencyName">IAP 道具名称</param>
/// <param name="productId">IAP 道具商品 ID </param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
/// <param name="scene">应用场景</param>
/// <param name="props">获取的道具名称列表</param>
public static void EarnVirtualCurrencyByIAP(string currencyName, string productId,
int value = 0, int balance = 0, string levelName = "",
string scene = "store", string[] props = null, Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryIAP;
string itemName = productId;
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
/// <summary>
/// 看广告获取到货币/道具
/// <li>通常类型: Coin 收入 </li>
/// <li>特殊类型: Coin + Props (道具列表) </li>
/// <li>特殊类型: Props (道具列表) </li>
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
/// <param name="scene">应用场景</param>
/// <param name="props">获取的道具名称列表</param>
public static void EarnVirtualCurrencyByAds(string currencyName,
int value = 0, int balance = 0, string levelName = "",
string scene = "store", string[] props = null, Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryReward;
string itemName = "ads";
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
/// <summary>
/// 使用了金币半价 + 看广告获取到货币/道具
/// <li>通常类型: Coin 收入 </li>
/// <li>特殊类型: Coin + Props (道具列表) </li>
/// <li>特殊类型: Props (道具列表) </li>
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
/// <param name="scene">应用场景</param>
/// <param name="props">获取的道具名称列表</param>
public static void EarnVirtualCurrencyByPaidAds(string currencyName,
int value = 0, int balance = 0, string levelName = "",
string scene = Consts.ParameterDefaultScene, string[] props = null, Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryBonus;
string itemName = "ads";
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
/// <summary>
/// 过关奖励获取到货币/道具
/// <li>通常类型: Coin 收入 </li>
/// <li>特殊类型: Coin + Props (道具列表) </li>
/// <li>特殊类型: Props (道具列表) </li>
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
/// <param name="scene">应用场景</param>
/// <param name="props">获取的道具名称列表</param>
public static void EarnVirtualCurrencyByLevelComplete(string currencyName,
int value = 0, int balance = 0, string levelName = "",
string scene = "store", string[] props = null, Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryReward;
string itemName = "level";
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
/// <summary>
/// 通过使用 Currency 购买获得 Prop (记录 Prop 增加的打点, 消费游戏内货币)
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="props">获取的道具名称列表</param>
/// <param name="scene">应用场景</param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
public static void EarnPropsByVirtualCurrency(string currencyName, string[] props,
string scene = Consts.ParameterDefaultScene,
int value = 1, int balance = 0, string levelName = "", Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryIGC;
string itemName = currencyName;
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
/// <summary>
/// 通过道具交换/合成或得了其他道具
/// </summary>
/// <param name="propName"></param>
/// <param name="otherName"></param>
/// <param name="scene"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="levelName"></param>
public static void EarnPropByProp(string propName, string otherName,
string scene = Consts.ParameterDefaultScene,
int value = 1, int balance = 0, string levelName = "", Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryIGB;
EarnVirtualCurrency(propName, value, balance, category, otherName, levelName, scene, extra);
}
/// <summary>
/// 通过转盘或者抽奖, 获取货币/道具
/// <li>通常类型: Coin 收入 </li>
/// <li>特殊类型: Coin + Props (道具列表) </li>
/// <li>特殊类型: Props (道具列表) </li>
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">赚取金额</param>
/// <param name="balance">货币总量(累加后)</param>
/// <param name="levelName">当前关卡名称</param>
/// <param name="scene">应用场景</param>
/// <param name="props">获取的道具名称列表</param>
public static void EarnVirtualCurrencyByLottery(string currencyName,
int value = 0, int balance = 0, string levelName = "",
string scene = "store", string[] props = null, Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryIGB;
string itemName = "lottery";
EarnVirtualCurrencyAndProps(currencyName, value, balance, category, itemName, levelName, scene, props, extra);
}
//---------------------------------------- SPEND ----------------------------------------
/// <summary>
/// 基础花费虚拟货币/道具
/// 基础接口, 不推荐项目组直接调用
/// 请直接调用其他对应场景的统计接口
/// </summary>
/// <param name="currencyName">货币名称</param>
/// <param name="value">货币消耗值 10</param>
/// <param name="balance">结算后货币总量 30 -> 20</param>
/// <param name="category">消耗类型, 默认值请赋 reward</param>
/// <param name="levelName">当前关卡或者人物等级名称</param>
/// <param name="itemName">购买道具名称</param>
/// <param name="scene">购买场景如 Store, Workbench, Sign, Ads....</param>
public static void SpendVirtualCurrency(string currencyName, int value, int balance, string category = "", string itemName = "",
string levelName = "", string scene = "", Dictionary<string, object> extra = null)
{
Analytics.SpendVirtualCurrency(currencyName, value, balance, category, itemName, levelName, scene, extra);
}
/// <summary>
/// 消耗货币购买道具
/// </summary>
/// <param name="currencyName"></param>
/// <param name="prop"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="levelName"></param>
/// <param name="scene"></param>
public static void SpendVirtualCurrencyWithProp(string currencyName, string prop,
int value, int balance,
string levelName = "", string scene = "", Dictionary<string, object> extra = null)
{
SpendVirtualCurrencyWithProps(currencyName, new string[] {prop}, value, balance, levelName, scene, extra);
}
/// <summary>
/// 消耗货币购买道具 (含多个)
/// </summary>
/// <param name="currencyName"></param>
/// <param name="props"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="levelName"></param>
/// <param name="scene"></param>
public static void SpendVirtualCurrencyWithProps(string currencyName, string[] props,
int value, int balance,
string levelName = "", string scene = "", Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryProp;
if (props != null && props.Length > 0)
{
int i = 0;
while (i < props.Length)
{
SpendVirtualCurrency(currencyName, value, balance, category, props[i], levelName, scene, extra);
i++;
}
}
}
/// <summary>
/// 消耗货币购买礼包或组合
/// </summary>
/// <param name="currencyName"></param>
/// <param name="bundle"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="levelName"></param>
/// <param name="scene"></param>
public static void SpendVirtualCurrencyWithBundle(string currencyName, string bundle,
int value, int balance,
string levelName = "", string scene = "", Dictionary<string, object> extra = null)
{
SpendVirtualCurrencyWithBundles(currencyName, new string[] {bundle}, value, balance, levelName, scene, extra);
}
/// <summary>
/// 消耗货币购买礼包或组合 (含多个)
/// </summary>
/// <param name="currencyName"></param>
/// <param name="bundles"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="levelName"></param>
/// <param name="scene"></param>
public static void SpendVirtualCurrencyWithBundles(string currencyName, string[] bundles,
int value, int balance,
string levelName = "", string scene = "", Dictionary<string, object> extra = null)
{
string category = Consts.CurrencyCategoryBundle;
if (bundles != null && bundles.Length > 0)
{
int i = 0;
while (i < bundles.Length)
{
SpendVirtualCurrency(currencyName, value, balance, category, bundles[i], levelName, scene, extra);
i++;
}
}
}
/// <summary>
/// 消耗物品, 交换其他物品
/// </summary>
/// <param name="currencyName"></param>
/// <param name="bundles"></param>
/// <param name="value"></param>
/// <param name="balance"></param>
/// <param name="levelName"></param>
/// <param name="scene"></param>
public static void SpendPropWithProp(string propName, string otherName,
int value, int balance,
string levelName = "", string scene = "", string extraCategory = "", Dictionary<string, object> extra = null)
{
string category = string.IsNullOrEmpty(extraCategory) ? Consts.CurrencyCategoryProp : extraCategory;
SpendVirtualCurrency(propName, value, balance, category, otherName, levelName, scene, extra);
}
#endregion
#region Crashlytics 接口
public static void CrashLog(string message)
{
if (!IsFirebaseReady) return;
CrashlyticsAgent.Log(message);
}
public static void CrashException(string message)
{
if (!IsFirebaseReady) return;
CrashlyticsAgent.LogException(message);
}
public static void CrashException(Exception ex)
{
if (!IsFirebaseReady) return;
CrashlyticsAgent.LogException(ex);
}
public static void CrashCustomKeys(string key, string value)
{
if (!IsFirebaseReady) return;
CrashlyticsAgent.SetCustomKey(key, value);
}
#endregion
}
}