Unity3D之碰撞体,刚体
一 概念介绍
刚体
Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。
碰撞体
碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。
二 属性
刚体Rigidbody组件的属性
Mass质量 该项用于设置游戏对象的质量(建议在同一个游戏场景中,游戏对象之间的质量差值不要大于100倍)。
Drag阻力 0表示没有空气阻力,阻力极大时游戏对象会立即停止运动。
Angular Drag角阻力 当游戏对象受扭矩力旋转时受到的空气阻力。0表示没有空气阻力,阻力极大时游戏对象会立即停止运动。
Use Gravity使用重力 开启此项,游戏对象受重力影响。
Is Kinematic是否开启动力学 开启此项,游戏对象将不再受物理引擎的影响从而只能通过Transform(几何变换组件)属性来对其操作,该方式适用于模拟平台移动或带有铰链关节链接刚体的动画。
Interpolate插值 该项用于控制刚体运动的抖动情况。有三项可以选择:
- None没有插值
- Interpolate内插值,基于前一帧的Transform来平滑此次的Transform。
- Extrapolate外插值,基于下一帧的Transform来平滑此次的Transform。
Collision Detection碰撞检测 该属性用于控制避免高速运动的游戏对象穿过其他对象而未发生碰撞,有三项可以选择:
Discrete离散碰撞检测 该模式与场景中其他的所有碰撞体进行碰撞检测,是默认值。
- Continuous连续碰撞检测 该模式用于检测与动态碰撞体(带有Rigidbody)的碰撞,使用连续碰撞检测模式来检测与网格碰撞体的(不带Rigidbody)碰撞。其他的刚体采用离散碰撞模式。此模式适用于那些需要与采用连续动态碰撞检测的对象相碰撞的对象:这对物理性能会有很大的影晌 ,如果不需要对快速运动的对象进行碰撞检测,就使用离散碰撞检测模式。
- Continuous Dynamic连续动态碰撞检测模式 该模式用于检测与采用连续碰撞模式或连续动态碰撞模式对象的碰撞 ,也可用于检 测 没 有Rigidbody的静态网格碰撞体 。 对于与之碰撞的其他对象可采用离散碰撞检测。 动态连续 碰撞检测模式也可用于检测快速运动的游戏对象。
Constraints约束 该项用于控制刚体运动的约束。
- Freeze Position:冻结位置。刚体对象在世界坐标系中xyz轴方向上(勾选状态)的移动无效。
- Freeze Rotation:冻结旋转。刚体对象在世界坐标系中xyz轴方向上(勾选状态)的旋转无效。
使用刚体
刚体在受物理引擎作用之前必须要明确地添加给一个游戏对象,之后该对象就会受到重力和通过脚本添加的作用力的影响。
举个例子吧:比如让一个小球碰撞一个立方体。
首先要给小球添加一个刚体组件Rigidbody,确定"Use Gravity"和"Is Kinematic"(是否动力学)为取消状态,即不使用重力模拟和确保受到物理力学的影响。
由于创建一个球体时,Unity会默认添加了一个Sphere Collider,所以不需要再添加碰撞体。
现在为小球添加一个脚本(C#)用来控制小球的移动和碰撞检测。
脚本代码如下:
using UnityEngine;
using System.Collections; public class OperateBall : MonoBehaviour
{ public float speed;//控制小球的移动速度
// Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rigidbody.AddForce(movement * speed * Time.deltaTime);
} void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "pickup")
{
other.gameObject.SetActive(false);//如果是立方体,碰撞后设为禁用,在Game中就不会显示
}
}
}
接着来设置一下cube立方体的属性,确保Box Collider中的"Is Trigger"选项被勾选上。
Is Trigger为选中状态,表明cube是一个触发器,当小球碰撞它是会触发小球脚本(BallControl.cs)中OnTriggerEnter的事件,接下来cube就会被禁用,不会显示在Game中。
如果不选中Is Trigger,那么则无法用脚本来控制小球的移动。
碰撞前:
碰撞后:
注意
触发事件,必须满足如下三个条件:
1、必须都要有碰撞器组件(Collider)。
2、必须有一个物体带刚体组件,并且处于运动状体中(包括主动运动去撞击别人和在运动过程中被别人撞击)。
3、两个碰撞器中至少有一个开启了IsTrigger。
Unity3D之碰撞体,刚体的更多相关文章
- Unity3D使用碰撞体做触发器实现简单的自己主动开门
在游戏制作中触发器的使用很的方便也很有用. 这一张我们简介一下怎样使用一个简单的触发器来实现自己主动开门关门的效果. 首先确保你已经对门进行了动画的设置. 详细流程例如以下. 选择Window- ...
- unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)
刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...
- 【Unity3D】刚体与碰撞体以及is Trigger属性的意义
[Unity3D]刚体与碰撞体以及is Trigger属性的意义 刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚 ...
- [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)
通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...
- u3d中刚体与碰撞体的理解以及is Trigger属性的意义
刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚体与碰撞体的关系:个人理解判断碰撞体就是需要计算力,如果碰撞的物体 ...
- U3D中碰撞体和刚体的关系
1.刚体是用来接受力作用的组件: 2.碰撞体是碰撞系统用来检测碰撞的组件: 碰撞产生碰撞信息,游戏物体根据碰撞信息生成一个力作用在刚体上,刚体受力后就会产生一个速率,最终在游戏物体的运动体现出来. 也 ...
- unity3d关于碰撞问题
这个是我做忍者游戏出现的问题,做个记录也为以后有人遇到也可以借鉴.因为刚接触unity,所以对其所知甚少,说错的地方请指教. 问题:角色碰撞墙为什么会先触发碰撞地面,然后再触发碰撞墙 想要的效果:是角 ...
- 胶囊碰撞体(CapsuleCollider)
胶囊碰撞体 (Capsule Collider) 胶囊碰撞体 (Capsule Collider) 由两个半球体与一个圆柱体相连接而构成.它与胶囊 (Capsule) 基元形状相同. 一堆胶囊碰撞 ...
- 【Unity】11.4 车轮碰撞体(Wheel Collider)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 车轮碰撞体 (Wheel Collider)专门用于创建汽车或其他移动交通工具. 车轮碰撞体是一种针对地面车辆的特殊碰撞 ...
随机推荐
- cocos2dx 3.x避免空customCommand
1,导致性能悲剧的写法: class A:public CCNode{ public: A(){ m_sprite=NULL; m_isDrawDebug=false; } virtual~A(){} ...
- Excel中不常用的一些公式用法
INDIRECT函数 http://baike.baidu.com/view/3222185.htm 用于使用单元格内容拼凑公式的情况. 1.采用 [工作表名]!单元格名 的形式读取内容: 2.所 ...
- CSS实现超级链接需要通过双击后跳转
超级链接需要双击后跳转如何实现. CSS代码.test3 span { position: relative;}.test3 span a { position: relative;z-index: ...
- 基于FPGA的异步FIFO设计
今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...
- mysql 的S 锁和X锁的区别
共享锁和排它锁 MySQL的锁系统:shared lock和exclusive lock(共享锁和排他锁,也叫读锁和写锁,即read lock和write lock) 读锁是共享的,或者说是相互不阻塞 ...
- 特效effects(二)
CCActionInterval* createEffect(int nIndex, float t) { CCDirector::sharedDirector()->setDepthTest( ...
- singer页面点击歌手singer是跳转到singer-detail的设置
1.创建components/singer-detail/singer-detail.vue 2.配置动态路由: { path: ':id', name:'singer-detail', compon ...
- TagsView.vue
1.TagsView.vue <template> <div class="tags-view-container"> <scroll-pane cl ...
- 开发中tomcat缓存问题
tomcat-清除缓存 方法一: conf/server.xml文件 Context path中间加上reloadable="true" 例如:<Context pat ...
- 由sqlite在手机上的存储位置,引发的onCreate在哪里执行的小结
我们都知道,android为了操作数据库,一般是继承SQLiteOpenHelper类,并实现他的三个函数. 如下所示: package jz.his.db; import android.conte ...