• 您的位置:首页 > 新闻动态 > Unity3D

    unity的碰撞检测详细解释

    2018/3/5      点击:
    1.[AddComponentMenu("MyGame/Player")] //在Component菜单中加入“MyGame/Player”选项
    2.Time.deltaTime表示每帧的经过时间,那些需要每帧做增减变动的数值都需要乘上Time.deltaTime
    3.MonoBehaviour的派生类不能使用构造函数初始化
    4.unity的游戏体只能使用Instantiate函数实例化,不能使用new
    5.OnTriggerEnter函数触发条件:首先两个物体都要加碰撞体,被碰撞的物体必须勾选Is Trigger使其监测触发(不要加刚体),负责碰撞的物体必须加上刚体来触发被碰撞物体(加上刚体才拥有了触发别人的作用,不要勾选Is Trigger)。
    或者负责碰撞的物体勾选Is Trigger使其监测触发(不要加刚体),然后被碰撞的物体加上刚体。(不要勾选Is Trigger)


    6.OnCollisionEnter(碰撞瞬间)函数和OnCollisionExit(离开)调用条件:首先两个物体都要加碰撞体,且Is Trigger(因为勾选了它,则碰撞失效)都必须勾掉,另外:刚体碰非刚体会碰撞(这里碰撞指的是调用碰撞函数),非刚体碰刚体不会碰撞(详细来说就是:运动中的刚体碰非刚体,则会调用被撞物体和撞物体的OnCollisionEnter系列函数),OnCollisionStay(接触)函数调用条件:两个满足条件的物体挨着的时候就会调用OnCollisionStay
    7.Is Trigger和Is Kinematic属性详解
    Is Trigger:选中Is Trigger开启触发器(触发器的范围则是碰撞的范围),则碰撞属性失效了
    Is Kinematic:选中Is Kinematic开启运动学状态(一切物体保持静止或保持匀速向前运动,除非有外力影响它的状态,这里的运动学状态指的是匀速向前运动,牛顿大侠的理论)。如选中,该物体不会受到外力,但是需要注意的是碰撞还在(碰撞不属于刚体组件,它是在碰撞体组件里)
    注:1.角色控制器(即Character Controller)不发力不受力但是可以被由代码施加的力推动,,如果加Rigidbody组件,则这两个会冲突(这是unity中非自然的一部分)
    2.运动学刚体发力不受力
    3.刚体发力且受力
    4.有时候碰撞可以产生反作用力,比如角色控制器可以通过碰撞给一个运动中的刚体反作用力
    5.刚体静止时,则会进入休眠状态,休眠状态中刚体属性不生效,比如阻力,重力,摩擦力。如何激活刚体使其唤醒:给它力,让它平移等。(这是unity中非自然的一部分)
    6.现实生活中,先有往某个方向的力才会有反方向的阻力,而且一般情况下阻力比该方向的力小,但在unity中,阻力是可以事先设置的,当阻力大于作用力时,物体会向阻力的方向运动,是不是很反自然?(这是unity中非自然的一部分)
    7. 如果两个物体都不是刚体,都有碰撞体,结果穿透,都不会调用碰撞函数
    8.物体1是动力学刚体且有碰撞体,物体2没有刚体有碰撞体,结果穿透,都不会调用碰撞函数
    9.物体1是动力学刚体且有碰撞体,物体2有刚体有碰撞体,结果碰了,调用碰撞函数(不同情况调用不同函数。比如速度不同,调用函数不同[比如速度过快会穿过去])

    表格:(针对于OnCollisionEnter系列函数,默认都有碰撞体,重力都取消了,表格列出的现象可能片面)


    Cube

    Sphere

    现象

    刚体

    刚体

    动力学

    运动状态

    刚体

    刚体

    动力学

    运动状态

    互相穿透不干扰

    互相穿透不干扰

    碰撞检测,且Cube不会被撞开

    碰撞检测,且Cube不会被撞开

    互相穿透不干扰

    互相穿透不干扰

    碰撞检测,且Sphere不会被撞开

    碰撞检测,且相互撞开

    碰撞检测,且Sphere随Cube动

    碰撞检测,且Sphere不会被撞开

    碰撞检测,且Sphere不会被撞开

    碰撞检测,且Cube不会被撞开

    嵌入时,碰撞检测,且Cube不会被撞开

    互相穿透不干扰

    嵌入时,互不干扰

    嵌入时,碰撞检测,互相撞开

    碰撞检测,且Cube随Sphere动

    嵌入时,碰撞检测,Sphere不会被撞开

    互相穿透不干扰

    互相穿透不干扰

    互相穿透不干扰


    8.this.transform.parent = surface.transform; //改变该物体(this.transform)的父级,父物体为surface.transform处的物体