物理系统中最常用的组件是Rigidbody和Collider。Rigidbody(刚体)使物体能在物理规律下运动,它是物体系统的基础组件。可以从力和碰撞两方面来理解物理系统。
力(重力)
一个带有Collider和Rigidbody的物体从高空落下,因为有力的作用,在物体碰到地面后会倒下。下面我们用一个场景来说明效果: 新建一个Unity3D工程,在层级面板创建一个圆柱体和地面(它们默认附带有Collider组件),创建后的层级面板如下图:
旋转圆柱体使其有一个倾斜角度(更明显的看出效果),然后给圆柱体添加Rigidbody组件(属性面板中Add Component --> Physics --> Rigidbody),场景界面如下图所示,运行游戏会发现圆柱体受到重力的影响掉到地上,然后倒下。
力(附加力)
通过程序给物体施加力,即可改变物体的运动轨迹。例如编写如下代码(创建一个名为TestForce的Script脚本),把它附加到上述例子的圆柱体上。如果按下空格键,则是通过Rigidbody的AddForce方法给物体施加一个力(这里施加的是一个方向向上,大小为50N的力)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestForce : MonoBehaviour
{
//每帧更新
void Update()
{
if (Input.GetKey(KeyCode.Space))
{
Rigidbody rigi = gameObject.GetComponent<Rigidbody>();
Vector3 force = Vector3.up * 50;
rigi.AddForce(force);
}
}
}
神奇的事情发生了,你会发现,把脚本拖到圆柱体后运行游戏,圆柱体会向下掉,当你按下空格键时,圆柱体又会向上升起。你不停的按动空格键,圆柱体就可以不断的升起和落下,从而保持原来的位置不变。
碰撞
当“带有Rigidbody和Collider的游戏对象”碰撞到场景中的“带有Collider的游戏对象”时,OnCollisionEnter()方法将被调用。相关的方法有6个,具体见表:
方法 | 说明 |
---|---|
MonoBehaviour.OnTriggerEnter(Collider other) | 当进入触发器 |
MonoBehaviour.OnTriggerStay(Collider other) | 当停留在触发器内 |
MonoBehaviour.OnTriggerExit(Collider other) | 当退出触发器 |
MonoBehaviour.OnCollisionEnter(Collision collisionInfo) | 当进入触发器 |
MonoBehaviour.OnCollisionStay(Collision collisionInfo) | 当停留在触发器内 |
MonoBehaviour.OnCollisionExit(Collision collisionInfo) | 当退出触发器 |
在上面圆柱体掉落例子的TestForce类中,添加如下的语句。
//当碰撞到物体
void OnCollisionEnter(Collision collisionInfo)
{
Debug.Log("碰撞到" + collisionInfo.gameObject.name);
}
运行游戏,在圆柱体碰到地面的时候,OnCollisionEnter方法会调用,如下图所示。