想要实现的效果如下:


希望Player在踩在Enemy上的时候能够随着Enemy一起上下飞动。

做出的效果如下:


当Player没有跳到Enemy上时,Enemy可以正常地上下飞动,而当Player跳到Enemy上之后,Enemy可以载着Player上升一小段距离,但是之后会一直下落。

下面是实现失败的代码:

void Movement(){if(flydown)//给Enemy设置初始方向为向下{rb.velocity = new Vector2(rb.velocity.x, -flyforce);//给Enemy一个向下飞的速度if (transform.position.y < downy)//当Enemy已经飞到下方标记点的位置以下时{rb.velocity = new Vector2(rb.velocity.x, flyforce);//让Enemy的速度向上flydown = false;//改变Enemy的方向向上}}else{if (transform.position.y > upy)//当Enemy已经飞到下方标记点的位置以下时{rb.velocity = new Vector2(rb.velocity.x, -flyforce);//让Enemy的速度向下flydown = true;//改变Enemy的方向向下}}}

经过问题排除,修改之后的代码如下:

void Movement(){if(flydown)//Enemy的方向向下{rb.velocity = new Vector2(rb.velocity.x, -flyforce);//让Enemy的速度向下if (transform.position.y < downy)//当Enemy已经飞到下方标记点的位置以下时{flydown = false;//改变Enemy的方向向上}}else//Enemy的方向向上{rb.velocity = new Vector2(rb.velocity.x, flyforce);//让Enemy的速度向上if (transform.position.y > upy)//当Enemy已经飞到下方标记点的位置以下时{flydown = true;//改变Enemy的方向向下}}}

将两段代码放在一起进行比较:


可以发现,成功代码的变化为:将黄色代码进行了位置移动,并将橙色代码进行了删除。

分别对两段代码的结构进行分析:

先来看失败代码:


由图可知,该代码可以分成3个部分:”初始条件预设“、”触碰下方标记点操作“、”触碰上方标记点操作“。但是,“初始条件预设”部分与“其他两部分又用ifelse嵌套混合到了一起,使得3个部分的结构变得混乱,不明了。

再来看成功代码:


该代码可以分成两部分,每个部分分别执行Enemy方向向下和Enemy向上两种情况需要执行的一系列操作,并在最后进行Enemy方向的改变,使代码运行在两个情况中进行切换,完成Enemy的上下飞行运动。

代码小白悟出了一个道理:写代码时逻辑结构的清晰非常重要。

接下来,来分析第一段代码会失败的原因。

对第一段代码,会发现,它其实有两种情况:第一是在Player没有跳到Enemy上时,Enemy是可以正常地上下飞行的;第二是在Player跳到Enemy上之后,Enemy可以向上飞一段时间,但是后面会一直下落。

先来看第一种情况,为什么Player没有跳到Enemy上的时候,Enemy可以正常运动:

在Player没有跳到Enemy上时,Enemy的运动不用考虑来自Player的碰撞和质量。代码从if(flydown);开始执行,因为flydown预设的值为true,因此,if条件成立,进入if命令,由于开始时,Enemy没有给初始速度,所以,rb.velocity = new Vector2(rb.velocity.x, -flyforce);先给它一个向下的速度,让它向下运动,当Enemy向下运动一段距离,其位置超过下方标记点时,需要使其反向向上运动,因此此时给Enemy一个向上的速度rb.velocity = new Vector2(rb.velocity.x, flyforce);,同时改变flydown的值为false,使其跳出if命令,进入else命令。由于前面在if中rb.velocity = new Vector2(rb.velocity.x, flyforce);给了Enemy一个向上的速度,所以,在没有碰撞和其他质量加载的情况下,Enemy可以一直保持向上的速度,到达上方标记点,然后执行else中的if语句,同样使其反向向下运动,改变flydown的值为true,从而使其可以回到if命令。

然后来看第二种,Player跳到Enemy上之后,Enemy可以向上飞一段时间,但是后面会一直下落的情况:

如果加上了Player的碰撞和质量在Enemy上,由于在Enemy在第一个if中嵌套的if命令中获得的向上的速度之后立马执行了flydown = false语句,使其跳出了第一个if,进入到了else命令,因此,这个加速只执行了一次,就像火箭加速一样,只在开始的那一瞬间加速了一下,如果火箭没有载重的话,它是可以靠这一瞬间的加速保持上升的,从而可以触碰到上顶点继续执行后面的操作,但是如果火箭有载重的话,很明显,仅靠那一瞬间的加速,可以使火箭上升一段时间,却不足以使火箭继续保持向上的飞行进而触碰到上顶点,这就是为什么Enemy可以载着Player向上飞一段,但是上升一段距离之后又会下落,所以Enemy就永远也触碰不到上方标记点,也就执行不了else中嵌套的if语句来改变flydown的值来跳入第一个if的命令中,结果就是,Enemy载着Player一直下落。

以上就是对第一段代码执行失败的过程和原因分析。

然后在此基础上,来看第二段代码,就会发现,之前提到的将黄色代码进行的移动,正是将给Enemy一个向上速度的代码rb.velocity = new Vector2(rb.velocity.x, flyforce);从第一个if中放到了else中,使其不是只执行一次,而是一直执行,相当于把只给火箭一瞬间加速改成了给火箭一直加速,自然,Enemy即使有Player的载重也可以达到上方标记点,从而执行else中嵌套的if语句,改变运动方向,跳入第一个if中,进行后续的循环。而对于删去的橙色部分代码,由于跳入第一个if中之后,有使Enemy向下加速的命令rb.velocity = new Vector2(rb.velocity.x, -flyforce);,因此else嵌套的if中再重复此命令就是多余的,可以删去。

以上就是在学习Unity做游戏过程中,我遇到的一个Bug以及对它的分析和解决。


一些小感想:

在写这篇文章的之前,虽然自己已经清楚了问题所在,但是在写这篇文章,想要用文字把其中的原因解释和表达清楚时,自己会发现之前对问题的理解还有一些没有考虑到的细节,而在写文章的过程中发现了这些值得注意的细节,同时在写的过程中还有了一些新的启发和收获。

这个过程就有一点像费曼学习法,能够清楚地向别人讲述的知识才是真正弄懂的知识,写这样的一篇文章不仅仅可以为自己学习过程做记录和分享,还可以在写的过程中进行复盘、巩固以及获得新的收获。

希望自己以后有时间能多用这样的方式对一些学习过程中遇到的比较重要的Bug和知识进行这样的梳理,记录在这个专栏里,帮助自己进步,和大家一起分享,欢迎小伙伴们和我交流~

第一次写博客,有写的不好的地方,也欢迎大家指正!O(∩_∩)O

【Bug记录】Plyer踩在Enemy上下落相关推荐

  1. 【BUG记录】记一次游戏越来越卡的BUG

    [BUG记录]记一次游戏越来越卡的BUG U3D的MOBA项目,测试过程中,10分钟以后,游戏帧率开始缓慢下降,约3-5分钟后,由60帧下降到小于10帧,编辑器模式. 打开profiler,看到CPU ...

  2. 分析了 3000 份 Bug 记录,可以发现什么?

    为了进一步了解软件开发团队处理bug的流程,我们随机抽取了过去的两个月中上传到我们数据库中的3000个bug记录...... 作者 | Dan Makarov 译者 | 弯月,责编 | 郭芮 出品 | ...

  3. 简书 android bug记录,记录工作中的Bug

    整理了以前的笔记,把以前遇到的问题记录下来 1.App的首次安装. 问题描述:在我们安装完成一个app时,在安装界面直接点击打开.我们进入了app的首页,这时我们按home键返回桌面,再点击应用图标, ...

  4. Android Studio 项目设计开发bug记录以及未来新技术

    文章目录 项目设计开发bug记录: (1)打包时出错 (2)关闭项目自启动 (3)显示工具栏 (4)怎么导入jar包 (5)导入工程出现异常 (6)run项目出现异常: (7)修改包名 (8)导入项目 ...

  5. 第一天开通博客,记录自己在编程道路上的点点滴滴

    第一天开通博客,第一天写随笔:今年刚毕业,希望能用博客记录自己在编程道路上的点点滴滴,会记录自己在编程过程中遇到的问题及解决办法,也会记录自己的程序人生,分享出来和大家共勉. 希望自己能早日成为一名快 ...

  6. DayDayUp:昨天用微信发朋友圈—发现微信出现一点点Bug记录

    DayDayUp:昨天用微信发朋友圈-发现微信出现一点点Bug记录-屏蔽了该屏蔽的人,但没被屏蔽的人也看不到 目录 遇到微信小bug的前因后果 关于微信 遇到微信小bug的前因后果 博主于昨天23:5 ...

  7. [项目过程中所遇到的各种问题记录]图表篇——asp.net上不错的图表选择—FunsionCharts...

    [项目过程中所遇到的各种问题记录]图表篇--asp.net上不错的图表选择-FunsionCharts 在上一篇文章中我介绍了winforms下的图表控件--MSChart,虽然MSChart同样为我 ...

  8. 【BUG记录】解决Failure to find (pom/jar) in http://xxx.com was cached in the local repository

    [BUG记录]解决Failure to find (pom/jar) in http://xxx.com was cached in the local repository ☠注意:此解决方法仅针对 ...

  9. [调试记录]3288 7.1平台上移植美格 SLM790 4G模块

    [调试记录]3288 7.1平台上移植美格 SLM790 4G模块 一 驱动配置 1.1 PPP 配置 需要配置 Android 内核来支持 PPP 功能,按照以下步骤来配置 PPP 选项 Devic ...

最新文章

  1. github上fork了别人的项目后,再同步更新别人的提交
  2. 列出所有已安装的perl模块
  3. Windows日志及其保护
  4. Django 使用celery任务队列的配置
  5. KVM配置之(3)- 克隆
  6. 我喜欢的设计好的网站列表
  7. qt中的update()
  8. Rxjava+Retrofit+Mvp的使用实例(基于retrofit2.1.0)
  9. 一个小技巧助您减少if语句的状态判断
  10. 1002. 写出这个数 (20)
  11. Vagrant 手册之 Provisioning - 基本用法
  12. 奥鹏19春计算机应用基础,19春西南交《计算机应用基础》在线作业二(答案)-...
  13. Android进阶之路 - 双端交互之传递Base64图片
  14. WOWZA的安装及(VOD+LIVE)简单配置和VLC RTP推流
  15. ARP表项的创建与更新
  16. Android 蓝牙配对、连接和通信
  17. 使用APICloud AVM多端框架开发课程表功能
  18. c9大学计算机系好的大学,C9顶尖高校所有自主招生专业大汇总
  19. 如何使用阿里云创建镜像和实例
  20. android拷机获取内存使用的脚本

热门文章

  1. 使用Mathtype公式编辑器生成CSDN中的数学公式
  2. 录用了一篇 IJPR
  3. 聚类算法评价指标——adjusted Rand index, ARI指数(调整兰德指数)
  4. 2021年11月21日
  5. 机器学习应该准备哪些数学预备知识?
  6. 【毕业设计】危险驾驶行为检测系统(疲劳 抽烟 喝水 玩手机) - opencv python 深度学习
  7. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园百事知系统lt1v4
  8. 学习python,北京尚学堂,第61课到第90课的个人的总结
  9. 实例变量与类变量定义和使用
  10. 利用MT Photos生成的重复文件列表,删除重复文件