Unity小游戏——武士和怪物的碰撞检测

简介: Unity小游戏——武士和怪物的碰撞检测

摘要:摁下鼠标后武士将挥刀迎击,如果能成功砍到,怪物将四处飞去。不过如果没有砍倒怪物却触到了它,游戏则结束。为了实现这种功能,需要检验武士和怪物之间的冲突,也就是所谓的碰撞检测处理。

在很多游戏中,碰撞检测是非常重要的一环,不过在程序处理方面往往是比较麻烦的。但是在Unity中,只需设定好形状就可以进行碰撞检测的计算


一、分别对各个怪物进行碰撞检测时的问题

首先我们尝试对武士采用立方体,对怪物采用球体来执行碰撞检测。角色之间的碰撞检测,经常采用这种粗略的几何形状来进行。这样做的好处是相较于严格的几何形状,计算量会少很多。而且对于大部分游戏而言,这样的做法都能得到比较逼真的结果。

一般来说,球体的计算量更小。因为游戏中会出现大量的怪物,所以我们选择了计算量尽可能小的球体作为检测形状。

设定好形状之后,就可以用Unity来执行碰撞检测的计算。然后再实现碰撞后武士的行为似乎就大功告成了。不过事实上等游戏运行起来以后,会发现还存在很多问题。

1、一个很大的问题就是,武士会绕开怪物前进的问题

1.跳起来越过

2.从一旁越过

这是因为怪物的碰撞检测形状比武士的小很多。在Unity的碰撞处理中,为了使对象在发生碰撞后仍可以按照原来的前进方向移动,对碰撞对象加入了滑动之类的处理。

让碰撞后的对象进行滑动,多数情况下都会使游戏玩起来更简单自然,不过在我们的这个游戏中却带来了危害。

2、另外还有一个问题是,攻击的难度将加大。

点击鼠标按键后武士开始挥舞砍刀。攻击检测将伴随着这个攻击动作进行。和怪物的碰撞检测相似,我们也是用球体来进行检测。

虽然用于攻击检测的球体尺寸够大,不过从武士的中心位置往内或者往外偏移的地方有可能仍位于攻击范围之外。这样就会出现看起来好像攻击成功了但其实并未成功的情况。

针对这个问题,试着改变碰撞检测的形状及其尺寸也是一种解决方法。不过怪物自身的尺寸本来就很小,如果加大的话又将出现另外一个极端,即“看起来没有击中,结果却集中了”的情况可能会增多。

于是就需要尝试其他的解决办法,如下。

二、把怪物编成小组

游戏中的怪物总是扎堆出现,同一批次的怪物彼此之间比较密集,另外武士总是沿着直线前进,因此即使把同一批怪物编成一个小组来处理好像也没有问题。

于是我们用OniGroup对象把怪物集合起来,将怪物作为它的子元素来处理。碰撞检测也改为对OniGroup对象整体进行。

怪物小组的碰撞家安测使用立方体,尺寸和武士的碰撞检测所用的立方体大抵相同。这样设置以后,武士就不能再越过怪物或者从一侧绕过怪物了。

另外,假设OniGroup检测大奥来自武士的攻击后,作为子元素的所有怪物都将受到攻击。这样一来,前面提到的因为怪物的位置稍有差异就导致攻击不成功的情况就不会再有了。

小结

Unity中允许直接使用模型的形状来进行碰撞检测。不过很多游戏中都采用粗略的形状,而且也能达到很好的效果。特别是那些尺寸比其他角色小很多的角色以及大量对象一起移动的情况下,把它们集中归为一个小组做碰撞检测是很好的办法。


相关文章
|
10天前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
11天前
|
图形学
unity 扇形范围检测目标
本文介绍了两种实现扇形范围检测的方法。第一种方法通过计算目标点与技能释放者之间的距离和夹角,判断目标是否在指定的扇形范围内。代码主要利用了`Vector3.Distance`和`Vector3.Dot`进行距离和角度的计算。 第二种方法则使用摄像机射线检测,分为两个脚本:一个挂载在摄像机上,负责发射多条射线并检测碰撞对象;另一个挂载在目标物体上,处理被发现后的逻辑。摄像机脚本通过`Physics.Raycast`检测敌人或障碍物,并调用目标物体的响应函数。该方法适用于更复杂的场景,如视野检测和敌人发现机制。
|
8月前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
286 0
|
6月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
337 6
|
6月前
|
图形学
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
|
图形学
Unity小游戏——迷你拼图
Unity小游戏——迷你拼图
308 1
|
图形学
Unity小游戏——使被砍中的怪物四处飞散
Unity小游戏——使被砍中的怪物四处飞散
113 1
|
图形学
unity小游戏——得分高低的判定
unity小游戏——得分高低的判定
|
9月前
|
图形学
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
|
6月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
557 5