Unity3D-游戏中的技能碰撞检测
在游戏战斗中,我们会用到各种各样的碰撞检测,来判断是否打中了目标
比如扇形检测/圆形检测

还有矩形检测,王者荣耀里后羿的大招就是一个很长的矩形碰撞体

这些在Unity3D引擎中其实都封装好了一些Collider组件去检测碰撞,但是我最近写帧同步算法的时候,发现U3D中的碰撞算法执行顺序不可控,会导致不同步的现象,所以就只好苦逼的自己写碰撞检测算法了。
我们游戏是一个3D动作类游戏,大概的碰撞可以分为几类
- 圆柱体(把人/怪物的碰撞设定位一个圆柱体,U3D里是胶囊体,是为了解决一些边缘精度问题,但是我们游戏里的话圆柱就够用了)
- 球体
- 立方体
需要检测的碰撞有
1.检测圆柱体跟球体的碰撞
2.立方体跟圆柱体的碰撞
具体实现:
1.球体跟圆柱体碰撞检测
1 /// <summary>
2 /// 检测球体跟圆柱体碰撞
3 /// </summary>
4 /// <param name="x1">球体X</param>
5 /// <param name="y1">球体Y</param>
6 /// <param name="z1">球体Z</param>
7 /// <param name="r1">球体半径</param>
8 /// <param name="x2">圆柱体X</param>
9 /// <param name="y2">圆柱体Y</param>
10 /// <param name="z2">圆柱体Z</param>
11 /// <param name="r2">圆柱半径</param>
12 /// <param name="h2">圆柱体高度</param>
13 public static bool CheckCircleAndCylinderCollider(float x1, float y1, float z1, float r1,
14 float x2, float y2, float z2, float r2, float h2)
15 {
16 float dx = x2 - x1;
17 float dy = y2 - y1;
18 float dz = z2 - z1;
19 float disSqua = (dx * dx) + (dz * dz);
20 float rSqua = (r1 + r2) * (r1 + r2);
21 bool heightCheck = Math.Abs(y1 - y2) < r1 + h2 / 2;
22 return heightCheck && disSqua < rSqua;
23 }
1.检测两个圆有没有相交
2.检测Y轴的距离是否小于球半径+圆柱体高度的一半
这里是把球体也当成了圆柱体进行检测,好处就是:效率高。 缺点是:不精确,没有考虑X,Z轴的旋转
但由于我们游戏中圆柱体不会有X,Z轴的旋转,所以这样的做法是最高效的
精确性问题:把圆柱体变成胶囊体,两端用两个球体来计算检测,这样会更精确,同时性能也会降低
2.立方体跟圆柱体的碰撞
这里先把问题简化成矩形跟圆形的碰撞检测

计算方法是先找到矩形上离圆形最短距离u,然后再比较u是否小于圆形的半径r
1. 首先利用绝对值把 p - c 转移到第一象限,下图显示不同象限的圆心也能映射至第一象限,这不影响相交测试的结果:

2. 然后,把 v 减去 h,负数的分量设置为0,就得到圆心与矩形最短距离的矢量 u。下图展示了4种情况,红色的u是结果。

最后要比较u和r的长度,若距离少于r,则两者相交。可以只求u的长度平方是否小于r的平方
具体做法可以参考这里:https://www.zhihu.com/question/24251545
对于AABB包围盒,这样就已经可以检测碰撞了,但是如果矩形是旋转的OBB包围盒呢?
我这里是实现了一个OBB的包围盒类,记录了坐标,角度,碰撞检测的时候先把圆的角度旋转到OBB的坐标系里
利用旋转公式:
x2 = x * Mathf.Cos(rad) - z * Mathf.Sin(rad); z2= x * Mathf.Sin(rad) + z * Mathf.Cos(rad);
然后再用那篇文章里说的方式计算矩形跟圆是否相交
最后再通过两者 Y轴的距离 < (圆柱体高度+立方体的高度)/2 ,如果小于则相交
这种方法的优势:效率高,而且精确
缺点是这个3D的OBB只能沿Y轴旋转,不过也够用了
如果像王者荣耀类型的游戏,感觉不需要扩展到3D,2D检测应该就够用了
Unity3D-游戏中的技能碰撞检测的更多相关文章
- Unity3d 游戏中集成Firebase 统计和Admob广告最新中文教程
之前写过俩相关的教程,最近发现插件官方更新了不少内容,所以也更新一篇Firebase Admob Unity3d插件的教程,希望能帮到大家. Firebase Admob Unity3d插件是一个Un ...
- 在unity3d游戏中添加中文语音控制
最近打算尝试一下OLAMI在游戏中应用的可能性,这里做一下记录. unity官方教程中的几个项目很精简,但看起来很不错,里面有全套的资源.最后我选择了tanks-tutorial来做这个实验. 下载和 ...
- Unity3d游戏中自定义贝塞尔曲线编辑器[转]
关于贝塞尔曲线曲线我们再前面的文章提到过<Unity 教程之-在Unity3d中使用贝塞尔曲线>,那么本篇文章我们来深入学习下,并自定义实现贝塞尔曲线编辑器,贝塞尔曲线是最基本的曲线,一般 ...
- NDk编译opencv for Android,并引用在Unity3d游戏中的一般步骤
本文使用:Unity3d + opencv + Android Unity3d中可以调用opencv 编译好的.so 动态库,在生成Android apk时可以正常运行. 因为Android系统是 ...
- Unity3d游戏中添加移动MM支付SDK问题处理
原地址:http://www.tuicool.com/articles/I73QFb 由于移动mm的SDK将部分资源文件放在jar包中,导致Unity无法识别,提示failed to find res ...
- Unity3d 游戏中的实时降噪-对Square Enix文档的研究与实现
看到SE的技术文档关于降噪的决定研究一下,本次试验场景: 文章中提到了3中主要滤波方法,最后一种方法又有三种方式分别为Conventional geometry-aware filtering,Dist ...
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
- Unity3D 2D游戏中寻径算法的一些解决思路
需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...
- [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在<仙剑奇侠传>.<古剑奇谭>等游戏中,常常须要玩家在一个3D场景中 ...
随机推荐
- javaWeb学习总结(10)- Filter(过滤器)常见应用(3)
一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 package me.gacl.web.filter; import java.io. ...
- Javascript版-显示相应图片的详细信息
Hi All, 分享一个通过JS来显示相应图片的详细信息. 需求:进入页面时,动态加载图片信息:当鼠标移动到某一图片上时,则显示该图片的大图片并显示相应说明信息:当鼠标移开图片时,清除新创建的元素. ...
- Java的必备开发工具
身为一个Java开发的爱好者,你不得不承认需要安装以下软件 NO.1 Java开发工具包 Java JDK 可以说这个工具包不得不安装,因为这个工具包是开发Java程序的核心! Java JDK工具包 ...
- linux下部署php项目-Apache、php、mysql关联
linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...
- Python3实现简单的http server
前端的开发的html给我们的时候,由于内部有一些ajax请求的.json的数据,需要在一个web server中查看,每次放到http服务器太麻烦.还是直接用python造一个最方便. 最简单的,直接 ...
- windows手动搭建Kotlin命令行环境
kotlin官网:https://kotlinlang.org 我们可以从GitHub下载.目前最新版本是1.1.2-5 https://github.com/JetBrains/kotlin/rel ...
- Analog/digital converter (ADC)
1.ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters. 所谓successive appro ...
- [0] C# 扩展方法(Extension Method)
有时有这样的情况,有一个类,你不能修改它,但你又想对它扩展(添加一个方法),这个时候就可以用到扩展方法了.请看下面的例子: using System;using System.Collections. ...
- Swift json字典转模型 项目记录
背景 最近项目开始转用Swift3开发,由于Swift中json(字典)转模型的选择方案较多,笔者最开始选择了HandyJSON的方案,在使用一段时间后发现当要进行某个字段取值使用时需要进行各种的转化 ...
- Blockly编程:用Scratch制作游戏愤怒的小牛(小鸟)
愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...