遇到的一个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 的版本中为了弄明白这个配 ...
随机推荐
- 文档驱动开发模式在 AIMS 中的应用与实践
摘要:程序员常会说:我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有一个很老的梗: 我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有这种想法的程序员应该算是一个老鸟了,对于大多 ...
- SICP 课程总结 & 复习
SICP 课程总结 & 复习 小作文 有赖于那个终极的.伟大的.命定的教务系统,我选上了这门课:SICP,Structure and Interpret of Computer Program ...
- Head First 设计模式 —— 05. 单例模式
全局变量的缺点 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象 P170 和 JVM 实现有关,有些 JVM 的实现是:在用到的时候才创建对象 思考题 Choc-O-Holic 公司使 ...
- 风炫安全WEB安全学习第二十七节课 XSS的防御措施
风炫安全WEB安全学习第二十七节课 XSS的防御措施 XSS防御措施 总的原则 控制好输入/输出 过滤:根据业务需求进行过滤,对email,手机号码这样的输入框进行验证. 转义:所有输出到前端的数据都 ...
- JS 字符串比较"=="与"==="区别
最近课程油js的课程,课后习题有道关于下面 1 类似的一道题,叫比较然后判断结果,最开始看了网上的知识点,还是有点不太懂,个人感觉模模糊糊的(当然我自己菜,是正常的),就用依稀还记得的java对象与引 ...
- 配置Oracle数据库和监听随Linux系统自启动【转】
配置Oracle数据库和监听随Linux系统自启动 在某些情况下需要在Linux操作系统上提供一种无人值守的随机启动Oracle的功能,目的也许仅仅是为了帮助那些对Oracle细节非常不关心 ...
- maven 报的一堆错
今天初学maven,刚开始下载的是Apache-maven-3.6.2然后配置运行一个servlet,但是在pom.xml中写jar包坐标时一直报错显示红色,本地仓库和官网上的中央仓库都试过了就是依赖 ...
- Java 使用URL类通过url下载网络资源
主要用到的类 地址类: URL http类: HttpURLConnection 输入流: InputStream 输出流: FileOutputStream 上代码 package com.demo ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- [翻译]Azure 网关迁移至 .NET Core 3.1 性能提升一倍
原文:[Azure Active Directory's gateway is on .NET Core 3.1!] Azure Active Directory 的网关服务是一个反向代理,它为构成 ...