遇到的一个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 的版本中为了弄明白这个配 ...
随机推荐
- oracle 客户端与服务器端字符集原理(转自totozlj)
1.环境假设: 名词解释:应用程序页面即用户在浏览器中看到的页面,一般程序员在写页面的时候都会在页面中设置编码,这个编码也即是数据在浏览器到web服务器间传输的编码,如果不设置则默认iso-8859的 ...
- apply 和 call的用法、区别
1.JavaScript中函数是对象的方法,如果一个函数不是js对象的方法那一定是全局对象的函数,每个函数的对象都有apply和call方法,即每个对象都有call and apply apply:调 ...
- LeetCode 长度最小的子数组
题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0. 思路: 非常明显用滑动窗口处 ...
- CentOS7 普通用户绕过root登录
正常环境中我们的服务器都会使用一个普通用户跳转到root进行操作,如果root用户的密码不记得只知道普通用户密码,设备又不方便进行开关机破密码时,我们就可以用到以下方法登陆设备. pkexec : ...
- 真的,kafka 入门看这一篇准没错!
什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统 以容错的方式存储记录流 实时记录流 Kafka 的应用 作为消息 ...
- 学习rac管理
文章转自:http://blog.itpub.net/7728585/viewspace-752185/ crsctl query crs activeversion 查看版本 ocrconfig - ...
- 【CRS】vipca最后一步执行报错CRS-0215
当我们在安装Clusterware 的时候, 需要在第二节点上vipca , 配置到最后安装的时候, 安装到 75% 左右,报错: CRS-0215 : Could not start res ...
- python3.8.1安装cx_Freeze
按照官网的提示命令python -m pip install cx_Freeze --upgrade安装,不成功,报了一个错误,说cx_Freeze找不到需要的版本,还有一些警告说PIP需要升级,没理 ...
- oracle ORA-00060死锁查询、表空间扩容
--查看被锁住的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...
- Mybatis入门Demo(单表的增删改查)
1.Mybatis 什么是Mybatis: mybatis是一个持久层框架,用java编写的 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动.创建连接等繁杂过程 ...