找回密码
注册

QQ登录

独立游戏 >
独立动画 >
独立音乐 >

MipMap

Mipmap技术有点类似于LOD技术,但是不同的是,LOD针对的是模型资 ...

如何评价暴雪游戏《守望先锋》及其场景和美术设计? ...

【一开始问的时候没想到会有这么多人答 真的好涨专业姿势啊 批量 ...

版号审批开放释放利好 中小游戏公司“抢人”备战

(图片来源:互联网资料图) 上周游戏版号审批即将开放的消息传 ...

unity 模型锯齿,阴影不正常,阴影不出现终极解决办法

本文作者使用的是2017.3.0版unity 一.阴影不显示, 1.打开平行 ...

苏州赞歌招聘啦,快来点进来看看

2D游戏动作师 5k~12k 岗位职责: 1. 根据项目要求,负责游戏项 ...

Unity3D自带功能:地形(Terrain)

Unity3D中的地形类似于Maya中使用置换贴图来变形高段数的多边形 ...

苏州赞歌急求3D手绘角色,3D动作,资深次时代,资深原画

我们是谁? 我们来自“上有天堂下有苏杭”的苏州,是苏州手绘3D ...

Adobe Photoshop CC2018 已停止工作

点击桌面PS图标-右击-打开文件位置(PhotoshopCC2018的安装目 ...

外媒:突然凉凉的《行尸走肉》开发商给同行的5个教训

9月底的时候,美国加州的剧情向游戏公司Telltale突然裁员90%以上 ...

作者: 九艺网
查看: 92|回复: 1
搜索

more +最新主题Download

more +社区更新Forums

more +随机图赏Gallery

MipMap
如何评价暴雪游戏《守望先锋》及其场景和美
版号审批开放释放利好 中小游戏公司“抢人

more +文章更新News

[翻译文档] Unity3D-游戏中的技能碰撞检测

[复制链接]
九艺网 发表于 2018-4-25 20:43:45 | 显示全部楼层 |阅读模式
查看: 92|回复: 1

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

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

113613lxq52anl17epqdfx.png
比如扇形检测/圆形检测

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

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

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

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

需要检测的碰撞有

1.检测圆柱体跟球体的碰撞
2.立方体跟圆柱体的碰撞

具体实现:

1.球体跟圆柱体碰撞检测

  1. ///
  2.     /// 检测球体跟圆柱体碰撞
  3.     ///
  4.     /// 球体X
  5.     /// 球体Y
  6.     /// 球体Z
  7.     /// 球体半径
  8.     /// 圆柱体X
  9.     /// 圆柱体Y
  10.     /// 圆柱体Z
  11.     /// 圆柱半径
  12.     /// 圆柱体高度
  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.立方体跟圆柱体的碰撞

这里先把问题简化成矩形跟圆形的碰撞检测

113859ckj9jz1fl7j981ju.png

计算方法是先找到矩形上离圆形最短距离u,然后再比较u是否小于圆形的半径r

(1)首先利用绝对值把 p - c 转移到第一象限,下图显示不同象限的圆心也能映射至第一象限,这不影响相交测试的结果:

113900cu6igy8e2i3nz633.png

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

113900n6q3qx3hboqd13bz.png

最后要比较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检测应该就够用了


via:cnblogs

点评

海!外直播 t.cn/RxlBL8F 禁闻视频 t.cn/RxrADkq 据说赵国官员有三特色四守则。三特色:高举红色旗帜,收获灰色的利益,使用黑色社会手段。四守则:喝酒基本靠送,抽烟基本靠供,工资基本不动,老婆基本不用。   发表于 2018-5-2 12:04
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表