【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[],Contacts2D有如下属性,通过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!

0 0
原创粉丝点击