遇到的一个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 的版本中为了弄明白这个配 ...
随机推荐
- 记一次SqlServer大表查询语句优化和执行计划分析
数据库: sqlserver2008r2 表: device_data 数据量:2000w行左右 表结构 CREATE TABLE [dbo].[device_data]( [Id] [int] ID ...
- Windows server 安装远程桌面及破解120天时间限制授权
一.问题描述 Windows Server系列服务器默认远程桌面连接数是2个用户(本文适用于所有Windows Server系列服务器),如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可 ...
- [ABP教程]第七章 作者:数据库集成
Web开发教程7 作者:数据库集成 关于此教程 在这个教程系列中,你将要构建一个基于ABP框架的应用程序 Acme.BookStore.这个应用程序被用于甘丽图书页面机器作者.它将用以下开发技术: E ...
- htaccess在线生成工具用法大全 (转)
对于一个不懂程序的SEOER来做,更改代码方面是一件非常苦难的事情,当我们遇到301转向以及404页面的制作问题时,经常会困恼我们,这里我提供一个htaccess在线生成工具,这里有404页面链接生成 ...
- Redis核心原理-简单动态字符串SDS
SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...
- 【Java基础】面向对象下
面向对象下 这一章主要涉及其他关键字,包括 this.super.static.final.abstract.interface.package.import 等. static 在 Java 类中, ...
- 【Redis】Redis基础 - Redis安装启动测试
Redis基本 - 安装 文章目录 Redis基本 - 安装 Linux下安装Redis Docker 方式 Github 源码编译方式 直接安装方式 Windows下Redis安装 记录 - Red ...
- Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入门
关于Jenkins的使用及安装,上一篇文章我已经介绍过了,Windows+.NetCore+git+IIS在Jenkins上的自动化部署入门.这篇主要是在jenkins如何安装SVN和MSBuild. ...
- SAP FTP FOR ABAP programing
近来忙的不可开交,忙的一塌糊涂,呵呵,今天怀揣愧疚之心,上来分享博文一篇,算是对自己的一点安慰. 首先在SAP系统中提供了很多的FTP示例程序,如下: RSFTP001 SAPFT ...
- js模仿京东首页的倒计时功能
模仿京东首页的倒计时 我们学习了定时器,可以用定时器做一个倒计时,于是我模仿了京东首页倒计时. 先看看京东首页的倒计时. 思路: 如何倒计时? 给一个未来的时间.然后计算未来时间到现在的时间戳. 用定 ...