【Unity】Unity中获得碰撞体碰撞的位置
有时间的直接看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】11.3 基本碰撞体(箱体、球形、胶囊、网格)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 碰撞组件(Collider) 是另一种必须随刚体 (Rigidbody) 添加的组件,以便允许它和其他组件发生碰撞.或者 ...
- Unity3D入门(八):物理组件之刚体与碰撞体
Unity3D入门(八):物理组件之刚体与碰撞体 准备工作 物理组件之刚体 刚体组件简介 使用刚体移动物体 遇到的问题 物理组件之碰撞体 碰撞体简介 碰撞体种类 Box Collider Sphere ...
- Unity物理系统中碰撞体、刚体、isKinematic、isTrigger的关系(附动画演示)
Unity物理系统中碰撞体.刚体.isKinematic.isTrigger的关系 写在前面 产生碰撞的条件 产生触发的条件 实验一:蓝块(碰撞体).红块(碰撞体) 实验二:蓝块(碰撞体).红块(碰撞 ...
- Unity 碰撞体 composite
unity中盒型碰撞体与多边形碰撞体有used by composite这一选项,如果勾选这一选项代表该碰撞体可以被之后添加的composite 复合碰撞体使用,复合碰撞体会将该碰撞体的box与pol ...
- Unity 物理系统 -- 碰撞体简介(碰撞、触发条件)
Unity 物理系统 -- 碰撞体简介(碰撞.触发条件) 几个常用的碰撞体: Box Collider:盒碰撞体,盒碰撞体是一个立方体外形的基本碰撞体,该碰撞体可以调整为不同大小的长方体,可用作门.墙 ...
- Unity实用小工具或脚本——智能包住任意多个物体的碰撞体
一.前言 有些模型是我们在Unity中进行组合得到的一个模块,这个时候不可能再让美术给加碰撞体,需要用代码智能给其加碰撞体,如图1所示:任意的多个物体组成的一个综合物体最后都可以给它加上合适的碰撞体, ...
- Unity自动化碰撞体生成方法-Normal Collider 和 碰撞体代理
如何在Unity中对角色快速创建碰撞体(Normal Collider)和碰撞体代理(Fake Collider) 前言 快速给Humanoid人形角色添加碰撞体,使用Unity 的Collider系 ...
- unity 根据模型生成碰撞体_Unity之碰撞体组件
3D物理组件中碰撞体组件添加与设置 碰撞体是物理组件中的一类,3D物理组件和2D物理组件有独特的碰撞体组件,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对象有碰撞体时 ...
- Unity 之刚体,碰撞体,触碰器
Unity中文官方文档https://docs.unity.cn/cn/current/Manual/class-Rigidbody2D.html Rigidbody 刚体 是赋予物体力的的作用效果的 ...
最新文章
- Riding the Fences USACO 3.3 欧拉路径(dfs+floodfill)
- 51nod 1421 最大MOD值
- 入行Web前端,这些侧重点和学习方法你要了解
- jmeter压测之 监控--nmon
- ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
- [转]浅析Tomcat、JBOSS、WebSphere、WebLogic、Apache
- PAT Basic 1002
- 有什么用_app用什么软件编写
- c语言单词的一个字母变换,c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串知道...
- MongoDB最佳实践
- SqlServer日常积累(二)
- Python脚本秒换壁纸
- 前端通信实现l聊天室
- 建设规划合理、高效便捷的现代物流中心——浙江嘉兴市局(公司)卷烟物流配送中心建设纪实...
- VR是TAA的终结者吗?
- Suggestion: use tools:overrideLibrary=xxx.xxx.xxx to force usage
- 电脑提示ISDone.dll错误怎么办?
- 利用ArcGIS提取高光谱图像每个像素的光谱信息,再利用matlab显示每个像素的光谱信息
- Java基础笔记(个人总结)
- MAC系统使用教程,从零到高手使用进阶教程!必备增强软
热门文章
- JAVA虚拟机--JVM
- python爬虫案例分析:爬取肯德基门店地址数据导入csv文件并最终用excel文档呈现
- 关于CFD计算过程的梳理
- 顶尖文案app_为了让你多读点书,这个APP请来了这些世界顶级“文案”
- RabbitMQ介绍与延时队列
- 机器学习算法(九):神经网络(neural networks,NN)
- js个人博客设计大作业
- 如何分发大文件、大文件断点续传解决方案
- 1.1.4. Multi-task Lasso(多任务 Lasso)(多任务学习)
- java如何通过client客戶端http实现get/ post请求传递json参数到restful 服务接口