Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> 前端开发 文章内容

unity --24 物理引擎--刚体,碰撞体-itarticl.cc-IT技术类文章记录&分享

发布时间: 4年前前端开发 115人已围观返回

刚体

物理引擎:模拟真实世界中物体的物理特性。 带有刚体组件的游戏物体,刚体组件可使游戏对象受物理引擎控制,在受到外力时产 生真实世界中的运动。

from clipboard

质量Mass:物体的质量。

•阻力Drag:当受力移动时物体受到的空气阻力。0表示没 有空气阻力,极大时可使物体停止运动

•角阻力Angular Drag:当受扭力旋转时物体受到的空气阻 力。0表示没有空气阻力,极大时使物体停止旋转。

•使用重力Use Gravity:若激活,则物体受重力影响。

•是否是运动学Is Kinematic:若激活,该物体不再受物理 引擎控制,即自身不受作用力。

插值Interpolate:用于缓解刚体运动时的抖动。

Collision Detection:碰撞检测模式。快速移动 的刚体在碰撞时有可能互相穿透,可以设置碰撞检测频率, 但频率越高对物理引擎性能影响越大。 不连续Discrete:不连续碰撞检测。适用于普通碰撞(默 认模式)。 连续Continuous:连续碰撞检测。 动态连续Continuous Dynamic:连续动态碰撞检测,适用 于高速物体。

碰撞体

使刚体具有碰撞效果,可以单独作用于物体,但是要使移动的物体具有碰撞效果 必须附加刚体组件。

分类

•静态碰撞器Static Collider :只有碰撞器没有刚体的物体 现象:保持静止或者轻微移动,如:平面/树木

•刚体碰撞器RigidbodyCollider:具有刚体和碰撞器的物体; 现象:完全受物理引擎影响。

•运动学刚体碰撞器: 带刚体,且勾选Is Kinematic,此碰撞器 不能添加力,只能通过transform移动。

from clipboard

物理引擎会工作有两个条件:

①物体A有刚体

②刚体所属的物体A在运动

当物体A去碰撞物体B时,满足条件,物理引擎持续检测,直到碰撞发生。 反之,如果物体B去碰撞物体A,因为物体B没有刚体,如果物体A静止,物理引擎不会工作。

from clipboard

只有当碰撞发生后,才会有碰撞事件:

①void OnCollisionEnter(Collision collOther) 当进入碰撞时执行,除非重复碰撞,否则只执行一次

②void OnCollisionStay(Collision collOther) 当碰撞体与刚体接触时每帧执行,会执行N次

③void OnCollisionExit(Collision collOther) 当停止(退出)碰撞时执行,除非重复碰撞,否则只执行一次

同时,该碰撞事件的脚本可以挂载物体A上,也可以挂载物体B上。

from clipboard

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class aaa : MonoBehaviour

{

public Transform cube;

void Update ()

{

}

private void OnCollisionEnter(Collision collision)

{

print(" OnCollisionEnter");

print( collision.collider.name);

//collision.contacts 接触点的数组集合

//collision.contacts[0] 第一个接触点

}

}

from clipboard

所以参数 collision代表的是被撞的那个物体的碰撞器。

碰撞发生的必备条件:

① 物体有刚体

②该物体在运动

③两者都具有碰撞体

触发器

带有碰撞器组件,且Is Trigger属性被勾选的物体。 •现象:无碰撞效果。 一但点选Is Trigger,该碰撞器就变成了触发器,没有碰撞效果。

from clipboard

void OnTriggerEnter(Collider cldOther) 当Collider(碰撞体)进入触发器时执行

void OnTriggerStay(Collider cldOther) 当碰撞体与触发器接触时每帧执行

void OnTriggerExit(Collider cldOther) 当停止触发时执行

from clipboard

触发器产生的必备条件:

①两者一个具有碰撞体组件,另一个具有触发器组件

②其中之一带有刚体组件

可见触发器的条件比碰撞器要宽泛,没那么严格。 参数cldOther和前面的collision不同,前者就是碰撞体组件,等价于collision.collider。 一个触发器和一个碰撞体是互斥的,有了触发,就没有碰撞效果,也就不会调用OnCollision系列函数。

当然一个物体可以绑多个碰撞体,比如物体A绑了两个碰撞体,其中一个修改为触发器。

from clipboard

那么物理引擎会分别计算: 物体A的碰撞体+刚体与物体B的碰撞体有碰撞效果。 物体A的触发器+刚体与物体B的碰撞体有触发效果。

适用范围

什么时候用碰撞体? 物体非背景,要有“阻挡”效果的时候,如墙壁,桌椅,地板等等。

什么时候用刚体? 物体非背景,即有“阻挡”效果,又有物理受力效果。

什么时候使用触发器?物体可以是背景,也可以非背景,强调“接触”效果。如生命球,能拾取的金币等等。

发布时间: 4年前前端开发115人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    114人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流