Unity3D 之 unityontriggerenterr和OnCollisionEnter的区别

.OnCollisionEnter 进入碰撞
function OnCollisionEnter (collisionInfo : ) : void
Description描述
OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.
当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用。
In contrast to OnTriggerEnter, OnCollisionEnter is passed the
class and not a Collider.
class contains information about contact points, impact velocity etc.
If you don't use collisionInfo in the function, leave out the collisionInfo parameter as this avoids unneccessary calculations.
Note that collision events are only sent if one of the colliders also has a non-kinematic rigidbody attached.
相比OnTriggerEnter,OnCollisionEnter传递类而不是Collider。类包含接触点,碰撞速度等信息。在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。注意,当其中至少一个碰撞盒附加非动力学刚体时碰撞事件才会发送。
using UnityE
using System.C
public class example :
void OnCollisionEnter(Collision collision) {
foreach (ContactPoint contact in collision.contacts) {
Debug.DrawRay(contact.point, contact.normal, Color.white);
if (collision.relativeVelocity.magnitude & 2)
audio.Play();
function OnCollisionEnter(collision : Collision) {
// Debug-draw all contact points and normals
//调试绘制全部的接触点和法线
for (var contact : ContactPoint in collision.contacts) {
Debug.DrawRay(contact.point, contact.normal, Color.white);
// Play a sound if the coliding objects had a big impact.
//如果碰撞物体有一个更大的撞击就播放声音
if (collision.relativeVelocity.magnitude & 2)
audio.Play();
另一个例子:
using UnityE
using System.C
public class example :
explosionP
void OnCollisionEnter(Collision collision) {
ContactPoint contact = collision.contacts[0];
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.
Instantiate(explosionPrefab, pos, rot);
Destroy(gameObject);
// A grenade
//一个手榴弹
// - instantiates a explosion prefab when hitting a surface
//当撞击表面时实例化一个爆炸预设
// - then destroys itself
//然后销毁它们
var explosionPrefab : ;
function OnCollisionEnter(collision : Collision) {
// Rotate the object so that the y-axis faces along the normal of the surface
//旋转物体,以便y轴方向沿着表面的法线
var contact : ContactPoint = collision.contacts[0];
var rot : Quaternion = Quaternion.FromToRotation(Vector3.up, contact.normal);
= contact.
Instantiate(explosionPrefab, pos, rot);
// Destroy the projectile
//销毁物体
Destroy (gameObject);
本脚本参考基于Unity 3.4.1f5英文部分版权属&公司所有,中文部分&
版权所有,未经许可,严禁转载 。unity(66)
太抽象的理论总是让人眼花缭乱,所以我这里以例证为主。文章出自
1,测试OnTriggerEnter和OnCollisionEnter的区别
& && &测试:如果两个物体A,B
& && &两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)
& && &A,B都有刚体(Rigidbody)
& && &A或者B中有一个勾选isTrigger或者两者都勾选isTrigger A和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。
& && &A和B都不勾选isTrigger,A和B能进入OnCollisionEnter方法但是不能进入OnTriggerEnter方法。
& && &结论:
& && &OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。
& && &OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在的。
2,OnTriggerEnter和OnCollisionEnter的选择。
& && &如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。
& && &如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。
3,一些技巧。
& && &3.1:刚体(Rigidbody)的使用。
& && &两个碰撞的物体A 和 B
& && &现在我们就可以分两种模式来分析了,就是OnTrigger模式和OnCollision模式,因为上面已经详细介绍了两者是对立的模式,
& && &在OnCollision模式下:
& && &测试1:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法
& && &结论1:只有刚体能实现真实的物理碰撞。
& && &测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。
& && &结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。
& && &这里我猜测了刚体是用来实现物理真实碰撞的Component,但是这个想法是错误的,因为OnTriggerEnter也必须有一个物体具有刚体,所以猜测刚体应该是一个判断是否实现碰撞的是与否的标志。
& && &在OnTrigger模式下:
& && &A和B必须有一个有刚体(Rigidbody),A和B都可以进入OnTriggerEnter方法。
4,知识扩展。
& &&&上面的内容中有的实验是A,B有一个有刚体,有的实验是A,B都有刚体,那么为什么不干脆把两个物体都加刚体就没这么多麻烦了?
其实是这样的,真实游戏里面,有太多的物体,而这些物体如果都有刚体那么对系统的开销是很大的,如果可以减少一半的开销是很不错的选择。
比如地面就可以不设置刚体,因为地面是永远不动的,把人物设置刚体就可以实现真实的物理碰撞效果了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17124次
排名:千里之外
转载:68篇unity(75)
/flyFreeZn/p/3631590.html
觉得这个讲的挺好的,就转过来了:)
太抽象的理论总是让人眼花缭乱,所以我这里以例证为主。
1,测试OnTriggerEnter和OnCollisionEnter的区别
测试:如果两个物体A,B&
两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)
A,B都有刚体(Rigidbody)
A或者B中有一个勾选isTrigger或者两者都勾选isTrigger A和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。
A和B都不勾选isTrigger,A和B能进入OnCollisionEnter方法但是不能进入OnTriggerEnter方法。
OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。
OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在的。
2,OnTriggerEnter和OnCollisionEnter的选择。
如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。
如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。
3,一些技巧。
3.1:刚体(Rigidbody)的使用。
& & &两个碰撞的物体A 和 B
& & &现在我们就可以分两种模式来分析了,就是OnTrigger模式和OnCollision模式,因为上面已经详细介绍了两者是对立的模式,&
& & &在OnCollision模式下:
& & &测试1:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法
& & &结论1:只有刚体能实现真实的物理碰撞。
& & &测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。
& & &结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。
& & &这里我猜测了刚体是用来实现物理真实碰撞的Component,但是这个想法是错误的,因为OnTriggerEnter也必须有一个物体具有刚体,所以猜测刚体应该是一个判断是否实现碰撞的是与否的标志。
& & &在OnTrigger模式下:
& & &A和B必须有一个有刚体(Rigidbody),A和B都可以进入OnTriggerEnter方法。
4,知识扩展。
上面的内容中有的实验是A,B有一个有刚体,有的实验是A,B都有刚体,那么为什么不干脆把两个物体都加刚体就没这么多麻烦了?
其实是这样的,真实游戏里面,有太多的物体,而这些物体如果都有刚体那么对系统的开销是很大的,如果可以减少一半的开销是很不错的选择。
比如地面就可以不设置刚体,因为地面是永远不动的,把人物设置刚体就可以实现真实的物理碰撞效果了。
来自地址:/dajiangfengdu2/item/8dec48c008ebf823e80f2e38
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:269977次
积分:3561
积分:3561
排名:第8134名
原创:11篇
转载:539篇
评论:11条
(1)(1)(12)(4)(9)(4)(2)(20)(6)(1)(2)(11)(27)(4)(4)(5)(4)(4)(12)(3)(22)(2)(1)(17)(5)(3)(4)(9)(1)(16)(5)(6)(4)(18)(51)(13)(8)(50)(23)(12)(8)(5)(7)(8)(18)(7)(11)(6)(17)(11)(7)(6)(5)(28)(5)觉得这个讲的挺好的,就转过来了:)
太抽象的理论总是让人眼花缭乱,所以我这里以例证为主。
1,测试OnTriggerEnter和OnCollisionEnter的区别
测试:如果两个物体A,B&
两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)
A,B都有刚体(Rigidbody)
A或者B中有一个勾选isTrigger或者两者都勾选isTrigger A和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。
A和B都不勾选isTrigger,A和B能进入OnCollisionEnter方法但是不能进入OnTriggerEnter方法。
OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。
OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在的。
2,OnTriggerEnter和OnCollisionEnter的选择。
如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。
如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。
3,一些技巧。
3.1:刚体(Rigidbody)的使用。
& & &两个碰撞的物体A 和 B
& & &现在我们就可以分两种模式来分析了,就是OnTrigger模式和OnCollision模式,因为上面已经详细介绍了两者是对立的模式,&
& & &在OnCollision模式下:
& & &测试1:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法
& & &结论1:只有刚体能实现真实的物理碰撞。
& & &测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。
& & &结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。
& & &这里我猜测了刚体是用来实现物理真实碰撞的Component,但是这个想法是错误的,因为OnTriggerEnter也必须有一个物体具有刚体,所以猜测刚体应该是一个判断是否实现碰撞的是与否的标志。
& & &在OnTrigger模式下:
& & &A和B必须有一个有刚体(Rigidbody),A和B都可以进入OnTriggerEnter方法。
4,知识扩展。
上面的内容中有的实验是A,B有一个有刚体,有的实验是A,B都有刚体,那么为什么不干脆把两个物体都加刚体就没这么多麻烦了?
其实是这样的,真实游戏里面,有太多的物体,而这些物体如果都有刚体那么对系统的开销是很大的,如果可以减少一半的开销是很不错的选择。
比如地面就可以不设置刚体,因为地面是永远不动的,把人物设置刚体就可以实现真实的物理碰撞效果了。
来自地址:/dajiangfengdu2/item/8dec48c008ebf823e80f2e38
阅读(...) 评论()

我要回帖

更多关于 oncollisionenter 的文章

 

随机推荐