• 之前在做毕设的一个FPS游戏时,遇到了使用射线检测失效的情况,特此记录以下。

前因

在FPS游戏中,对于子弹的发射主要通过两种方式来实现。
一种可以通过实例化子弹的GameObject对其施加物理效果从而达到发射的目的。在玩过的绝地求生中,可以清楚看到子弹的发射轨迹,这里应该就是使用的这种方法。但是使用碰撞检测的问题就是如果一方速度过快撞击到另一碰撞体会有直接穿透的可能性存在(面试题),还有就是性能的消耗比较大。
而另一种则是射线检测,通过发射出一条射线来模拟子弹的运动轨迹,这种方法相较于前者而言更节省性能,计算量下来了,但是真实性(物理轨迹)却缺失了。

我在FPS游戏中就使用了最简单的射线检测来进行子弹的发射,附上基础代码

void BulletFired()
{// 子弹减少weaponManager.GetCurrentSelectedWeapon().SubtractBullet();float shootDistance = weaponManager.GetCurrentSelectedWeapon().shootDistance;RaycastHit hit;bool isHit = Physics.Raycast(mainCamera.transform.position, mainCamera.transform.forward, out hit, shootDistance, LayerMask.GetMask(LayerName.Enemy));if(isHit){float damage = weaponManager.GetCurrentSelectedWeapon().damage;hit.transform.GetComponent<HealthScript>().ApplyDamage(damage);}
}

代码其实很容易阅读,主要就是对于Physics.Raycast()射线检测方法的使用,可是在游戏测试时,时常会失效。比如有的时候会触发两次,之后再也没有成功过。

解决方案

起初,我通过Debug.DrawLine()方法在Scene窗口下绘制射线来观察是不是射线的问题,结果射线是穿透敌人的,排除该种情况。
接着我去查看了Physics.Raycast()的官网API解释,看是否是自己的参数设置有问题,经过一一排查测试,也都没有解决。

最终我想了想是否是Unity自身的Physics中设置问题,所以去查询了相关资料找到了问题所在,如下图

默认情况下 Auto Sync Transforms是未被勾选上的。(从Unity 2018.2开始,Physics.autoSyncTransforms将默认设为"False".)

这个解释起来就是,如果禁用AutoSyncTransforms,移动碰撞体,然后调用光线投射,使光线的方向为碰撞体新位置的话,光线投射可能不会击中碰撞体。这是因为光线投射会作用于物理场景的上一次更新版本,而那时物理场景还没有使用碰撞体的新位置来更新。勾选此选项会对性能有一定的损失,这里我没做过测试,请根据实际情况进行勾选。

附上Unity官网解释 Physics.autoSyncTransforms
还有查询到的Unity平台对其中的一些解释性能优化

结语

Physics.autoSyncTransforms 主要是针对物理场景中是否能及时更新物体Transform中数据情况,而在使用射线检测时碰巧遇到了这个奇奇怪怪的bug。花了好长时间找到了这个Bug…因为使用的Unity 2019的版本,好像2018之前都是默认勾选上的…欢迎探讨交流。

Unity 2019 射线检测失效相关推荐

  1. 直播笔记 | Unity中射线检测详解

    本文首发于洪流学堂微信公众号. 洪流学堂,学Unity快人几步 你好,我是郑洪智,你的技术探路者. 这周三我们直播剖析了Unity中射线检测的功能,以下是直播内容精华部分笔记. 完整录播:https: ...

  2. unity通关射线检测实现3d模型自适应地形起伏

    unity通关射线检测实现3d模型自适应地形起伏 该方法是一种取巧的方式,不通关人物碰撞器什么的,很简单的一种思路 通过在模型的位置每次移动时向下发射一条射线检测,检测到地面碰撞器时,获取碰撞点的坐标 ...

  3. 【Unity】射线检测

    射线检测,发射一条射线检测射线是否碰撞到物体,同时可以获取物体的相关属性 射线可以是有长度的,也可以是不限长度的 射线检测的条件,物体必须有碰撞器 实现射线检测的简单代码,将脚本挂在物体上,当物体前方 ...

  4. Unity 常用射线检测方法

    1.普通射线检测(一般用于检测某一个物体) Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);Debug.DrawRay(ray. ...

  5. Unity中射线检测实现瞄准等功能——Physics.Raycast

    重载方法1: 1.需要传入Ray射线.  2.创建一个Ray射线并传参,注意射线可能与自己发生碰撞,从而Debug结果一直True,需要设置射线起点为自身之外. 重载方法中其他参数含义: origin ...

  6. Unity - Ray射线检测

    一:射线 Ray射线 定义:射线是一条从原点出发,沿某一方向运动的无限直线. //创建一条初始位置为startPos,方向为dir的一条射线 Ray ray = new Ray (startPos, ...

  7. Unity(设置射线检测对象)

    打开方式 Edit        ➡        Project Settings        ➡        Physics Queries Hit Triggers(开启触碰器检测)

  8. Unity射线检测的用法总结

    RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  9. 10.Unity2D 横版 简单AI 之 敌人随机移动+自动巡逻+障碍物跳跃+悬崖处转身+射线检测

    总目录 9.Unity2D 简单AI 之 敌人跳跃条件优化+自动范围内检测敌人发起攻击(索敌)+对象池优化+主角受伤死亡_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客Unity2D 简单AI 之 ...

最新文章

  1. Vue实现左右菜单联动实现
  2. return *this和return this的区别
  3. bzoj3289 mato的文件管理
  4. PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法
  5. VC中宽字符串换行(WCHAR字符串换行)
  6. Java高级开发工程师面试考纲
  7. 用于最优控制的简单软件
  8. TensorFlow2.0:单层感知机梯度计算
  9. mysql创建视图失败_mysql无法创建视图怎么办
  10. 录制课程视频用什么软件?微课录屏软件等你来选!
  11. 卸载WPS后office文档图标不能正常显示和WPS网盘图标无法删除
  12. 卡拉赞服务器延迟,卡拉赞开荒详细功略(前门)
  13. 《数据库系统概论》知识整理
  14. 如何更新微软的html,如何升级微软2018 Windows 10更新四月正式版17134系统?
  15. arm920t中断系统详解
  16. AOP的两种动态代理机制
  17. excel组合汇总_Excel汇总20140224
  18. html手机和电脑一致,浏览器兼容性(手机、电脑。js、html、css)
  19. android工具类怎么写,用kotlin写了一些android常用的一些工具类
  20. 家庭媒体中心解决方案(三、 群晖系列nas基本功能使用指南篇1)

热门文章

  1. ECharts周围空白的地方太多了,如何解决
  2. 软件工程硕士是否值得读?
  3. · AI 计算图像识别在影像监控和安全监控中的 16 大应用
  4. Parallels Desktop安装Windows11
  5. Oracle(11g)安装
  6. 基于B/S的大学毕业生就业信息管理系统
  7. java面向对象编程基础
  8. 计算机中的图形(Graphic)和图像(Image)
  9. 说一个恐怖故事:我的另一半是程序员!惊了~
  10. 数字音频总线A2B开发详解二十三:ADAU1701做的功放板的音效(26个例程)(第三部分)