unity 射线检测真机失效_用Unity的RaycastCommand实现子弹的碰撞检测碰到的大坑

本文讲述了在Unity中使用RaycastCommand实现子弹碰撞检测遇到的问题,即批处理的射线检测只能检测一次碰撞。开发者通过调整代码,记录友军碰撞距离来解决光束穿透敌人未检测到的bug。此外,还分享了制作防空炮效果的小技巧,利用光束和Shader模拟快速且断续的子弹效果。

首先放个视频来展示一下《星之海的阿斯特莉娅》最新的开发进度吧:加入了防空系统,可以拦截敌人的导弹

[[https://www.bilibili.com/video/BV1i541167BY/]](假装这里有视频,b站换成bv号了,这里好像还不支持)

然后来说说我在游戏中是如何实现子弹的碰撞检测吧。这部分其实是很早以前就写好的系统,只不过最近调试又发现了bug,而且这个bug的原因我实在是不吐不快。

首先要在Unity里实现子弹的碰撞检测,最直接的方法当然就是使用碰撞体了。但是这样也有一些可能缺点,比如弹速太快的话可能会穿墙啊,刚体数量太多消耗性能啊,处理不好Layer和是否Trigger的选取导致子弹发射时跟玩家的单位发生碰撞产生奇怪的物理效果等等。我希望子弹尽量简单一些,只检测碰撞,不需要物理效果,于是选择了Raycast的方法。然后在搜索Unity手册的过程中发现了这个:

RaycastCommand

一看描述:schedule一批射线检测,并行执行。这不是太好了吗,Unity性能瓶颈就在于单线程,而这个功能能把射线检测放到多线程去执行,那肯定有益于提升性能啊,那就用吧。

写一个BulletManager类,其中每帧更新时执行如下代码:bullets.RemoveAll((x) => (x == null || x.destroyed));//先清理一下子弹数组,把已经不存在的子弹去掉

//把每个子弹的RaycastCommand放进一个数组

var results1 = new NativeArray(bullets.Count, Allocator.TempJob);

var commands1 = new NativeArray(bullets.Count, Allocator.TempJob);

for(int i = 0; i < bullets.Count; i++)

{

commands1[i] = bullets[i].getRaycastCommand()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值