2019-08-21 21:00:39 qq_39588003 阅读数 49

刚体的碰撞分为三种:进入碰撞、碰撞中和结束碰撞。

下面是关于碰撞的三个系统方法:

  • OnCollisionEnter():刚体与刚体刚开始接触时,立即调用此方法。
  • OnCollisionStay():刚体与刚体刚碰撞过程中,每帧都会调用此方法,直至碰撞结束。
  • OnCollisionExit():刚体与刚体刚停止接触时,调用此方法。

休眠:让模型变为禁止。

示例:如果有刚体与这个物体发生碰撞,程序立即把碰撞对象的信息显示在屏幕中,并且碰撞结束后将碰撞的刚体设置成休眠状态。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class E6_03 : MonoBehaviour
{
    string show = null;
    // Start is called before the first frame update
    void Start()
    {
        show = "未发生碰撞";
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void OnCollisionEnter(Collision collision)
    {
        show = "进入碰撞,碰撞名称:" + collision.gameObject.name;
    }
    private void OnCollisionStay(Collision collision)
    {
        show = "碰撞中,碰撞名称:" + collision.gameObject.name;
    }
    private void OnCollisionExit(Collision collision)
    {
        show = "碰撞结束,碰撞名称:" + collision.gameObject.name;
        //collision.gameObject.rigidbody.Sleep();
        collision.gameObject.GetComponent<Rigidbody>().Sleep();
    }

    private void OnGUI()
    {
        GUI.Label(new Rect(100,0,300,40),show);
    }
}

2015-03-13 18:42:31 a3636987 阅读数 14620

经过测试学习,总结了关于怎么让粒子和物体发生碰撞和怎么让粒子在碰撞后消失的几点看法:

首先给大家看一下我的粒子系统的配置图:


关于碰撞检测的主要配置我们看图中的Collision:

第一项:因为是一个3D游戏,所以这里我选择的是World

第二项(Dampen):抑制(0~1),选这个为1时(完全抑制),碰撞之后,阻止了粒子,可以使碰撞的粒子消失

第三项(Bounce):反弹(0~2),选完这个之后,可以让产生碰撞的粒子以某个角度反弹出去

第三项(Lifetime Loss):生命周期损失(0~1),碰撞之后让粒子损失百分比的生命周期,为1时(生命周期完全损失),可以使粒子消失

第四项(Min Kill Speed):最小清除速度,设置值越大,粒子发生碰撞之后被移除的速度越快,当达到某个值之后,可以近似碰撞之后立即消失

第五项(Collides With):可碰撞范围,设置可以与该粒子系统碰撞的层

第六项(Collision Quality):碰撞质量,设置发生碰撞的碰撞概率大小,选项三项从上到下由高到低,越低碰撞到的概率就越低

第七项(Send Collision Messages):发送碰撞信息,与下面这个方法有关

// 需要处理的碰撞信息,放在被撞的物体身上
void OnParticleCollision(GameObject other) {
      
}

总结一下以上可以使粒子消失的方法有以下三种:

(1)设置Dampen为1;

(2)设置Lifetime Loss为1;

(3)设置较大的Min Kill Speed值


以上是我对粒子碰撞的看法,不知道有没有错的地方,如果有错的地方欢迎指正,谢谢!

转载请指明出处:http://blog.csdn.net/hongyouwei/article/details/44244055


2016-07-20 14:46:50 small__zhang 阅读数 603
Unity3d碰撞器
一.碰撞发生的必要条件:
1.产生碰撞效果需要具备两个因素

a.发起碰撞的物体
b.接收碰撞的物体

2发起碰撞的物体
a.Rigidbody
b.CharacterController

3.接受碰撞的物体
a.所有的Collider

二.在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 )  当逗留碰撞器

三.举例
A物体和B物体要发生碰撞,则A和B中必须要带有Collider组件,并且A和B中至少一个物体携带Rigidbody
1.新建一个场景,添加CubeA,CubeB,Ground 三个物体,三个物体创建自Cube,默认带有BoxCollider组件
2.新建一个脚本,TestCollider,复写四个方法
OnCollisionenter,OnCollistionExit,OnTriggerEnter,OnTriggerExit,
在这几个函数中打印一些Log,注明当前进入的函数是哪个物体的哪个函数
3.给物体A和物体B挂上TestCollider脚本
4.为了方便测试,不给物体添加移动脚本了,运行游戏测试的时候,世界更改物体A或物体B的位置,使得A和B相交就行了
直接运行游戏,拖拽物体A移动到物体B处,未来发现打印任何的Log,因为A和B没有满足发生碰撞的必要条件,A和B只有Collider,
没有Rigidbody
5.为了进一步验证碰撞发生的必要条件,我们给a添加一个组件Rigidbody【默认Use Gravity打开,Is Kinematic关闭,
之前新建Ground物体就是为了防止有Rigidbody的物体往下掉落】,再次运行游戏,拖拽物体A移动到物体B,发现物体A不能够穿透物品B,
被B阻挡的效果,打印显示两个物品都进入了OnCollisionEnter和OnCollisitionStay方法
6.为什么只进入了CollisitionXX方法而没有进入OnTriggerXX方法呢,因为物体的Collider下的IsTrigger没有打勾,所以不会触发
7.现在把物体B的Is Trigger选项打勾,再次运行游戏,发现A会穿透B,且AB两个物体进入了OnTriggerXX函数。【这里有人会问,为什么只勾选物体B的
IsTrigger选项,起始勾选A,B任一个都行,或两个都勾选,但是这里勾选A的IsTrigger,物体A会直接掉落,可先把物体A的UseGravity钩去掉,勾选IsKinematic,再勾选IsTrigger】

四.总结
当Is Trigger=false时【Rigidbody 开启UseGravity,需要模拟物理碰撞】,碰撞器根据物理引擎引发碰撞,产生碰撞的物理效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时【Rigidbody,关掉UseGravity,开启IsKinematic,避免物体下落】,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

当需要看到物理碰撞效果的时候,调用OnCollistionXX
当需要碰撞后不影响物体位置方向等,调用OnTriggerXX

2017-03-26 21:51:56 haobaworenle 阅读数 531

要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

物体发生碰撞的必要条件
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。

在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
1.碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,必须加到GameObjecet身上。
2.触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
 
触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器
2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器
3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器
 
碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision)  当逗留碰撞器
 
两个物体相接触时到底执行OnTriggerEnter还是执行OnCollisionEnter方法,这两个又有什么区别呢?
为了验证碰撞器与触发器的区别,现设计一个简单的游戏,让小汽车与小球发生碰撞。新建一个C#脚本文件,把它拖给小汽车对象,双击该脚本文件进入脚本编辑器,在该脚本中加入如下两个方法,并分别设置一个断点:
复制代码
void OnTriggerEnter(Collider collider)
{
     //进入触发器执行的代码
}
void OnCollisionEnter(Collision collision) 
{
     //进入碰撞器执行的代码
}
复制代码

当未勾选碰撞器的Is Trigger选项时汽车与球体发生碰撞,进入方法OnCollisionEnter,碰撞之后汽车产生被球体撞飞的效果:

如果将碰撞器的Is Trigger属性选中,再次启动游戏让球体与汽车产生接触,这时进入方法OnTriggerEnter。之后球体直接穿过汽车,但球体与汽车都没有产生碰撞效果:

当碰撞物体无刚体时,均不进入ontrigger和oncollision;
附有刚体的物体必须处于移动状态才能发生碰撞回调。而且当两个物体isTrigger都不勾选时,都只会调用oncollision;如果至少一个物体isTrigger勾选时,都只会调用ontrigger。也就是说,碰撞的两个物体只会检测trigger或collision其中一个,而且是同一个。

unity3d中的碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,碰撞物体直接穿越,可以调用OnTriggerEnter/Stay/Exit函数。

 
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
例子:
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果


参考文章:

Unity3d碰撞检测中碰撞器与触发器的区别

unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

2015-01-04 11:33:12 cp790621656 阅读数 1169

Unity3d的碰撞

两个物体一定要加上BoxCollider和Rigidbody。


另外,一定要注意Layers的影响。


在Unity3d中可以配置Layers之间是否可以发生碰撞。



在打开的界面中可以进行层次之间是否可以发生碰撞的设置。

只有交叉点是打勾的,才能发生碰撞。


Unity3D里的碰撞检测

阅读数 1772

Unity3D碰撞检测

阅读数 16542

没有更多推荐了,返回首页