勇哥注:
game4automation的传感器有两种算法,一是基于刚体碰撞,二是基于RayCast(射线检测)。
接上一节的场景,我们继续。
我们想实现:plc给个信号拉带启动,碰到一个物料到位感应器后拉带停止。
并且我们只需要一个Can在拉带上运动。
添加三个对象。
SensorBeam 是个传感器对象Sensor Beam。
它需要绑定一个输入信号,如下图:
startSingal 是PLCOutputBool
播放时,人工勾选Value,以启动拉带。
拉带Conveyor 2要绑定我们的自定义代码:
stopSingal2 是PLCInputBool
为了让Can只有一个。我们要关闭MU的自动复制。
Active选 Never
添加控制代码Control Test 1:
public class controlTest1 : MonoBehaviour { public PLCOutputBool startSignal; public PLCInputBool stopSingl; public Drive moveline; void Start() { startSignal.SignalChanged += StartSignal_SignalChanged; stopSingl.SignalChanged += StopSingl_SignalChanged; } private void StopSingl_SignalChanged(Signal obj) { if ((bool)obj.GetValue()) { moveline.JogForward = true; } else { moveline.JogForward = false; } } private void StartSignal_SignalChanged(Signal obj) { if((bool)obj.GetValue()) { moveline.JogForward = true; } else { moveline.JogForward= false; } } void Update() { } }
运行后,选择startSingal,在其属性面板中勾选 “Value”,这个时候拉带就动了。
感应器碰到Can后,下降沿的时候就有了信号。些时拉带停止。
因为是下降沿,所以Can的罐体刚好越过感应区。
那怎么实现感应器上升沿时停止拉带呢?
很简单,如下代码中,如果为true,则JogForward=false。即可。
if ((bool)obj.GetValue()) { moveline.JogForward = false; } else { moveline.JogForward = true; }
下图展示了勇哥的另一次测试,它在上升沿时can就停止了。
测试源码下载
下面是理论说明部分:
(一)Sensor(传感器)
传感器会检测MU。传感器使用二种算法进行检测MU,一是BoxColliders碰撞检测,二是Raycasts射线检测。
必须将行为组件(例如Sensor_Standard)添加到传感器,以连接到PLC的输入和输出。
MU(可移动单元) MU表示场景中可以自由移动的对象。它们可以被拾取或加载,并且可以放置在拉带上。 MU由Source创建,由Sink删除。 MU脚本会自动附加到Source创建的所有对象。 用户根本不需要与MU脚本交互,除非脚本本身发布信息或者请求一些输入。
下图是Sensor的属性:
下面介绍下感应器的两种算法:
(1.1) 使用碰撞体的传感器
要注意的是,游戏对象如果想碰到传感器并发生状态改变,两者应该在同一层上。
game4automation创建了一些预义的层,你直接应用即可。
另外,由于网格碰撞体的碰撞检测存在限制,传感器应该始终使用Box Colliders (盒型碰撞体)。
(1.2) 使用 Raycasts 的传感器
Raycasts 的优点是,不需要定义碰撞器,并且 Raycast 可以设置检查哪些图层。
要注意不要让光线的起点位于游戏对象的内部。
Ray Cast Direction 这个是设置光线的方向
Ray Cast Length 是光线长度
Ray Cast Display Width 在检测有信号时,渲染器会显示这个宽度变化。
Additional Ray Cast Layers 这里可以添加要检测的层。
你可能想到这里需要添加Can所在的层进来。
实际上,就算记了添加也没事,勇哥发现播放时它会自动添加Can这个MU对象的图层进来,不知道为啥能这么聪明。
(二)可能有朋友会注意到,下面有两种创建传感器的方式,它们有什么区别呢?
game4automation-->Add Object-->Sensor Beam
game4automation-->Add Component-->Sensor
答案是:Add Object中创建的传感是,是两个组件(Sensor和Sensor_Standard)合在一起,并且还带有感应器的3d对象。
而从Add Component中创建的只是单纯的传感器组件(Sensor),它最终要添加到一个场景对象上。
另外一点不同在于,两者的Sensor属性中的值不同,一个没勾选 RayCast,一个勾了。也就是一个用的碰撞检测,一个用的是射线检测。

