遇到的一个bug
/// <summary>
/// 检测玩家是否在机器人的球形碰撞体内,这个碰撞体是机器人的侦测范围,玩家在内部会进行视野检测和声音检测
/// </summary>
private void OnTriggerStay(Collider other)
{
//视野检测
//玩家在碰撞体中且玩家在机器人视角的扇形范围内则机器人发现了玩家
if(other.tag == Tags.player && Vector3.Angle(transform.forward,other.transform.position - transform.position) <= (fieldOfView * 0.5f))
{
playerInSight = true;
//调用GameManager脚本的SeePlayer方法触发警报
GameManager._instance.SeePlayer(other.transform);
print(count + ":" + "if");
return;
}
else
{
playerInSight = false;
print(count + ":" + "else");
}
count++;
}
使用计数器count记录进入OntriggerStay方法的次数,在其中有一段if和else代码,执行了这段代码就会打印计数和if/else,实际执行的结果

可以看到,在同样的情况下,偶尔进入if代码块,大部分情况下进入else代码块,甚至第1260次同时进入if和else代码块(这怎么可能呢?)
解决:将if的两个同时成立的条件分两次判定
private void OnTriggerStay(Collider other)
{
//视野检测
//玩家在碰撞体中且玩家在机器人视角的扇形范围内则机器人发现了玩家
if(other.tag == Tags.player)
{
if(Vector3.Angle(transform.forward, other.transform.position - transform.position) <= (fieldOfView * 0.5f))
{
playerInSight = true;
//调用GameManager脚本的SeePlayer方法触发警报
GameManager._instance.SeePlayer(other.transform);
print(count + ":" + "if");
return;
}
else
{
playerInSight = false;
print(count + ":" + "else");
}
count++;
}
}
执行结果:

结果完全没有问题,bug原因是else代码写错了地方,修改前后的判断过程完全不一样,但是if和else同时执行的问题到底是怎么回事呢?
解答:想清楚了,因为我添加了return方法,所以执行完if代码块后count++没来得及执行就直接返回了,导致if执行后下一次的else的count和这一次相同。
细节梳理:这里的ontriggerstay用来检测机器人是否看见了玩家,所以trigger碰撞器的范围就是机器人的视野范围,因此trigger碰撞器较大,因此同一时刻内碰撞器内有多个非玩家碰撞体。按照原来的代码执行,每一个碰撞体都会进行一次判断,但是标签不是player,因此即使玩家在视野范围内满足条件,也只会触发一次if,而其他碰撞体都会触发else,导致if中playerinsight瞬间被修改为true后又被修改为false,呈现出来的效果就是这个值好像一直为false,无法达到检测的效果。
总结:进行有if有else的判断的时候一个if可以少判断几个条件,分多次判断,不然容易出现问题,这里修改前后的else意义就不一样,但是开始写的时候没有察觉。
遇到的一个bug的更多相关文章
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- MySQL关于exists的一个bug
今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...
- 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG
这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...
- 标准模板库(STL)的一个 bug
今天敲代码的时候遇到 STL 的一个 bug,与 C++ 的类中的 const 成员变量有关.什么,明明提供了默认的构造函数和复制构造函数,竟然还要类提供赋值运算符重载.怎么会这样? 测试代码 Tes ...
- 是uibutton跟tableviewcell同步使用一个bug
这个问题是uibutton跟tableviewcell同步使用一个bug,不关delay一点毛事,证据就是点击事件没问题,so,搜到一个方法解决了这个问题.uibutton分类symbian2+ios ...
- 在chrome下-webkit-box布局的一个bug
chrome,也就是webkit内核下作的检测, chrome版本是40, -webkit-box这种布局在移动端用的比较多,主要是因为pc端的浏览器内核参差不齐. 因为在写HTML的时候看上了-we ...
- 关于MySQL count(distinct) 逻辑的一个bug【转】
本文来自:http://dinglin.iteye.com/blog/1976026#comments 背景 客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用cou ...
- 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug
开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...
随机推荐
- 解决phpmyadmin上传文件大小限制的配置方法
解决phpmyadmin上传文件大小限制的配置方法 phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要phpmya ...
- js 判断用户是手机端还是电脑端访问
通过userAgent 判断,网页可以直接使用 navigation对象 node端 可以通过请求头的 ctx.request.header['user-agent'] const browser = ...
- 【Flutter】功能型组件之数据共享
前言 InheritedWidget提供了一种数据在widget树中从上到下传递.共享的方式,例如在应用的根widget中通过InheritedWidget共享了一个数据,那么便可以在子widge ...
- Invalid bound statement (not found): com.xxx.xxx.dao.ShopMapper.insertShop
mybatis在编写完SQL,进行测试的时候出现了错误,显示 org.apache.ibatis.binding.BindingException: Invalid bound statement ( ...
- mysql中的基本注入函数
1. 常见数据库注入函数: MYSQL: and length((user))>10 ACCESS: and (select count() from MSysAccessObject)> ...
- 爬虫学习(三)Chrome浏览器使用
一.新建隐身窗口 在打开隐身窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,不携带cookie.这样就能够尽可能的理解代码请求某个网站的结果:除非数据是通过js加载出来 ...
- CentOS系统内核升级(在线 离线)
为什么要升级内核? Docker 在CentOS系统中需要安装在 CentOS 7 64 位的平台,并且内核版本不低于 3.10:CentOS 7.× 满足要求的最低内核版本要求,但由于 CentOS ...
- 自监督SOTA框架 | BYOL(优雅而简洁) | 2020
文章原创自微信公众号「机器学习炼丹术」 作者:炼丹兄 联系方式:微信cyx645016617 本篇文章主要讲解两个无监督2020年比较新比较火的论文: 论文名称:"Bootstrap You ...
- git 分支合并时如何忽略某个文件
[转]git 分支合并时如何忽略某个文件 - 神奇的旋风 - 博客园 https://www.cnblogs.com/xuan52rock/p/13268872.html Git - git-merg ...
- HA工作机制
HA工作机制 HA:高可用(7*24小时不中断服务) 主要的HA是针对集群的master节点的,即namenode和resourcemanager,毕竟DataNode挂掉之后影响 不是特别大,重启就 ...