前言

最近需要做一个在PC端的Bug上报功能,之前的Bugly是用在移动端的,其实不是很适合。

所以需要一个在PC端的Bug上报,然后在网上找到一个还不错的插件:Trello Bug Tracker

https://assetstore.unity.com/packages/tools/integration/trello-bug-tracker-pro-75613

不过网上对这个的介绍很少,所以一边学一边记录一下。

其实这类功能最关键的要实现的功能有这么几个:

1、用户反馈能上报;

2、能抓取日志;

3、自动抓取报错上报;

4、有一个给开发者的查看界面。

前面的都能在客户端实现,关键是第四个对吧。这个插件其实取了个巧,他是相当于白嫖了Trello这个网络协作插件来进行上报(其实按照他这个原理理论上也是可以接入别的看板网页之类,比如企业微信的TAPD这种)。

原理

这个插件的原理就是调用了Trello的开发者API,然后用WWW的方式来上传一个卡片(Card)到Trello的看板(Borad)。你可以理解为,这个插件白嫖了 Trello 的网站、数据存储,来实现了自己的错误上报功能。

插件的使用

原版的插件下载下来之后,他分为2个部分。一个是错误上报,还有一个部分是辅助类的,比如画图什么的。个人认为画图什么的没啥大用,可以不用管,但是上报的部分可以留着。

可以先打开它的例子程序来操作一下,点右下那个虫就可以上报了。

之后更多的是在程序方面的工作了。

初始化

当然,你需要先去Trello 的官网上注册一个账号先:https://trello.com。

之后需要将你的Key和Token取出来,用来初始化。

获取Key和Token的地址为 : https://trello.com/app-key

然后你需要在Trello上新建立一个Board来接收你的上传文件。

在网页的右上角有个 + 号,点击创建一个(看板)Board,然后记下这个看板的名字。

之后转入到代码上:

        public string Key;public string Token;public string BoardName;private Trello trello;public const string ListName_Advice = "PlayerAcvice";public const string ListName_PlayerReport = "PlayerReport";public const string ListName_AutoReport = "AutoReport";IEnumerator StartInit(){if (trello != null && trello.IsConnected()){Debug.Log("Trello 已经连接上!");yield break;}trello = new Trello(Key, Token);yield return trello.PopulateBoardsRoutine();//设置当前看板;trello.SetCurrentBoard(BoardName);//获取当前看板下的列表;yield return trello.PopulateListsRoutine();/** 从网上拉下来的List可能与设定的有所不同。* 设定的是需要 PlayerAdvice , PlayerReprot , AutoReport 三个。* 分别对应的是玩家建议、玩家的错误反馈、自动的错误上报。* 如果这三个标签没有则需要手动添加;*/bool isNeedReCache = false;if (!trello.IsListCached(ListName_Advice)){yield return trello.UploadListRoutine(NewList(ListName_Advice));isNeedReCache = true;}if (!trello.IsListCached(ListName_PlayerReport)){yield return trello.UploadListRoutine(NewList(ListName_PlayerReport));isNeedReCache = true;}if (!trello.IsListCached(ListName_AutoReport)){yield return trello.UploadListRoutine(NewList(ListName_AutoReport));isNeedReCache = true;}//如果修改了List,那就重新缓存一下;if (isNeedReCache)yield return trello.PopulateListsRoutine();}private TrelloList NewList(string name){TrelloList list =  trello.NewList();list.name = name;return list;}

玩家上报

玩家上报需要建立一个新的UI面板来处理上报,这里就不用赘述了。直接跳到获取到了所需的信息之后,如何上传。

#region 用户上报部分/// <summary>/// 发送用户的建议;/// </summary>/// <param name="title"></param>/// <param name="content"></param>public void SendAdvice(string title, string content){TrelloCard card = trello.NewCard(title, content, ListName_Advice);StartCoroutine(SendReportRoutine(card, null));}/// <summary>/// 发送用户的错误报告/// </summary>/// <param name="title"></param>/// <param name="content"></param>public void SendPlayerReport(string title, string content){//与玩家建议不同的是,玩家错误报告需要上传错误日志;TrelloCard card = trello.NewCard(title, content, ListName_PlayerReport);StartCoroutine(SendReportRoutine(card, null, true));}public IEnumerator SendReportRoutine(TrelloCard card, List<Texture2D> screenshots = null, bool isLog = false){// We upload the card with an async custom coroutine that will return the card ID// Once it has been uploaded.CustomCoroutine cC = new CustomCoroutine(this, trello.UploadCardRoutine(card));yield return cC.coroutine;// The uploaded card IDstring cardID = (string)cC.result;//这里是截图上传,如果是玩家建议则不需要截图;if (screenshots != null && screenshots.Count > 0){int i = 0;foreach (Texture2D screenshot in screenshots){i++;// We can now attach the screenshot to the card given its ID.yield return trello.SetUpAttachmentInCardRoutine(cardID, "ScreenShot" + i + ".png", screenshot);}}if (isLog){
#if UNITY_STANDALONE// We make sure the log exists before trying to retrieve it.if (System.IO.File.Exists(logPath)){// We make a copy of the log since the original is being used by Unity.System.IO.File.Copy(logPath, logPathCopy, true);// We attach the Unity log file to the card.yield return trello.SetUpAttachmentInCardFromFileRoutine(cardID, "output_log.txt", logPathCopy);}
#endif}//这里是上传自定义的玩家信息:string userData = $"UserName : {"测试用户1"};\n" +$"玩家等级{1}";yield return trello.SetUpAttachmentInCardRoutine(cardID, "UserInfo.txt", userData);}// Platform dependent Log Pathprivate string logPath{get{#if UNITY_STANDALONE_WINvar absolutePath = "%USERPROFILE%/AppData/LocalLow/" + Application.companyName + "/" + Application.productName + "/output_log.txt";var filePath = System.Environment.ExpandEnvironmentVariables(absolutePath);return filePath;//Old windows log path//return System.Diagnostics.Process.GetCurrentProcess().ProcessName + "_Data/output_log.txt";#elif UNITY_STANDALONE_LINUXreturn "~/.config/unity3d/" + Application.companyName + "/" + Application.productName + "/Player.log";#elif UNITY_STANDALONE_OSXreturn "~/Library/Logs/Unity/Player.log";
#elsereturn "";
#endif}}// Platform dependent Log Path copyprivate string logPathCopy{get{
#if UNITY_STANDALONE_WINvar absolutePath = "%USERPROFILE%/AppData/LocalLow/" + Application.companyName + "/" + Application.productName + "/output_logCopy.txt";var filePath = System.Environment.ExpandEnvironmentVariables(absolutePath);return filePath;//Old windows log path//return System.Diagnostics.Process.GetCurrentProcess().ProcessName + "_Data/output_log2.txt";#elif UNITY_STANDALONE_LINUXreturn "~/.config/unity3d/" + Application.companyName + "/" + Application.productName + "/PlayerCopy.log";#elif UNITY_STANDALONE_OSXreturn "~/Library/Logs/Unity/PlayerCopy.log";
#elsereturn "";
#endif}}#endregion

这样就算完成了一个简易地,由玩家触发的上传机制。

接下来测试一下,我在面板里分别上传了1个建议和1个报错,然后我们转到Trello的网站上看:

可以看到已经成功上传了。后续只需要调整一些格式和内容,根据项目进行调优即可。

后记

还有一个很重要的功能就是Bug的自动上报,也就是当我们检测到控制台打印出Error或者Exception的时候,就自动抓取进行上报。这个功能我打算新开一篇来写,这一篇篇幅略长。

新的一篇在这里:https://blog.csdn.net/cyf649669121/article/details/105654015

改造后的文件:https://download.csdn.net/download/cyf649669121/12346924

【Unity】【PC】【错误上报】Bug上报插件 Trello Bug Tracker 使用介绍 (一):用户上报部分相关推荐

  1. Unity中那些事半功倍的好插件

    Unity开发最好的地方就是有各种强大的插件,有哪些插件让大家事半功倍,稳定强大 值得推荐学习和入手呢?Unity5.0之后,制作UI 以及UI的动画,UI特效,大家一般都使用什么插件?或者说有什么好 ...

  2. tomcat 404错误 原因_软件测试人员定位bug原因的10大妙招分享

    作为一名软件测试人员,日常工作与bug是息息相关的.在发现bug之后,首先要做的就是定位bug,确定bug的存在,然后才是分析bug产生的原因并解决bug. 无论是自己找到的bug,还是开发修复后告诉 ...

  3. Unity即将内置骨骼动画插件Anima2D

    Unity即将内置骨骼动画插件Anima2D Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开 ...

  4. 火山PC单线程单对象使用大漠插件-基础

    本源码转载自利快云https://www.lkuaiy.com/ 火山PC单线程单对象使用大漠插件-基础 一.需要调用的模块 视窗基本类 MFC界面基本类 大漠模块   (只封装了部分命令)本文末附下 ...

  5. 【Unity学习】关于串口通信插件SerialPortUtilityPro的简单使用个人案例

    [Unity学习]关于串口通信插件SerialPortUtilityPro的简单使用个人案例 前言 需求分析 串口发送数据 串口接收数据并解析 结语 前言 关于插件资源,请去资源商店购买或使用其试用版 ...

  6. 什么是bug?如何描述一个bug?

    什么是bug? bug就是软件缺陷,软件错误 当产品规格说明是正确的,但是程序与产品规格说明之间的不匹配就是bug. 当程序没有实现其最终用户合理预期的功能要求时,就是bug. 通俗来说: 产品说明书 ...

  7. 测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办

    目录 一.如何合理的创建bug 二.bug的等级 三.bug的生命周期 四.和开发产生争执怎么办 一.如何合理的创建bug 创建Bug的目的就是为了能够让其他人可以尝试复现 一个合格的bug应该包含以 ...

  8. 测试中BUG定义、测试BUG的等级划分、Bug流程以及Bug解决优先级

    一个优秀的软件测试师不仅仅能够发现软件中的bug,还能分析出bug产生的原因. 总结了一些软件测试入门必须要了解和学习的BUG基础知识,主要包括BUG定义.测试BUG的等级划分.Bug流程以及Bug解 ...

  9. 5. 如何描述一个bug / 如何定义bug的类型级别 / bug的生命周期

    1. 描述一个bug 提交了如下bug: 1.在短信列表,选择一条短信,进行删除,删除失败 2.在短信列表,选择一条短信,进行查看,在查看页面,进行删除,删除失败 故障发现版本:VPS20180226 ...

最新文章

  1. PHP对redis操作详解
  2. (笔记)Ubuntu下安装arm-linux-gcc-4.4.3.tar.gz (交叉编译环境)
  3. Android中的网格布局
  4. IOS7的一个神奇的Bug
  5. 2017年4月11日
  6. 程序员养生之道——坚持泡脚(十五分钟以上)
  7. 苹果风格ui_苹果如何使Soft-UI成为未来
  8. 实施 or 开发 ?
  9. mysql bit php,Bit Web Server (PHP,MySQL,PMA) 安卓WEB服务器
  10. 如何成为更好的前端工程师?如何才能进入下一个阶段?
  11. TV直播app TV版 超级直播 空壳 可玩性强 带EPG 带回看 带自定义 定制可带自定义协议等
  12. 转载:MHL原理剖析
  13. Roguelike随机地下城 | 二、设置门和优化最终房间的选择
  14. Android 阻止AlertDialog dismiss
  15. HarvestText
  16. Linux Mint 11开启Compiz Fusion特效
  17. 计算机名弹出输入网络密码错误,win10系统登录网络打印机出现用户名和密码错误的设置办法...
  18. 高等数学学习(1)-函数
  19. 严重: Servlet.service() for servlet [springmvc] in context with path [] threw exception [Request proce
  20. png转jpg具体操作方法

热门文章

  1. Symbol - 看似平凡的Symbol其实我们每天都在用 - 对象操作
  2. java登陆拦截器_登陆拦截器LoginInterceptor
  3. JavaEE常见面试问题
  4. 【数据结构 严蔚敏版】 二叉树 基本操作
  5. Magic Firewall 简介
  6. 2023最新最强网盘资源搜索引擎,聚合搜索6大网盘资源
  7. 最新 955 不加班的公司名单(2022 版)
  8. 计算机开机密码有几成,电脑密码设置有哪些类型 电脑开机密码忘了怎么解锁...
  9. 10.高光反射Blinn
  10. 电脑定时清理微信数据