【Unity】Unity中获得碰撞体碰撞的位置
来源:互联网 发布:汽车加油软件 编辑:程序博客网 时间:2024/04/23 19:47
有时间的直接看sprite slicer这个插件的代码,原理也是发射线检测,代码逻辑什么的比下面的文章来的好的多,如果有空我也可以整理一下。
在纯物理环境中,为了获得碰撞体碰撞的位置,我们可以使用Collider2D.OnCollisionEnter2D(Collision2D)
来接受碰撞,Collision2D中存有碰撞信息Collision2D.contacts(The specific points of contact with the incoming Collider2D), contacts的类型是ContactPoint2D[],,通过ContactPoint2D,我们可以获得世界坐标系中两个碰撞体碰撞的位置。
当然,出发Collider2D.OnCollisionEnter2D(Collision2D)是有条件的,且较触发器更为苛刻,官网文档给出的条件(Unity ManualPhysicsPhysics OverviewColliders)如下:
我现在有特殊的需求,一个静态碰撞体和一个鼠标拖动的超小碰撞体(近似认为是一个点),要求他们碰撞的位置。当然,我设置碰撞体为IsKinematic的时候,OnCollisionEnter2D就会失效,所以无法用上面的方法获得碰撞点,那么来思考一下使用OnTriggerEnter2D是否好使?查看文档可以知道,OnTriggerEnter触发的时候,并不会记录点信息,故我们需要自己思考如何获得碰撞点。为了使用触发器来获得碰撞点,我也试了很多方法,试过将刚体的Collision Detection置为Continuous,试过修改差值方式等,均不好使。。。每次OnTriggerEnter2D触发的时候,一个触发器已经嵌入到另一个触发器之中,ORZ, 所以能得到的信息就是在触发的这一帧的位置。不过上一帧的位置我们也能得到,自己测试了一下,想在LateUpdate中记录上一帧的位置,不过这个位置也就是触发时候的位置,所以还需要一个变量记录真正的上一帧的位置。现在得到了两个有用的变量:触发器触发时候的位置 currentPos以及上移帧的位置 lastPos,静态碰撞体的边缘就在这两个位置之间,我从lastPos像currentPos发射一条射线:
Vector3 origin = m_LastLastPos;//上一帧的位置 Vector3 end = GameContext.MouseFollowPosition;//触发时的位置 Vector3 direction = end - origin;//射线方向 float distance = Vector3.Distance(origin, end);//射线检测距离 RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, 1 << LayerMask.NameToLayer("Target"));//发射射线,只检测与"Target"层的碰撞 Debug.DrawRay(origin, direction, Color.red, 2);//绘制射线 Debug.Assert(hit.collider != null, "未检测到起点"); if (hit.collider != null) { m_StartPoint = hit.point;//获得该碰撞点 }
这就得到了我所需要的碰撞点,就是这样,Oh la la!
- 【Unity】Unity中获得碰撞体碰撞的位置
- unity不规则碰撞体
- Unity中碰撞体和触发器的区别
- Unity中武器与人物的碰撞检测
- Unity碰撞检测中OnTriggerXXX和OnCollisionXXX的功能注解
- Unity碰撞检测
- Unity 射线碰撞
- Unity 碰撞检测
- unity character controller 碰撞
- [Unity-4] 碰撞检测
- Unity Layout碰撞检测
- Unity 碰撞检测、射线
- Unity碰撞检测
- Unity忽略碰撞,射线
- Unity碰撞检测。
- Unity 物理碰撞检测
- unity中的碰撞检测
- Unity不规则碰撞
- Java struts2国际化,与js资源获取
- 机器学习 - Clustering by fast search and find of density peaks
- C++/MFC修行之路(6)停靠窗口
- 数据存储
- JWT Token
- 【Unity】Unity中获得碰撞体碰撞的位置
- SEO_关键词研究工具
- 移动客户端网络优化
- ZOJ 3767-Elevator
- [POJ1273]草地排水 dinic模板
- 【矩阵加速】【数论】【KMP】[BZOJ1009][HNOI2008]GT考试
- java 语言中的重载 跟 重写的区别
- 调整数组顺序使奇数位于偶数前面
- 保持 RAC 群集环境稳定当前必须要做的 11 件事 (文档 ID 1525819.1)