机器人与机电一体化3D数字孪生机器-Day8
一、控制桥接
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 |
确保货物不会穿透障碍物 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)