一、控制桥接

1. 创建传送带控制对象与速度控制对象
  • 题背景: 旋转点速度与传送带速度相互独立,需要分别调整,操作繁琐且容易出错。
  • 解决思路: 将所有速度控制信息集中到一个统一的位置,便于管理。
  • 创建控制对象:
    • 右键点击 Hierarchy 面板,创建一个新的空游戏对象,命名为 Conveyor Control。
    • 将启动按钮(Start Button)拖放到 Conveyor Control 下作为子对象。
    • 再创建一个空的游戏对象,命名为 Speed Control,用于统一管理速度。
  • 控制对象的作用: 空游戏对象可以作为容器,用来整理和组织其他相关的游戏对象,使层级结构更清晰。
2. 创建ConveyorSpeedControl脚本并定义速度变量
  • 创建脚本: 在 Scripts 文件夹中新建一个 C# 脚本,命名为 ConveyorSpeedControl。
  • 定义公共变量:
    • public float PulleySpeed = 50.0f; — 控制旋转点的速度,初始值为 50。
    • public float BeltSpeed = -1.0f; — 控制传送带的速度,初始值为 -1(与之前设置的传送带速度保持一致)。
  • 注意: 每个变量声明后都需要以分号结尾。
3. 修改BeltAnimation脚本以引用速度控制
  • 添加引用: 在 BeltAnimation 脚本中声明 public ConveyorSpeedControl spc;,用于获取速度控制脚本的实例。
  • 替换速度变量: 将原来直接乘以速度变量的部分,改为乘以 spc.BeltSpeed。
  • 实现效果: 传送带动画的滚动速度现在由 Speed Control 对象上的 ConveyorSpeedControl 脚本统一控制。
4. 修改ConveyorPulleys脚本以引用速度控制
  • 删除旧变量: 删除 ConveyorPulleys 脚本中原来的 speed 变量。
  • 添加引用: 声明 public ConveyorSpeedControl spc;,与 BeltAnimation 脚本中的引用方式一致。
  • 替换速度变量: 将旋转点旋转代码中的 speed 替换为 spc.PulleySpeed。
  • 实现效果: 前后两个旋转点的旋转速度现在也由 Speed Control 对象统一控制。
5. 在Inspector中连接脚本引用
  • 连接步骤:
    • 选中传送带(Conveyor)对象,在 Inspector 面板中找到 BeltAnimation 脚本组件。
    • 将 Speed Control 对象拖放到 spc 字段上。
    • 选中旋转点(Pulley)对象,在 Inspector 面板中找到 ConveyorPulleys 脚本组件。
    • 同样将 Speed Control 对象拖放到 spc 字段上。
  • 最终效果: 所有速度相关参数(旋转点速度、传送带速度)都集中在 Speed Control 对象上,只需调整一处即可同步控制整个传送带系统。
二、传送带物理效果第1部分
1. 物理效果的创建
1)创建传送带运动控制对象
  • 创建空对象:命名为“传送带运动控制”,用于统一管理传送带相关的旋转点、皮带和控制脚本。
  • 整理层级结构:将旋转点、皮带和传送带控制脚本全部放在该空对象下,使层级更清晰。
  • 控制方式:通过“速度控制”和“启动按钮”两个参数来控制传送带的所有组件。
2)测试速度控制
  • 速度调节:按下启动按钮后,传送带开始旋转;将速度设为0则停止,设为700则快速旋转。
  • 合适速率:经过测试,每50个单位较为合适,也可使用0.5的精度进行微调。
3)建立皮带速度与滑轮速度的关系
  • 删除错误脚本:驱动轴上的空脚本会报错,直接删除即可。
  • 自动调整逻辑:只需改变一个值,另一个值会自动变化。
  • 计算公式:皮带速度 = -滑轮速度 / 100(负号表示方向相反)。
  • 更新时机:在 Start() 和 Update() 中均执行此计算,确保实时同步。
  • 测试结果:滑轮速度设为80时,皮带速度自动变为-0.8;设为100时,所有组件同步调整,系统更稳定。
4)移除地板上的错误脚本
  • 问题:地板上存在一个来源不明的“传送带动画”脚本,导致报错。
  • 解决:停止模拟后,从地板上移除该脚本,重新保存并启动,错误消失。
5)创建传送带物理脚本
  • 新建脚本:命名为 ConveyorPhysics,从之前的课程中复制传送带物理效果的代码。
  • 核心逻辑:
    • 在 FixedUpdate() 中获取刚体当前位置。
    • 根据速度值沿指定方向移动刚体。
    • 使用 MovePosition() 实现物理移动。
6)添加刚体与碰撞器
  • 添加刚体:将刚体添加到物体上(而非传送带上),设置为 Is Kinematic 并移除重力,因为运动由脚本控制。
  • 添加传送带物理脚本:将 ConveyorPhysics 脚本挂载到物体上,速度初始保持为0。
7)创建传送带物体与测试立方体
  • 创建空对象:命名为“传送带物体”,在其中创建一个立方体作为测试物体。
  • 调整位置:将立方体放置在传送带上的合适位置。
  • 立方体刚体:立方体使用重力,不受脚本控制,因此不勾选 Is Kinematic。
  • 网格碰撞器:为立方体添加网格碰撞器,使其能与传送带发生物理交互。
8)测试物理效果
  • 初步测试:立方体放置在传送带上,重力效果初步正常。
  • 动画与物理分离:点击开始按钮后,传送带动画运行,但物理效果尚未激活。
  • 激活物理:将传送带速度设为5,发现方向不正确,需要调整移动方向。
9)调整移动方向
  • 方向调整:在脚本中将移动方向从“后”改为“右”,传送带开始朝正确方向移动。
  • 方向选项:可尝试右、左、上、下、前、后等方向,取决于XYZ坐标轴。
  • 测试结果:速度设为5时向右移动,设为-5时向左移动。
10)复制多个测试物体
  • 复制立方体:复制多个立方体并分散放置在传送带上。
  • 持续运行:所有立方体持续移动,但此时没有启动按钮控制,动画速度与实际速度需要进一步匹配。
2. 速度控制功能合并
1)添加传送带速度变量
  • 新增变量:在 ConveyorSpeedControl 脚本中添加公共浮点变量 ConveyorSpeed,用于控制传送带速度。
  • 比例关系:传送带速度与所有皮带轮之间存在最佳比例,皮带速度已设定,拉伸速度也已匹配。
2)测试速度匹配
  • 运行模拟:点击开始按钮,观察传送带旋转。
  • 调整速度:将速度初始设为0.5,发现线条移动比立方体快。
  • 逐步调整:
    • 0.8:仍然偏快。
    • 1.0:太慢。
    • 1.5:看起来不错,但线条仍略快。
    • 1.8:立方体比线条快。
    • 1.6:速度匹配良好。
3)确定最佳比例
  • 最佳比例:对于滑轮速度50(对应皮带速度-1),传送带速度设为1.6时,动画与物理效果匹配最佳。
  • 写入脚本:将传送带速度设为1.6,作为默认值。
三、传送带物理仿真:速度控制与碰撞交互
1. 传送带速度控制脚本编写与调试
  • 速度比例关系推导:通过计算得出皮带轮速度与传送带速度的比例关系,即皮带轮速度 = 32.25 × 传送带速度。
    • 计算过程:50 ÷ 1.6 = 31.25,去掉初始值后得到比例系数。
    • 初始设定传送带速度(ConvSpeed)从 1 开始。
  • 脚本逻辑:在 ConveyorSpeedControl 脚本中,通过 PulleySpeed = 32.25f * ConvSpeed 建立联动关系,使传送带速度变化时皮带轮速度自动调整。
    • 将比例计算放入 Update() 方法中,确保每帧更新。
    • 复制代码后保存,返回 Unity 编辑器检查是否有错误。
2. 浮点数精度问题与代码修正
  • 浮点数后缀 f 的必要性:在 C# 中,小数默认是 double 类型,赋值给 float 变量时必须添加 f 后缀,否则会报类型转换错误(CS0266)。
    • 错误示例:PulleySpeed = 32.25 * ConvSpeed;(32.25 是 double 类型)
    • 正确写法:PulleySpeed = 32.25f * ConvSpeed;
    • 同理,ConvSpeed = -1f 也需要加 f 后缀。
  • 易错点:所有浮点数常量赋值给 float 变量时,都要检查是否添加了 f 后缀,这是 Unity C# 开发中常见的编译错误来源。
3. 传送带物理脚本与速度控制脚本的桥接
  • 跨脚本引用:传送带物理脚本(ConveyorPhysics)需要引用速度控制脚本(ConveyorSpeedControl)中的传送带速度值。
    • 在 ConveyorPhysics 中定义公共变量:public ConveyorSpeedControl spc;
    • 在 FixedUpdate() 中通过 spc.ConvSpeed 获取传送带速度。
  • 物理移动逻辑:使用 Rigidbody.MovePosition() 实现传送带的物理移动。
    • 获取当前刚体位置,沿 Vector3.right 方向移动,距离为 spc.ConvSpeed * Time.fixedDeltaTime。
    • 使用 FixedUpdate() 而非 Update(),因为物理计算需要在固定时间步长中进行。
  • 组件连接:将 ConveyorPhysics 脚本附加到传送带对象上,并在 Inspector 中将 spc 变量拖拽关联到 ConveyorSpeedControl 组件。
4. 开始按钮条件控制物理模拟
  • 问题:传送带在游戏开始时立即运行,没有考虑开始按钮的状态。
  • 解决方案:在 ConveyorPhysics 脚本中定义公共开始按钮变量:public StartButtonScript startButton;
    • 在 FixedUpdate() 中添加条件判断:if (startButton.isStart) 才执行移动逻辑。
    • 这样物理引擎只在按下开始按钮后才开始模拟。
  • 组件连接:在 Inspector 中将开始按钮对象拖拽到 startButton 变量槽中。
    • 若未连接,运行时会报 NullReferenceException 错误。
  • 测试验证:点击开始按钮后,传送带开始运行,输入传送带速度 1.6,得到与之前相同的比例,动画与物理引擎协同工作。
5. 障碍物碰撞体添加与物理交互测试
  • 问题:障碍物没有碰撞体,物体会直接穿过。
  • 解决方案:为障碍物添加网格碰撞体(Mesh Collider)组件。
    • 创建空对象命名为"障碍物",将两个障碍物拖入其中管理。
    • 选中障碍物对象,添加 Mesh Collider 组件。
  • 测试结果:点击开始按钮后,物体移动到障碍物位置时被阻挡,站在障碍物上,产生正确的物理碰撞反应。
    • 由于传送带运动是线性的,物体与障碍物的碰撞反应符合预期。
    • 障碍物现在真正起到了阻挡作用。
四、知识小结

知识点

核心内容

考试重点/易混淆点

难度系数

游戏对象层级管理

创建空对象(conveyor control、speed control、conveyor motion control)作为容器,将控制脚本、旋转点、传送带等对象分类整理

空对象仅作组织用途,不参与渲染;层级结构影响Inspector面板的可读性

⭐⭐

控制脚本分离设计

将启动按钮(start button)与速度控制(speed control)拆分为独立脚本,分别控制动画启停与速度参数

启动按钮控制isRunning布尔值;速度控制管理pulleySpeed与beltSpeed两个浮点变量

⭐⭐⭐

变量联动与比例计算

通过脚本实现beltSpeed = -pulleySpeed / 100的自动换算,并在Update()中持续同步

比例系数(50:1.6)需手动测试确定;pulleySpeed始终覆盖beltSpeed,避免双向覆盖冲突

⭐⭐⭐⭐

动画与物理模拟分离

动画系统(Animator)负责视觉旋转,物理系统(Rigidbody + Collider)负责实际碰撞与移动

动画速度与物理速度需独立调整;物理脚本需设置isKinematic并关闭重力

⭐⭐⭐⭐

物理碰撞器配置

为传送带添加Rigidbody(isKinematic)和Mesh Collider;为障碍物添加Mesh Collider;货物使用Rigidbody(受重力)

传送带使用isKinematic避免物理驱动;障碍物需碰撞器才能阻挡货物;货物不可用isKinematic

⭐⭐⭐

脚本间引用与拖拽连接

通过公共变量(如public ConveyorSpeedControl spc)在Inspector面板拖拽关联不同脚本实例

脚本类型名与变量名需严格匹配;拖拽时注意选择正确的游戏对象(如speed control而非conveyor control)

⭐⭐⭐

方向向量调整

物理脚本中通过修改Vector3方向参数(right/left/forward/back)控制传送带移动方向

方向选择取决于坐标轴设定;正负值决定移动方向(如+5向右,-5向左)

⭐⭐

启动条件同步

物理脚本需引用启动按钮脚本,通过if (startButton.isRunning)条件控制物理模拟启停

动画与物理必须同步启动;未连接启动按钮时物理模拟不会运行

⭐⭐⭐

浮点数精度处理

所有浮点数值需添加f后缀(如0.01f),避免编译错误

float类型必须显式标记;整数赋值给浮点变量时需转换

⭐

对比项

动画系统

物理系统

控制方式

Animator + 速度参数

Rigidbody + 脚本驱动

速度来源

pulleySpeed(滑轮速度)

conveyorSpeed(传送带速度)

同步机制

通过beltSpeed = -pulleySpeed/100联动

通过spc.conveyorSpeed引用外部脚本

启动条件

需按下启动按钮

需按下启动按钮且脚本已连接

碰撞响应

无物理碰撞

依赖Mesh Collider与Rigidbody

步骤

操作内容

关键对象

注意事项

1

创建空对象容器

conveyor control、speed control、conveyor motion control

层级清晰,便于管理

2

编写速度控制脚本

ConveyorSpeedControl.cs

定义pulleySpeed与beltSpeed,建立比例关系

3

编写动画控制脚本

ConveyorAnimation.cs

引用速度控制脚本,替代原有固定速度

4

编写物理脚本

ConveyorPhysics.cs

复制旧代码,调整方向向量,引用速度控制

5

配置物理组件

传送带:Rigidbody(isKinematic) + Mesh Collider;障碍物:Mesh Collider;货物:Rigidbody

确保碰撞器存在,刚体属性正确

6

连接脚本引用

在Inspector中拖拽speed control到各脚本的spc字段

避免引用错误对象

7

测试与调参

调整pulleySpeed观察动画与物理同步性

比例系数需反复测试(50:1.6)

8

添加障碍物碰撞

为障碍物添加Mesh Collider

确保货物不会穿透障碍物

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐