Unity 碰撞检测

武器与怪物的碰撞

 

目前来说有三种思路,其实前两种算变种了:

1、动画关键帧回调 + 范围检测。http://blog.csdn.net/u013700908/article/details/52888792

这个是在Asset store上面下的一个例子中看到的,其实之前在做端游时,也差不多是这样做的,就是挥武器的动作到某一帧的时候,计算武器位中心的范围内有木有怪物,有的话,就给这个目标添加伤害。范围检测用到的函数是这个:

Physics.OverlapSphere

 

static function OverlapSphere(position: Vector3radius: float, layerMask: int = AllLayers): Collider[];
 
Description

Returns an array with all colliders touching or inside the sphere.

这个方法其实对于大部分游戏来说是足够了,性能上也没有什么开销。

 

2、动画关键帧回调 + 线性检测。

这个是从下面这位同学这里看到的哈,思路就是在武器的运动轨迹上选几个点,然后在这几个点上做线性检测。感觉这个比较适合做拿斧子横向砍一刀哈。

http://blog.sina.com.cn/s/blog_8373d8f00101989i.html

不过我觉得不必要向上面的链接里面说的,每帧都取值来算,可以在动画设置几个关键帧,然后记录当前关键帧的点和上一个关键帧的点做射线检测。用到的函数是这个:

Physics.Linecast

static function Linecast(start: Vector3end: Vector3layerMask: int = DefaultRaycastLayers): bool;
 
Description

Returns true if there is any collider intersecting the line between start and end.

 

3、碰撞体回调

给武器上挂一个空的GameObject,然后给这个GameObject挂上一个Collider(勾选山IsTrigger)和RigidBody,然后监听void OnTriggerEnter( Collider other )事件。

我这次做的这个Demo也就是用的这种哈,没有大规模的测试,只是做了一个Demo,据网上说这个会有性能上的开销,以后有机会测试一下。

 

 

 

 

2、

碰撞检测

    首先,我们得明确一点:即产生碰撞信息所需要的条件。事实上,在U3D中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念:
    (一)碰撞器是一群组件,它包含了很多种类,比如:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
    (二)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
    (三)在Unity3D中,主要有以下接口函数来处理这两种碰撞检测:


触发信息检测:
1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器

1.Static Collider 静态碰撞器
指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或很轻微的移动。这对于环境模型十分好用,比如刚体和墙面碰撞时而不会移动。

2.Rigidbody Collider 
刚体碰撞器
指的是附加了刚体和碰撞器的游戏对象。

3.Kinematic Rigidbody Collider 运动学刚体碰撞器
在第2点得基础上勾选了刚体组件中的IsKinematic属性,如果要移动这类对象,就只能修改它的Transform,而不是用力。这类游戏对象还有许多其他的独特的使用情景。
这三种碰撞器如果勾选了IsTrigger复选框,就变成了相应的触发器了。

 

两个碰撞器要想检测到碰撞信息,至少有一个是Rigidbody Collider。

两个注意
注意1两个物体发生碰撞,如果要检测到碰撞信息,那么其中必有一个物体既带有碰撞器,又带有刚体,且检测碰撞信息的脚本必须附着在带有刚体的碰撞器上。

 

注意2两个GameObject发生碰撞,要想检测到触发信息,最少要有一个刚体碰撞器并且勾选了IsTrigger复选框,另一个最少要有一个碰撞器组件,此时检测碰撞的脚本必须附加在那个带有刚体的触发器上。

 

http://blog.sina.com.cn/s/blog_947a2cdd0102uz1k.html

 

 

 

http://blog.csdn.net/myarrow/article/details/30213689
  1. }  

转载于:https://www.cnblogs.com/wshyj/p/6346707.html

Unity提供了多种方式进行碰撞检测。以下是一些常用的方法: 1. 物理系统:Unity的物理引擎可以自动处理物体之间的碰撞。你可以给物体添加刚体组件,并在刚体上添加碰撞器组件(如BoxCollider、SphereCollider等),然后使用物理材质来调整碰撞的行为。通过使用物理系统,你可以使用触发器(Trigger)和非触发器(Collider)来检测碰撞,并且可以处理碰撞的冲击力和反弹等效果。 2. 触发器(Trigger):你可以将一个Collider组件设置为触发器,当其他物体进入或离开该触发器时,会触发碰撞事件。你可以通过为触发器所在的脚本添加OnTriggerEnter、OnTriggerExit等函数来处理相关逻辑。 3. 非触发器(Collider):非触发器碰撞器可以用于模拟实体之间的物理交互,比如阻挡、推动等。你可以为非触发器碰撞器添加刚体组件使其具有物理属性,或者通过代码来检测碰撞事件。你可以在脚本中使用OnCollisionEnter、OnCollisionExit等函数来处理碰撞逻辑。 4. 射线检测(Raycast):射线检测是一种基于物理原理的碰撞检测方法。你可以通过从一个点发射一条射线,然后检测射线是否与其他物体相交来判断是否发生碰撞。Unity提供了Raycast函数来进行射线检测,你可以在脚本中使用该函数来处理碰撞逻辑。 以上是一些常见的碰撞检测方法,在具体场景中可以根据需求选择合适的方法来实现碰撞检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值