在游戏战斗中,我们会用到各种各样的碰撞检测,来判断是否打中了目标

比如扇形检测/圆形检测

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

这些在Unity3D引擎中其实都封装好了一些Collider组件去检测碰撞,但是我最近写帧同步算法的时候,发现U3D中的碰撞算法执行顺序不可控,会导致不同步的现象,所以就只好苦逼的自己写碰撞检测算法了。

我们游戏是一个3D动作类游戏,大概的碰撞可以分为几类

  1. 圆柱体(把人/怪物的碰撞设定位一个圆柱体,U3D里是胶囊体,是为了解决一些边缘精度问题,但是我们游戏里的话圆柱就够用了)
  2. 球体
  3. 立方体

需要检测的碰撞有

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-游戏中的技能碰撞检测的更多相关文章

  1. Unity3d 游戏中集成Firebase 统计和Admob广告最新中文教程

    之前写过俩相关的教程,最近发现插件官方更新了不少内容,所以也更新一篇Firebase Admob Unity3d插件的教程,希望能帮到大家. Firebase Admob Unity3d插件是一个Un ...

  2. 在unity3d游戏中添加中文语音控制

    最近打算尝试一下OLAMI在游戏中应用的可能性,这里做一下记录. unity官方教程中的几个项目很精简,但看起来很不错,里面有全套的资源.最后我选择了tanks-tutorial来做这个实验. 下载和 ...

  3. Unity3d游戏中自定义贝塞尔曲线编辑器[转]

    关于贝塞尔曲线曲线我们再前面的文章提到过<Unity 教程之-在Unity3d中使用贝塞尔曲线>,那么本篇文章我们来深入学习下,并自定义实现贝塞尔曲线编辑器,贝塞尔曲线是最基本的曲线,一般 ...

  4. NDk编译opencv for Android,并引用在Unity3d游戏中的一般步骤

    本文使用:Unity3d + opencv + Android Unity3d中可以调用opencv 编译好的.so 动态库,在生成Android apk时可以正常运行.   因为Android系统是 ...

  5. Unity3d游戏中添加移动MM支付SDK问题处理

    原地址:http://www.tuicool.com/articles/I73QFb 由于移动mm的SDK将部分资源文件放在jar包中,导致Unity无法识别,提示failed to find res ...

  6. Unity3d 游戏中的实时降噪-对Square Enix文档的研究与实现

    看到SE的技术文档关于降噪的决定研究一下,本次试验场景: 文章中提到了3中主要滤波方法,最后一种方法又有三种方式分别为Conventional geometry-aware filtering,Dist ...

  7. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  8. Unity3D 2D游戏中寻径算法的一些解决思路

    需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...

  9. [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在<仙剑奇侠传>.<古剑奇谭>等游戏中,常常须要玩家在一个3D场景中 ...

随机推荐

  1. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  2. VR全景:720全景在线购物点亮你的眼球

    在今天,如果你还不了解什么叫做VR (Virtual Reality),那么你真的就已经Out了.现在的VR,正如当年的智能手机一样,传遍了整个世界,2016年,也被称作VR元年,各种各样的设备,以及 ...

  3. A comparison of local caches (2) 【本地缓存之比较 (2)】

    接上一篇: A comparison of local caches (1) [本地缓存之比较 (1)] This article will compare the asynchronous loca ...

  4. xfire调用webservice接口的实现方式

    package com.test; import java.net.URL; import org.codehaus.xfire.client.Client; import org.codehaus. ...

  5. 编写自己的Nmap(NSE)脚本

    编写自己的Nmap脚本 一.介绍 在上一篇文章Nmap脚本引擎原理中我们介绍了基本的NSE知识,这篇文章介绍如何基于Nmap框架编写简单的NSE脚本文件,下一篇文章,Nmap脚本文件分析(AMQP协议 ...

  6. SQL Server2012数据库的备份和还原

    一.数据库的备份: 1.选择要备份的数据库“accountInfo”,点击鼠标右键 → 任务 → 备份 2.在打开的“备份数据库 —accountInfo”对话框中,先点击删除,然后点击“添加” 3. ...

  7. Perl格式化输出

    Perl格式化输出 问题阐述 有时我们需要大量的重复数据,使用手工易于出错及比较繁琐.抓取特征,可以使用Perl脚本轻松搞定. 输出数据格式 主要特点 随机数生成 格式化输出 序列递增 Perl脚本 ...

  8. 一步一步教你将开源项目上传到jcenter

    最近闲着看了一下jcenter的使用,也想将自己使用频率比较高的东西抽成类库,然后通过compile来使用,提高开发效率,本来以为挺简单的,但是网上介绍的比较模糊,很多博客也比较老了,不适用,花了我一 ...

  9. twisted学习之reactor

    reactor是twisted框架里面一个很重要的抽象,它为我们实现了循环,所以我们不用再去实现循环了. reactor有如下特点: 1.reactor循环会一致运行下去,可以使用Ctrl+C或者相关 ...

  10. 读Zepto源码之属性操作

    这篇依然是跟 dom 相关的方法,侧重点是操作属性的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2. ...