unity 多边形碰撞器怎么将碰撞器设置为内部

当前位置: >
时间: 08:52 来源:Unity之家 作者:unity.jb51.net 浏览:
Physics.Raycast 光线投射1.一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。& & 参数解释:& & origin:射线起始点& & direction:射线方向& & distance:射线长度& & layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。& & 返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。(注意:如果从一个球型体的内部到外部用光线投射,返回为假。 )这一点测试不成功!& & 2.在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息。Unity3D教程手册& & Parameters参数& & origin:在世界坐标,射线的起始点。& & direction:射线的方向。& & distance:射线的长度。& & hitInfo:如果返回true,hitInfo将包含碰到器碰撞的更多信息。& & layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。& & Returns:当光线投射与任何碰撞器交叉时为真,否则为假。& & 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。& & 详细解释一下: LayerMask 层蒙版& & 每一个物体都有一个Tag和Layer标签,tag就是一个简单的标签,可以用来区分不同的物体,LayerMask的作用是可以选择性地过滤物体,例如当投射射线时,比如camera.cullingmask和光线投射时候。Unity3D教程手册& & 可以在TagManager中编辑tag和Layer。然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。RaycastHit&
LayerMask&mask&=&1&&&&8;
void&testRay()
&&&  if(Physics.Raycast(transform.position,Vector3.right,out&hit,100,&mask.value))
&&&  Debug.DrawLine(transform.position,hit.point,Color.red,1);
}上面的例子是从当前脚本所绑定的物体做标点向右发射长度100的射线,射线碰撞层级为8,其他层级忽略。为了测试,我们在碰撞到物体后画一条红色线条,表示射线,停留一秒钟。上面这些是射线的一些基本操作。
(责任编辑:脚印)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity编程 ??????Unity3D&在球内部做碰撞检测
做了个飞行漫游器,想把它限制在一定的区域内部,发现不能进行碰撞。
goole了半天发现这个问题有很多人提出来,并没有好的解决办法,
最后决定自己写碰撞检测。
碰撞地面总算是可以了,但是问题又来了:天空盒是个球Sphere,漫游器在球的内部,
从内向外的时候不能进行碰撞检测。
这点再unity的文档上是有描述的,可以查看Physics.Raycas的文档。
Notes:&This
function will return false if you cast a ray from inside a sphere
this in an intended behaviour. If you move
colliders from scripting or by animation, there needs to be at
least one FixedUpdate executed so that the physics library can
update it's data structures, before a Raycast will hit the collider
at it's new position.
可见,unity当时是这么设计的。
有什么解决办法呢?
又去google,发现国外的一个帖子说,碰撞检测是按照法线进行计算的;
要从内部进行检测,可以把球的法线的方向翻转过来(这个过程应该是在建模软件中进行的)。
找小段在3ds max中做了个法线翻转的半球,OK!碰撞成功!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。\ Unity3d 5.6 碰撞器(对撞机)介绍---Colliders
Unity3d 5.6 碰撞器(对撞机)介绍---Colliders
软件测试工程师
相信梦想~~~
作者的热门手记
碰撞器一般都用作触发器而用,刚体一般用作真实碰撞。
静态对撞机:一个对象有对撞机组件,没有刚体组件。
这种情况在场景中的静态物体应用较多,比如墙体,房屋等静止不动的物体。
物理引擎假设静态对撞机是不会被移动的,所以不要尝试移动他们。
否则会产生性能开销,或者引发一个错误。
静态对撞机是不能“唤醒”刚体的。
如果真的想移动对象的话,就给他添加一个刚体组件。
刚体对撞机:一个对象有对撞机组件,而且有刚体组件。(no-kinematic)
这个对象既可以参与碰撞检测,也可以受到物理力的影响。
运动学刚体对撞机:一个对象有对撞机组件,有刚体组件,而且勾选了is kinematic。
什么是对撞机?
对撞机组件定义对象形态上的物理碰撞.
不可见的对撞机不需要与对象的网格, 具有完全相同的形状
事实上,粗略的近似通常在游戏中更有效率和不可区分。
最简单(最少的处理器密集型)碰撞器是所谓的原始对撞机类型
在3D中,这些是箱子对撞机,球体对撞机和胶囊对撞机
在2D中,您可以使用Box Collider 2D和Circle Collider 2D
单个对象可以添加任意数量的这些对撞机 , 以创建复合碰撞器。
通过仔细的定位和调整大小,复合碰撞器通常可以很好地逼近对象的形状,同时保持较低的处理器开销。
通过在子对象上增加碰撞器可以获得更多的灵活性(例如,盒子可以相对于父对象的局部轴线旋转)
当创建这样的复合对撞机时,应该只有一个Rigidbody刚体组件放置在层次结构中的根对象上。
请注意,原始碰撞器在transform变换中无法正常工作 -
这意味着如果在transform转换层次结构中使用旋转和非均匀尺度的组合,
以使生成的形状不再匹配原始形状,则原始对撞机不会能够正确地表示它。
然而,在某些情况下,甚至复合对撞机也不够准确。
在3D中,您可以使用Mesh Colliders网格碰撞器来精确匹配对象网格的形状。
在2D中,多边形对撞机2D通常不会完美匹配sprite图形的形状,
但您可以将形状细化到任何您喜欢的细节水平。
然而,这些对撞机的处理器密度要比原始类型多得多,所以请谨慎使用它们来保持良好的性能
此外,网格碰撞机通常不能与另一个网格碰撞机碰撞(即,当它们接触时不会发生任何事情)。
在某些情况下,您可以通过在检查器中将网格对撞机标记为凸面来解决此问题.
这将产生一个像“原始网格”一样的“凸包”的对撞形状,其中填充有任何底切.
这样做的好处是,一个凸起的网格对撞机可以与其他网格对撞机相撞,
这样您就可以使用这个特征当您具有适合形状的移动角色时。
然而,一个很好的一般规则是使用网格碰撞器进行场景几何,并使用复合原语对撞机近似移动对象的形状。
可以将对角线添加到没有Rigidbody组件的对象上,以创建场景的楼层,墙壁和其他不动的元素。
这些被称为静态对照。
一般来说,您不应该通过更改“变换”位置重新定位静态对齐框架,因为这将严重影响物理引擎的性能。
一个对象上对撞机确实具有刚体被称为动态撞机。
静态对撞机可以与动态碰撞器进行交互,但是由于它们没有刚体,所以它们不会响应碰撞而移动。
&没有刚体的对撞机 碰撞时不会发生移动&
物理材料 Physics materials
1. 当碰撞者相互作用时,他们的表面需要模拟他们应该表示的材料的属性
2. 例如,一片冰将会滑动,而橡胶球会提供大量的摩擦力并且非常有弹性。
获得正确的参数可能涉及到一些尝试和错误,但冰材料,
例如将具有零(或非常低)的摩擦力和具有高摩擦力和接近完美的波峰的橡胶材料。
触发器 Triggers
触发器: 检测对象何时发生碰撞.
触发器只是碰撞器身上的一个属性,碰撞器是触发器的载体。
1. 脚本系统可以检测何时发生碰撞冲突,并使用该OnCollisionEnter功能启动操作
2. 也可以简单地使用物理引擎来检测何时一个对撞机进入另一个的空间而不产生碰撞冲突
3. 配置为触发器的对撞机(使用Is Trigger属性)不表现为固体对象,只允许其他碰撞器通过。
4. 当碰撞器进入其空间时,触发器将调用OnTriggerEnter触发器对象的脚本上的函数。
碰撞时采取的脚本动作 Script actions taken on collision
1. 当发生碰撞时,物理引擎会在附加到所涉及对象的任何脚本上调用具有特定名称的功能。
2. 可以在这些功能中放置任何您喜欢的代码来应对碰撞事件。
3. 例如,当汽车碰到障碍物时,您可能会发生碰撞音效。
1. 在检测到碰撞的第一个物理更新中,OnCollisionEnter调用该函数。
2. 在维护接触关联的更新期间,OnCollisionStay被调用,
3. 最后OnCollisionExit指出接触关联已被破坏。
4. 触发对撞机调用类似OnTriggerEnter,OnTriggerStay和OnTriggerExit功能
5. 对于2D物理,具有附加到名称的2D的等效功能,例如OnCollisionEnter2D
1. 对于正常的非触发碰撞,还有一个额外的细节,
2. 所涉及的对象中至少有一个必须具有非运动学刚体(即运动学必须关闭)。
3. 如果两个对象都是运动刚体,那么OnCollisionEnter就不会被调用
4. 触发碰撞时,这种限制不适用,因此运动学和非运动学刚体都将OnTriggerEnter在进入触发对撞机时
对撞机互动 Collider interactions
1. 根据他们的Rigidbody组件的配置方式,碰撞器会相互影响。
2. 三个重要的配置是静态碰撞器(即,根本没有连接刚体),刚体对撞机和运动刚体对撞机。
静态对撞机 Static Collider
/静态对撞机: 具有对撞机但没有刚体的GameObject。/
静态对撞机用于水平几何,它始终保持在同一个地方,永远不会移动。
进入的刚体物体将与静态碰撞器碰撞,但不会移动。
物理引擎假设静态对撞机不会移动或改变,并可以根据这一假设进行有用的优化。
因此,在游戏过程中不应禁用/启用,移动或缩放静态对撞机。
如果您更改了静态对撞机,那么这将导致物理引擎的额外的内部重新计算,导致性能下降。
更糟糕的是,这些变化有时可能使对撞机处于产生错误物理计算的未定义状态。
例如,针对改变的静态对撞机的射线可能无法检测到,或者在空间中的随机位置检测它。
此外,由移动的静态对撞机击中的刚体不一定是“唤醒”,静态对撞机不会施加任何摩擦。
由于这些原因,只有刚体对撞机才能改变。
如果您想要一个不受传入刚体影响但仍可以从脚本中移动的对撞机对象,
则应将运动学刚体组件附加到它, 而不是根本没有刚体。
刚体对撞机 Rigidbody Collider
/刚体对撞机: 具有对撞机和非运动学正常刚体的GameObject。/
刚体对撞机
= Collider+ (no-Kinematic Rigidbody GameObject)
1. 这是一个具有对撞机和正常的非运动学刚体的GameObject。
2. 刚体对撞机由物理引擎完全模拟,并可以对从脚本应用的碰撞和力量做出反应。
3. 它们可能与其他物体(包括静态碰撞器)发生碰撞,并且是使用物理学的游戏中最常用的对撞机配置。
运动刚体对撞机 Kinematic Rigidbody Collider
/运动刚体对撞机: 具有对撞机和运动学刚体的 GameObject(即,刚体的IsKinematic属性已启用)/
运动刚体对撞机
= Collider+ ( IsKinematic Rigidbody GameObject)
1. 这是一个具有对撞机和运动学刚体的 GameObject(即,刚体的IsKinematic属性已启用)。
2. 您可以通过修改其转换组件从脚本移动运动刚体对象,但不会像非运动学刚体那样响应碰撞和力。
3. 运动刚体应该用于可以偶尔移动或禁用/启用的碰撞器,但是否则应该像静态碰撞器一样。
4. 一个例子是一个滑动门,通常应作为一个不动的物理障碍,但必要时可以打开。
5. 与静态碰撞器不同,移动的运动刚体会将摩擦力与其他物体相互碰撞,并在接触时“唤醒”其他刚体。
1. 即使不动,运动刚体碰撞器与静态碰撞物具有不同的行为。
2. 例如,如果将碰撞器设置为触发器,那么您还需要向其添加一个刚体,以便在脚本中接收触发事件。
3. 如果您不希望触发器具有重力或受物理影响,则可以在其刚体上设置IsKinematic属性。
4. 使用IsKinematic属性,可以随时在正常和运动行为之间切换Rigidbody组件。
一个常见的例子是“抹布”效果,其中角色通常在动画下移动,但是由于爆炸或重型碰撞而物理地投掷。
默认情况下,角色的肢体每个都可以被赋予自己的刚体组件,并启用IsKinematic。
肢体将通过动画正常移动,直到IsKinematic关闭所有它们,并立即表现为物理对象。
在这一点上,一个碰撞或爆炸力将以令人信服的方式将四肢的飞翔发出。
碰撞动作矩阵 Collision action matrix
当两个对象碰撞时,可能会发生许多不同的脚本事件,这取决于碰撞对象的刚体的配置。
下面的图表基于附加到对象的组件来提供哪些事件功能被调用的细节。
一些组合只会导致两个对象中的一个受碰撞影响,但通常的规则是物理不会应用于没有连接刚体部件的对象。
物体发生碰撞的必要条件?
答:需要检测碰撞的物体身上存在刚体组件(或被检测物体),也要碰撞器collider
Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Reset——& Awake——&Start——&Update——&FixedUpdate——&LateUpdate——&OnGUI——&OnDisable——&OnDestroy
相关标签:
请登录后,发表评论
评论(Enter+Ctrl)
评论加载中...
评论加载中...
Copyright (C)
All Rights Reserved | 京ICP备 号-2程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity2D研究院之精灵Sprite之间的碰撞事件(三)
Unity2D研究院之精灵Sprite之间的碰撞事件(三)
围观53943次
编辑日期: 字体:
碰撞我个人觉得可以分为两大类: 比较物理的碰撞,和不太物理的碰撞。
比较物理的碰撞:比如奋斗的小鸟这种游戏,小鸟飞出去后会根据自己的速度还有重力碰到障碍物后可能会被弹回来。
不太物理的碰撞:比如超级玛丽这种游戏,无论玛丽以多块的加速度向前跑碰到了障碍物,玛丽并不会被弹回来。
那么这篇文章我主要想写写 不太物理的碰撞,想一想以前的2D游戏是怎么做的?
场景层:场景编辑器来生成一个庞大的二维数组,每一个数字代表一个含义,比如0-9表示不同的tile(小图)。整个游戏场景都是根据二维数组用双for循环绘制出来的。
物理层:再来一个和上面一样的二位数组,比如0表示可以通过,1表示不可以通过,也就是碰撞层。 策划在编辑器里面来编辑所有的物理层。
有可能还会在有两个相同的二维数组, 前景层 后景层。。。就不赘述了。。 最后用代码去检测人物是否能继续前进,或者被碰撞。
结合到unity3d里面,现在还能这么搞吗?答案:当然能这么搞了,只是unity给我们提供了新的方案,检测碰撞的这一部分可以不用我们自己写代码了。。
二维数组似乎有点麻烦,我们把问题简化一下。如下图所示,红色区域表示小鱼不可行走区域。我相信刚开始学unity2d的人首先想到的就是transfom.postion 来给小鱼赋值, 在Update里面来检查是否碰撞,因为我也是这么想的。
算法说难也不难,有轮子为什么我们不用呢?在处理位置的时候我们使用rigidbody2D.MovePosition()这个方法。另外记得要给精灵添加一个Rigidbody2D的组件。
1234567891011121314151617
using UnityEngine;using System.Collections;public class FishCommon : MonoBehaviour { void Update () {
//手指 或者 鼠标的坐标传进去
Move(Input.mousePosition); } public void Move(Vector3 postions){
//在这里进行坐标的换算
rigidbody2D.MovePosition(ScreenToWorld(postions)); } private Vector2 ScreenToWorld(Vector3 postion){
Vector3 pos =&&Camera.main.ScreenToWorldPoint(postion);
new Vector2(pos.x,pos.y); }}
如下图所示,小鱼在移动的时候,如果碰到的障碍物它就会停住。
如果需要精灵响应物理碰撞,那么就必须添加Rigidbody2D的组件。如下图所示,我不需要 位置与旋转运动阻力,所以linear Drag 和 angular Drag 设置0。我也不需要重力所以GravityScale 也就是0.我需要固定精灵的角度所以勾选Fixed Angle 。因为我需要感应物理碰撞,所以不够选Is Kinematic 。下面依次是物理差值、休眠模式、碰撞检测。调一调参数就能看出效果。
这里我想详细的在说说 Is Kinematic 属性。既然已经需要用到物理碰撞,那么在勾选 Is Kinematic 是不是吃饱了撑了?我在做个假设?比如我现在控制小鱼在吃金币,当碰撞到金币的时候我并不希望小鱼停住。但是我程序中还想得到碰撞的这个事件,那么此时该如何? 解决这个命题之前我们要看看物理碰撞的事件。
物理碰撞的事件
这是要把碰撞的信息回调到代码中,以前物理老师讲过“力的作用是相互的”。“小鱼”碰撞“石头”也就是“石头”碰撞“小鱼”,那么Rigidbody2D组件到底是给“小鱼”加 还是给“石头”加?请记住一点,Rigidbody2D永远给需要感应物理(有位移)的对象加。
例子1:“小鱼”碰撞“石头” ,石头是要挡住小鱼的前进,那么石头永远不可能发生位移,Rigidbody2D加给小鱼。
例子2:“小鱼”要吃一个金币,但是金币被一个特殊的石头挡住了。我需要控制小鱼把这个石头挪开,因为这个石头需要发生位移,Rigidbody2D加给小鱼,并且加给石头。
例子3:“小鱼”不加Rigidbody2D 而“石头”加Rigidbody2D 这种情况应该是非常非常少见的。
回到物理的碰撞事件上,要得到精灵的碰撞事件,必须保证这两个精灵至少有一个含有Rigidbody2D组件。还是“小鱼”碰撞“石头”的例子。如下代码所示,“小鱼”和“石头”都挂上,当发生碰撞的时候都可以收到对方的信息。
using UnityEngine;using System.Collections;&public class ColliderEvent : MonoBehaviour {& void OnCollisionEnter2D(Collision2D coll) {
Debug.Log(coll.gameObject.name); }}
OnCollisionEnter2D 表示进入碰撞的事件,对应还有碰撞中、和碰撞结束的事件。 详细的就在API里面找找吧。显然这个脚本只挂在”小鱼”身上比较好,原因是可能有很多石头,只监听“小鱼”身上的就够了。
在举个例子,现在变成“小鱼”改吃 “金币”了。“小鱼”需要穿越过“金币”的碰撞区域,在回到上面我说的Rigidbody2D组件上。此时请把“小鱼”身上的 Is Kinematic 勾选上。并且把Box Collider2D上的 Is Trigger勾选。
把如下脚本挂在“小鱼”身上。
using UnityEngine;using System.Collections;&public class ColliderEvent : MonoBehaviour {& void OnTriggerEnter2D(Collider2D other) {
Debug.Log(other.name); }}
OnTriggerEnter2D 表示进入碰撞的事件,对应还有碰撞中、和碰撞结束的事件。如下图所示,“小鱼”已经可以穿过碰撞区域了。
例子4: 如果“小鱼”既要响应碰撞也要响应触发该如何?也就是说“小鱼”碰到石头会停止,但是同时碰到金币则会穿越。此时“小鱼”身上的Box Collider2D不要勾选Is Trigger,而是“金币”勾选Is Trigger即可。
1.精灵之间Game视图显示上没有碰撞表现,但代码要监听碰撞事件,那么 Is Kinematic 勾选,Is Trigger勾选、用transform.postion给坐标赋值即可。
2.精灵之间Game视图显示上要有碰撞表现,并且代码要监听碰撞事件。那么Is Kinematic 不勾选,Is Trigger不要勾选,用Rigidbody2D来给坐标赋值即可。
如果想做插值动画, 新项目的话强烈建议使用DoTween
虽然目前还是Alph版本,但是功能已经很强大的,我相信很快就有正式版本了。
最后感谢大家听我唠叨,如果有好的建议或者方法欢迎大家在下面给我留言,互相学习与进步,加油~嘿嘿。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!unity(36)
我在淘宝上,买了一点unity的学习素材,
摸索着,做一些demo, 这里分享一下试验后可行,并且效果还可以的例子。
人物做不同动作的时候,碰撞范围会有一定的变化,
例如,某些地方,在地面翻滚可以躲过,而正面奔跑就可能会碰到,
可以这样来切换,
//碰撞范围 开始-----------------------------------------------------------------------
public CharacterController ownC
//奔跑时的碰撞范围
private Vector3 runCollisionPosition = new Vector3(0,1.25f,0.4f);
private float &&runCollisionRadius = 0.7f;
private float &&runCollisionHeight = 2.5f;
private void changeToRunCollision()
ownCollision.center = runCollisionP
ownCollision.radius = runCollisionR
ownCollision.height = runCollisionH
//起跳时的碰撞范围
private Vector3 jumpCollisionPosition = new Vector3(0,2,0);
private float &&jumpCollisionRadius = 0.5f;
private float &&jumpCollisionHeight = 2.0f;
private void changeToJumpCollision()
ownCollision.center = jumpCollisionP
ownCollision.radius = jumpCollisionR
ownCollision.height = jumpCollisionH
//下滚是的碰撞范围
private Vector3 &rollCollisionPosition = new Vector3(0,0.8f,-1);
private float &&&rollCollisionRadius = 0.8f;
private float &&&rollCollisionHeight = 1.4f;
private void changeToRollCollision()
ownCollision.center = rollCollisionP
ownCollision.radius = rollCollisionR
ownCollision.height = rollCollisionH
//碰撞范围 结束-----------------------------------------------------------------------
实际游戏开发的时候,
调整具体数值的窍门就是多测试,
尽量调整到一个看上去效果还算是比较自然的程度。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20337次
排名:千里之外
原创:37篇
(1)(7)(4)(25)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 unity 碰撞器 触发器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信