Unity 2019 射线检测失效

  • 之前在做毕设的一个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之前都是默认勾选上的…欢迎探讨交流。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值