在 Unity 3D 中,物理引擎内置的关节组件能够使游戏对象模拟具有关节形式的连带运动。
关节对象可以添加至多个游戏对象中,添加了关节的游戏对象将通过关节连接在一起并具有连带的物理效果。
需要注意的是,关节组件的使用必须依赖刚体组件。
铰链关节
Unity 3D 中的两个刚体能够组成一个铰链关节,并且铰链关节能够对刚体进行约束。
具体使用时,执行菜单栏中的 Component
→ Physics
→ Hinge Joint
命令,为指定的游戏对象添加铰链关节组件。
然后,在相应的 Inspector 属性面板中设置属性,参考属性列表。
参 数 | 含义 | 描述 |
---|---|---|
Connected Body |
连接刚体 | 指定关节要连接的刚体。 |
Anchor |
锚点 | 设置应用于局部坐标的刚体所围绕的摆动点。 |
Axis |
轴 | 定义应用于局部坐标的刚体摆动的方向。 |
Use Spring |
使用弹簧 | 使刚体与其连接的主体物形成特定高度。 |
Spring |
弹簧 | 用于勾选使用弹簧选项后的参数设定。 |
Use Motor |
使用马达 | 使对象发生旋转运动。 |
Motor |
马达 | 用于勾选使用马达选项后的参数设定。 |
Use Limits |
使用限制 | 限制铰链的角度。 |
Limits |
限制 | 用于勾选使用限制选项后的参数设定。 |
Break Force |
断开力 | 设置断开铰链关节所需的力。 |
Break Torque |
断开转矩 | 设置断开铰链关节所需的转矩。 |
固定关节
在 Unity 3D 中,用于约束指定游戏对象对另一个游戏对象运动的组件叫作固定关节组件,其类似于父子级的关系。
具体使用时,执行菜单栏中的 Component
→ Physics
→ Fixed Joint
命令,为指定游戏对象添加固定关节组件。
当固定关节组件被添加到游戏对象后,在相应的Inspector属性面板中设置相关属性,参考属性列表。
参 数 | 含义 | 描述 |
---|---|---|
Connected Body |
连接刚体 | 指定关节要连接的刚体。 |
Break Force |
断开力 | 设置断开固定关节所需的力。 |
Break Torque |
断开转矩 | 设置断开固定关节所需的转矩。 |
弹簧关节
在 Unity 3D 中,将两个刚体连接在一起并使其如同弹簧一般运动的关节组件叫弹簧关节。
具体使用时,首先执行菜单栏中的 Component
→ Physics
→ Spring Joint
命令,为指定的游戏对象添加弹簧关节组件。
然后,在相应的 Inspector 属性面板中设置相关属性,参考属性列表。
参 数 | 含义 | 描述 |
---|---|---|
Connected Body |
连接刚体 | 指定关节要连接的刚体。 |
Anchor |
锚点 | 设置应用于局部坐标的刚体所围绕的摆动点。 |
Spring |
弹簧 | 用于勾选使用弹簧选项后的参数设定。 |
Damper |
阻尼 | 设置弹簧的阻尼值。 |
Min Distance |
最小距离 | 设置弹簧启用的最小距离数值。 |
Max Distance |
最大距离 | 设置弹簧启用的最大距离数值。 |
Break Force |
断开力 | 设置断开固定关节所需的力。 |
Break Torque |
断开转矩 | 设置断开固定关节所需的转矩。 |
角色关节
在 Unity 3D 中,主要用于表现布偶效果的关节组件叫作角色关节。
具体使用时,首先执行菜单栏中的 Component
→ Physics
→ Character Joint
命令,为指定的游戏对象添加角色关节组件。
然后,在相应的 Inspector 属性面板中设置相关属性,参考属性列表。
参 数 | 含义 | 描述 |
---|---|---|
Connected Body |
连接刚体 | 指定关节要连接的刚体。 |
Anchor |
锚点 | 设置应用于局部坐标的刚体所围绕的摆动点。 |
Axis |
扭动轴 | 角色关节的扭动轴。 |
Swing Axis |
摆动轴 | 角色关节的摆动轴。 |
Low Twist Limit |
扭曲下限 | 设置角色关节扭曲的下限。 |
High Twist Limit |
扭曲上限 | 设置角色关节扭曲的上限。 |
Swing 1 Limit |
摆动限制1 | 设置摆动限制。 |
Swing 2 Limit |
摆动限制2 | 设置摆动限制。 |
Break Force |
断开力 | 设置断开固定关节所需的力。 |
Break Torque |
断开转矩 | 设置断开固定关节所需的转矩。 |
可配置关节
Unity 3D 为游戏开发者提供了一种用户自定义的关节形式,其使用方法较其他关节组件烦琐和复杂,可调节的参数很多。
具体使用时,首先执行菜单栏中的 Component
→ Physics
→ Configurable Joint
命令,为指定游戏对象添加可配置关节组件。
然后,在相应的 Inspector 属性面板中设置相关属性,参考参数列表。
参 数 | 含义 | 描述 |
---|---|---|
Connected Body |
连接刚体 | 指定关节要连接的刚体。 |
Anchor |
锚点 | 设置关节的中心点。 |
Axis |
主轴 | 设置关节的局部旋转轴。 |
Secondary Axis |
副轴 | 设置角色关节的摆动轴。 |
X Motion |
X 轴移动 | 设置游戏对象基于 X 轴 的移动方式。 |
Y Motion |
Y 轴移动 | 设置游戏对象基于 Y 轴 的移动方式。 |
Z Motion |
Z 轴移动 | 设置游戏对象基于 Z 轴 的移动方式。 |
Angular X Motion |
X 轴旋转 | 设置游戏对象基于 X 轴 的旋转方式。 |
Angular Y Motion |
Y 轴旋转 | 设置游戏对象基于 Y 轴 的旋转方式。 |
Angular Z Motion |
Z 轴旋转 | 设置游戏对象基于 Z 轴 的旋转方式。 |
Linear Limit |
线性限制 | 以其关节原点为起点的距离对齐运动边界进行限制的设置。 |
Low Angular X Limit |
X 轴旋转下限 | 设置基于 X 轴 关节初始旋转差值的旋转约束下限。 |
High Angular X Limit |
X 轴旋转上限 | 设置基于 X 轴 关节初始旋转差值的旋转约束上限。 |
Angular Y Limit |
Y 轴旋转限制 | 设置基于 Y 轴 关节初始旋转差值的旋转约束。 |
Angular Z Limit |
Z 轴旋转限制 | 设置基于 Z 轴 关节初始旋转差值的旋转约束。 |
Target Position |
目标位置 | 设置关节应达到的目标位置。 |
Target Velocity |
目标速度 | 设置关节应达到的目标速度。 |
X Drive |
X 轴驱动 | 设置对象沿局部坐标系 X 轴 的运动形式。 |
Y Drive |
Y 轴驱动 | 设置对象沿局部坐标系 Y 轴 的运动形式。 |
Z Drive |
Z 轴驱动 | 设置对象沿局部坐标系 Z 轴 的运动形式。 |
Target Rotation |
目标旋转 | 设置关节旋转到目标的角度值。 |
Target Angular Velocity |
目标旋转角速度 | 设置关节旋转到目标的角速度值。 |
Angular X Drive |
X 轴角驱动 | 设置关节围绕 X 轴 进行旋转的方式。 |
Angular YZ Drive |
YZ 轴角驱动 | 设置关节围绕 Y、Z 轴 进行旋转的方式。 |
Slerp Drive |
球面线性插值驱动 | 设定关节围绕局部所有的坐标轴进行旋转的方式。 |
Projection Mode |
投影模式 | 设置对象远离其限制位置时使其返回的模式。 |
Projection Distance |
投影距离 | 在对象与其刚体链接的角度差超过投影距离时使其回 到适当的位置。 |
Projection Angle |
投影角度 | 在对象与其刚体链接的角度差超过投影角度时使其回 到适当的位置。 |
Configured In World Space |
在世界坐标系中配置 | 将目标相关数值都置于世界坐标中进行计算。 |
Swap Bodies |
交换刚体功能 | 将两个刚体进行交换。 |
Break Force |
断开力 | 设置断开固定关节所需的力。 |
Break Torque |
断开转矩 | 设置断开固定关节所需的转矩。 |
Enable Collision |
激活碰撞 | 激活碰撞属性。 |
射线是三维世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。
射线应用范围比较广,广泛应用于
例如,自动巡逻的敌人在视野前方发现玩家的时候会向玩家发起攻击,这时候就需要使用射线了。
接下来我们通过一个案例来了解射线在游戏开发中的应用。
案例设计
在 Unity 3D 内创建一个简单的三维场景,场景内放有 Cube
和 Plane
,Plane
用于充当地面,Cube
用于做拾取物体测试。
当单击 Cube
时,它会发出一条射线,同时在 Console
面板中出现 pick up
字样。
案例实施
RayTest
。using UnityEngine;
using System.Collections;
public class RayTest:MonoBehaviour{
void Update(){
if(Input.GetMouseButton(0)){
//从摄像机到单击处发出射线
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if(Physics.Raycast(ray, out hitInfo)){
//画出射线, 只有在Scene视图中才能看到
Debug.DrawLine(ray.origin, hitInfo.point);
GameObject gameObj=hitInfo.collider.gameObject;
Debug.Log("click object name is"+gameObj.name);
//当射线碰撞目标的标签是Pickup时, 执行拾取操作
if(gameObj.tag=="Pickup"){
Debug.Log("pick up!");
}
}
}
}
}
首先创建一个 Ray 对象
,从摄像机发出到单击处的射线。
Debug.DrawLine 函数
将射线可视化。接下来进行判断,如果鼠标单击的物体标签是 Pickup
,则在控制面板中输出 pick up
字样。
Cube
添加 Pickup 标签
。Unity 3D 集成开发环境作为一个优秀的游戏开发平台,提供了出色的管理模式,即物理管理器(Physics Manager)。
物理管理器管理项目中物理效果的参数,如物体的重力、反弹力、速度和角速度等。
在 Unity 3D 中执行 Edit
→ Project Settings
→ Physics
命令可以打开物理管理器。
可以根据需要通过调整物理管理器中的参数来改变游戏中的物理效果,参考以下参数列表:
选项 | 含义 | 描述 |
---|---|---|
Gravity |
重力 | 应用于所有刚体,一般仅在 Y 轴 起作用。 |
Default Material |
默认物理材质 | 如果一个碰撞体没有设置物理材质,将采用默认材质。 |
Bounce Threshold |
反弹阈值 | 如果两个碰撞体的相对速度低于该值,则不会反弹。 |
Sleep Velocity |
休眠速度 | 低于该速度的物体将进人休眠。 |
Sleep Angular Velocity |
休眠角速度 | 低于该角速度的物体将进人休眠。 |
Max Angular Velocity |
最大角速度 | 用于限制刚体角速度,避免旋转时数值不稳定。 |
Min Penetration For Penalty |
最小穿透力 | 设置在碰撞检测器将两个物体分开前,它们可以穿透 多少距离。 |
Solver Iteration Count |
迭代次数 | 决定了关节和连接的计算精度。 |
Raycasts Hit Triggers |
射线检测命中 触发器 | 如果启用此功能,在射线检测时命中碰撞体会返回一 个命中消息;如果关闭此功能,则不返回命中消息。 |
Layer Collision Matrix |
层碰撞矩阵 | 定义层碰撞检测系统的行为。 |
实践案例
执行菜单栏中的 GameObject
→ 3D Object
→ Plane
命令,创建平面,并赋予材质。
执行 GameObject
→ 3D Object
→ Cube
命令创建若干个盒子,构成迷宫场景。
从 Unity 3D 商店中选择 3D 模型资源并加载到场景中,将其命名为 treasure.
Assets
→ Import Package
→ Custom Package
命令添加第一人称资源。Import 按钮
导入该资源。first person controller
,将其添加到 Hierarchy 视图中,并摆放到平面上合适的位置。以下第9-10步添加触发器。
treasure
,为 treasure 对象
添加 Box Collider
,并勾选 Is Trigger 属性
。using UnityEngine;
using System.Collections;
public class Triggers:MonoBehaviour{
void OnTriggerEnter(Collider other){
if(other.tag=="Pickup"){
Destroy(other.gameObject);
}
}
}
Triggers 脚本
链接到 first person controller
上。treasure
添加标签 Pickup
。以下第13-14步开始修改脚本。
using UnityEngine;
using System.Collections;
public class Triggers:MonoBehaviour{
public static int temp_Num=0;
void OnTriggerEnter(Collider other){
if(other.tag=="Pickup"){
temp_Num++;
Destroy(other.gameObject);
}
}
void OnGUI(){
if(temp_Num==5)
if(GUI.Button(new Rect(Screen.width/2f, Screen.height/2f, 100, 50),"play again")){
temp_Num=0;
Application.LoadLevel("migong");
}
}
}
Build Settings
中。以下第15步开始添加计时功能。
using UnityEngine;
using System.Collections;
public class Triggers:MonoBehaviour{
public static int temp_Num=0;
public int parachuteNum;
int timer;
int time_T;
bool isWin=false;
bool isLose=false;
void Start(){
Time.timeScale=1;
GameObject[]objs=GameObject.FindGameObjectsWithTag("Pickup");
parachuteNum=objs.Length;
time_T=(int)Time.time;
}
void Update(){
timer=20-(int)Time.time+time_T;
if(temp_Num==parachuteNum&&timer!=0){
isWin=true;
}
if(timer==0&&temp_Num!=parachuteNum){
isLose=true;
}
}
void OnTriggerEnter(Collider other){
if(other.tag=="Pickup"){
temp_Num++;
Destroy(other.gameObject);
}
}
void OnGUI(){
GUI.Label(new Rect(0, 0, 100, 50), timer.ToString());
if(isWin==true||isLose==true){
Time.timeScale=0;
if(GUI.Button(new Rect(Screen.width/2f, Screen.height/2f, 100, 50), "play again")){
isWin=false;
isLose=false;
temp_Num=0;
Application.LoadLevel("migong");
}
}
}
}