-- 检测碰撞物,如果发生碰撞则进行位移
function LColliderBDY:BDYFixedUpdate(velocity)local isGround = falselocal isWall = false-- 检测和什么碰,2d碰撞范围一般比实际要大,因为AABB要大一点,为了精确碰撞,需要自己实现local contactColliders = CS.Tools.Instance:Collider2DOverlapCollider(self.collider, self.filter) -- 这个函数其实Collider2D.OverlapCollider,用来手动检测碰撞,这边因为lua的缘故封装了一下-- 最终位移坐标local finalOffset_x = 0local finalOffset_y = 0for p, k in pairs(contactColliders) doif self.collider.bounds:Intersects(k.bounds) thenlocal up, down, left, right = false, false, false, falselocal go = k.attachedRigidbody.gameObjectif go:GetComponent(typeof(CS.UnityEngine.Rigidbody2D)) ~= nil and go.name == "test" then -- 如果是地图块local name = utils.split(k.name, ",")local num = tonumber(name[#name]) -- 地图块最后一个数字作为bitif num | 14 == 15 then --位操作,算出这个方块朝哪个方向进行碰撞,一个方块可以有多个碰撞方向,这部分随意设计,只需要能知道这个collider的判定方向,用layermask什么都行up = trueendif num | 13 == 15 then --位操作down = trueendif num | 11 == 15 then --位操作left = trueendif num | 7 == 15 then --位操作right = trueendelseif go:GetComponent(typeof(CS.XLuaTest.LuaBehaviour)) ~= nil then -- 是游戏object,则只允许左右进行碰撞,LuaBehaviour是用来调用lua的脚本,雨女无瓜left = trueright = trueelsereturn false, falseendlocal menseki = utils.getBoundsIntersectsArea(self.collider.bounds, k.bounds)if menseki.magnitude > 0 then -- 无视多少面积设置,先不设-- 算2个collider之间距离,主要是为了法线local cd2d = self.collider:Distance(k)local a =  CS.UnityEngine.Vector3(cd2d.pointA.x, cd2d.pointA.y, 0)local b =  CS.UnityEngine.Vector3(cd2d.pointB.x, cd2d.pointB.y, 0)local normal =  -CS.UnityEngine.Vector3(cd2d.normal.x, cd2d.normal.y, 0)CS.UnityEngine.Debug.DrawLine(a, a + normal, CS.UnityEngine.Color.red)CS.UnityEngine.Debug.DrawLine(b, b + normal, CS.UnityEngine.Color.yellow)-- 做碰撞法线与行进方向的点积-- local projection = CS.UnityEngine.Vector2.Dot(velocity.normalized, normal) -- 没用到,有需要可以自己看情况加local offset_x = 0local offset_y = 0-- 左移,右移if self.collider.bounds.center.x < k.bounds.center.x thenif left and CS.UnityEngine.Vector2.Dot(velocity.normalized, CS.UnityEngine.Vector2(-1, 0)) <= 0 then -- 如果碰撞朝向与行进方向相反,则求出位移坐标offset_x = -menseki.xendelseif right and CS.UnityEngine.Vector2.Dot(velocity.normalized, CS.UnityEngine.Vector2(1, 0)) <= 0 thenoffset_x = menseki.xendend-- 上移,下移if self.collider.bounds.center.y > k.bounds.center.y thenif up and CS.UnityEngine.Vector2.Dot(velocity.normalized, CS.UnityEngine.Vector2(0, 1)) <= 0 thenoffset_y = menseki.yendelseif down and CS.UnityEngine.Vector2.Dot(velocity.normalized, CS.UnityEngine.Vector2(0, -1)) <= 0 thenoffset_y = -menseki.yendendif (up or down) and (left or right) then -- 如果同时满足上下和左右方向同时存在的情况,则根据碰撞方向来筛选掉另一个轴的位移offset_x = offset_x * math.abs(normal.x)offset_y = offset_y * math.abs(normal.y)end-- 留下最小位移坐标if velocity.x > 0 thenif offset_x < finalOffset_x thenfinalOffset_x = offset_xendelseif offset_x > finalOffset_x thenfinalOffset_x = offset_xendendif velocity.y > 0 thenif offset_y < finalOffset_y thenfinalOffset_y = offset_yendelseif offset_y > finalOffset_y thenfinalOffset_y = offset_yendendif go:GetComponent(typeof(CS.UnityEngine.Rigidbody2D)) ~= nil and go.name == "test" then -- 判断是不是撞到地面,这样写不好,以后再优化if finalOffset_x ~= 0 thenisWall = trueendif finalOffset_y > 0 thenisGround = trueendendendendend-- 更新自身位置self.collider.attachedRigidbody.position = self.collider.attachedRigidbody.position + CS.UnityEngine.Vector2(finalOffset_x, finalOffset_y)return isGround, isWall
end

直接上代码,在fixedupdate里调用这个代码,代码是lua写的

记得rigidbody2d设为Kinematic,useFullKinematicContacts设为false,因为我们自己实现碰撞,不需要unity的碰撞oncolliderenter之类的,把这个关了可能可以提高性能8

讲一下思路

因为unity用的box2d的aabb碰撞触发范围比定义的范围要大,所以对于像素游戏来说,会有像素差,会影响实际画面,比如站在地上有时候会离地腾空1个像素高

况且像素游戏基本是方块判定,也用不太到什么摩擦力,反弹,几何形状碰撞等,简单的自己也能加,所以自己实现碰撞是一个不错的选择

用Collider2D.OverlapCollider详见官方API,来检测碰撞物,获得碰撞物允许碰撞的朝向(上,下,左,右),自己的collider和检测到的collider的bounds互相检测一下,相交的话

看自己在对象的位置,以及自己移动方向是否面朝对象允许碰撞的朝向(点积小于0)算出碰撞面积,也就是需要位移的x轴和y轴的偏移量,留下基于自己位置和方向的最小的偏移量,这些用移动方向法线来写可能代码会好看点,最后更新rigidbox的position

只是提供思路,没了

unity3d实现像素游戏的精确碰撞判定相关推荐

  1. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

  2. [Unity3D] 2D像素游戏(二) 准备图像素材并认识预制件Prefab

    回顾 构思 素材准备 寻找地板和障碍素材 统一图片素材尺寸 合适搭配素材 导入Unity预览效果 制作预制件(Prefab) 拓展阅读 回顾 上一篇:(一) Hello Unity! 在初步认识了Un ...

  3. Unity3D的RPG游戏中攻击的判定

    目前在一个游戏里面,最重要的要数那些算法了.比如追击AI算法,寻路算法.一个优质的算法能让你的游戏体验更好.那么在RPG游戏里面,我们玩家角色的普攻一般情况下,如果选择的人物是那种剑士职业的(这里打个 ...

  4. [Unity3d]刀斧武器砍击的攻击碰撞判定

    [Unity3d]刀斧武器砍击的攻击碰撞判定  前几天开发游戏需要做角色刀斧砍击的功能,需要判断刀斧是否碰撞到敌人.想到了一种方法,斟酌一番,又参考了Unity3d Answer(Unity3d官方的 ...

  5. 【Unity3D开发小游戏】《愤怒的小鸟》开发教程

    [Unity3D开发小游戏]<愤怒的小鸟>开发教程 2019年09月11日 10:34:36 恬静的小魔龙 阅读数 1698更多 分类专栏: Unity3D日常 Unity3d手游开发 U ...

  6. 【Unity3D开发小游戏】《我的世界游戏》Unity开发教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 这套教程涵盖了Unity Mesh编程.模拟水算法(water s ...

  7. unity小游戏——得分高低的判定

    大部分游戏都鼓励玩家不断挑战更高的得分.虽然也有像角色扮演(RPG)这类更主张情节而不关注得分的游戏.但现在挑战更高分的游戏正变得越来越多. 这次我们介绍的是一个斩杀怪物的游戏.成功斩杀怪物后,怪物出 ...

  8. 新手教程:用像素游戏制作大师MV开发游戏(一)

    第一步 本指南,是面向第一次接触本系列的用户为对象制作的. 首先,从最初级的用自己制作的角色打到敌人这一部分开始介绍吧. 第一步"设置角色并让其动起来" 用像素游戏制作大师MV制作 ...

  9. 使用Unity3D制作2D游戏的重点做法

    官网上有提供一个2D游戏的教学范例,这个游戏只不过把镜头摆放在横向位置跟随角色移动,游戏内物件运动时固定一个轴不动,使他像横轴式的2D游戏来玩,本质上其实还是个3D游戏,所以如果没有3D建模的话不就没 ...

最新文章

  1. 程序员的弓箭知识涉猎
  2. 常用JavaScript的高级技巧
  3. linux netstat服务,linux netstat查看服务和端口状态
  4. 修改mysql密码时遇见ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that correspo
  5. MxNet 迁移学习实现深度学习分类
  6. STL(三)——next_permutation()
  7. C语言之变量存储类型与链接属性
  8. uml活动图 各个功能的操作流程和分支_UML建模更好的表达产品逻辑
  9. Mybatis Plus 的BaseMapper 和 Model有什么用
  10. php设置编程,php – 以编程方式设置基本图像
  11. 马尔科夫随机过程的理解
  12. DCL记忆上次输入值lisp_python-输入和输出
  13. 数据结构 课堂测验错题_200911
  14. VC++内存泄漏检测方法(5):使用强大的Windbg工具,重点是Symbols Path设置
  15. Fatal signal 11 (SIGSEGV) at 0x00000014 (code=1), thread 29925 (cloud.diversion)
  16. 阿里巴巴为什么“去IOE”
  17. 解决MATLAB高版本启动较慢问题
  18. 北京尚学堂退课退课,口碑还不错
  19. java版我的世界怎么疾跑,Minecraft疾跑按键设置 我的世界怎么开疾跑
  20. link2SD的原理以及开启方法

热门文章

  1. 《第6章-GCN的性质》学习笔记
  2. 固定码率(CBR)与可变码率(VBR)
  3. Solved Issues
  4. 文本上划线_如何在Word中对文本进行上划线
  5. 视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop
  6. barcode4j CODE128/EAN128生成 不定长 msg值 分隔符
  7. 作业调度算法--先来先服务
  8. Linux/UNIX系统编程手册gg
  9. us排名2019计算机专业排名,2019 USNews美国大学计算机专业排名
  10. C# Microsoft Speech 选择音频输出设备