Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)

在 Unity 3D 中,物理引擎内置的关节组件能够使游戏对象模拟具有关节形式的连带运动。

关节对象可以添加至多个游戏对象中,添加了关节的游戏对象将通过关节连接在一起并具有连带的物理效果。

需要注意的是,关节组件的使用必须依赖刚体组件。

铰链关节

Unity 3D 中的两个刚体能够组成一个铰链关节,并且铰链关节能够对刚体进行约束。

具体使用时,执行菜单栏中的 Component → Physics → Hinge Joint 命令,为指定的游戏对象添加铰链关节组件。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第1张图片

然后,在相应的 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 射线

射线是三维世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。

射线应用范围比较广,广泛应用于

  • 路径搜寻。

  • AI逻辑。

  • 命令判断。

例如,自动巡逻的敌人在视野前方发现玩家的时候会向玩家发起攻击,这时候就需要使用射线了。

接下来我们通过一个案例来了解射线在游戏开发中的应用。

案例设计

在 Unity 3D 内创建一个简单的三维场景,场景内放有 Cube 和 PlanePlane 用于充当地面,Cube 用于做拾取物体测试。

当单击 Cube 时,它会发出一条射线,同时在 Console 面板中出现 pick up 字样。

案例实施

  1. 创建一个平面(0,0,0)和一个小球(0,1,0),使小球置于平面上方。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第2张图片

  1. 创建 C# 脚本,将其命名为 RayTest


  1. using UnityEngine;
  2. using System.Collections;
  3. public class RayTest:MonoBehaviour{
  4. void Update(){
  5. if(Input.GetMouseButton(0)){
  6. //从摄像机到单击处发出射线
  7. Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
  8. RaycastHit hitInfo;
  9. if(Physics.Raycast(ray, out hitInfo)){
  10. //画出射线, 只有在Scene视图中才能看到
  11. Debug.DrawLine(ray.origin, hitInfo.point);
  12. GameObject gameObj=hitInfo.collider.gameObject;
  13. Debug.Log("click object name is"+gameObj.name);
  14. //当射线碰撞目标的标签是Pickup时, 执行拾取操作
  15. if(gameObj.tag=="Pickup"){
  16. Debug.Log("pick up!");
  17. }
  18. }
  19. }
  20. }
  21. }

首先创建一个 Ray 对象,从摄像机发出到单击处的射线。

Debug.DrawLine 函数将射线可视化。接下来进行判断,如果鼠标单击的物体标签是 Pickup,则在控制面板中输出 pick up 字样。

  1. 将脚本链接到主摄像机上。

  1. 为 Cube 添加 Pickup 标签

  1. 运行测试。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第3张图片

Unity 3D 物理管理器(Physics Manager) 

Unity 3D 集成开发环境作为一个优秀的游戏开发平台,提供了出色的管理模式,即物理管理器(Physics Manager)。

物理管理器管理项目中物理效果的参数,如物体的重力、反弹力、速度和角速度等。

在 Unity 3D 中执行 Edit → Project Settings → Physics 命令可以打开物理管理器。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第4张图片

可以根据需要通过调整物理管理器中的参数来改变游戏中的物理效果,参考以下参数列表:

选项 含义 描述
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 层碰撞矩阵 定义层碰撞检测系统的行为。

实践案例

  1. 创建新项目。场景命名为 migong。

  1. 创建游戏对象。

执行菜单栏中的 GameObject → 3D Object → Plane 命令,创建平面,并赋予材质。

执行 GameObject → 3D Object → Cube 命令创建若干个盒子,构成迷宫场景。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第5张图片

  1. 导入模型资源。

从 Unity 3D 商店中选择 3D 模型资源并加载到场景中,将其命名为 treasure.

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第6张图片

  1. 将模型资源导入到 Hierarchy 视图中.

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第7张图片

  1. 执行 Assets → Import Package → Custom Package 命令添加第一人称资源。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第8张图片

  1. 选中第一人称资源后单击 Import 按钮导入该资源。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第9张图片

  1. 在 Project 视图中搜索 first person controller,将其添加到 Hierarchy 视图中,并摆放到平面上合适的位置。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第10张图片

  1. 因为第一人称资源自带摄像机,因此需要关掉场景中的摄像机。

以下第9-10步添加触发器。

  1. 选中 treasure,为 treasure 对象添加 Box Collider,并勾选 Is Trigger 属性

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第11张图片

  1. 编写脚本 "Triggers.cs"。


  1. using UnityEngine;
  2. using System.Collections;
  3. public class Triggers:MonoBehaviour{
  4. void OnTriggerEnter(Collider other){
  5. if(other.tag=="Pickup"){
  6. Destroy(other.gameObject);
  7. }
  8. }
  9. }

  1. 将 Triggers 脚本链接到 first person controller 上。

  1. 为 treasure 添加标签 Pickup

以下第13-14步开始修改脚本。

  1. 修改脚本。


  1. using UnityEngine;
  2. using System.Collections;
  3. public class Triggers:MonoBehaviour{
  4. public static int temp_Num=0;
  5. void OnTriggerEnter(Collider other){
  6. if(other.tag=="Pickup"){
  7. temp_Num++;
  8. Destroy(other.gameObject);
  9. }
  10. }
  11. void OnGUI(){
  12. if(temp_Num==5)
  13. if(GUI.Button(new Rect(Screen.width/2f, Screen.height/2f, 100, 50),"play again")){
  14. temp_Num=0;
  15. Application.LoadLevel("migong");
  16. }
  17. }
  18. }

  1. 将场景添加到 Build Settings 中。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第12张图片

以下第15步开始添加计时功能。

  1. 完善代码。


  1. using UnityEngine;
  2. using System.Collections;
  3. public class Triggers:MonoBehaviour{
  4. public static int temp_Num=0;
  5. public int parachuteNum;
  6. int timer;
  7. int time_T;
  8. bool isWin=false;
  9. bool isLose=false;
  10. void Start(){
  11. Time.timeScale=1;
  12. GameObject[]objs=GameObject.FindGameObjectsWithTag("Pickup");
  13. parachuteNum=objs.Length;
  14. time_T=(int)Time.time;
  15. }
  16. void Update(){
  17. timer=20-(int)Time.time+time_T;
  18. if(temp_Num==parachuteNum&&timer!=0){
  19. isWin=true;
  20. }
  21. if(timer==0&&temp_Num!=parachuteNum){
  22. isLose=true;
  23. }
  24. }
  25. void OnTriggerEnter(Collider other){
  26. if(other.tag=="Pickup"){
  27. temp_Num++;
  28. Destroy(other.gameObject);
  29. }
  30. }
  31. void OnGUI(){
  32. GUI.Label(new Rect(0, 0, 100, 50), timer.ToString());
  33. if(isWin==true||isLose==true){
  34. Time.timeScale=0;
  35. if(GUI.Button(new Rect(Screen.width/2f, Screen.height/2f, 100, 50), "play again")){
  36. isWin=false;
  37. isLose=false;
  38. temp_Num=0;
  39. Application.LoadLevel("migong");
  40. }
  41. }
  42. }
  43. }

  1. 进行测试。

Unity 3D 关节||Unity 3D 射线||Unity 3D 物理管理器(Physics Manager)_第13张图片

你可能感兴趣的:(unity教程,unity,3d,游戏引擎)