game4automation教程(二)引入传感器、plc输入输出

勇哥注:

game4automation的传感器有两种算法,一是基于刚体碰撞,二是基于RayCast(射线检测)。


接上一节的场景,我们继续。

我们想实现:plc给个信号拉带启动,碰到一个物料到位感应器后拉带停止。

并且我们只需要一个Can在拉带上运动。


添加三个对象。

SensorBeam  是个传感器对象Sensor Beam。

它需要绑定一个输入信号,如下图:

image.png


startSingal  是PLCOutputBool

播放时,人工勾选Value,以启动拉带。

image.png

拉带Conveyor 2要绑定我们的自定义代码:

image.png


stopSingal2  是PLCInputBool

image.png


为了让Can只有一个。我们要关闭MU的自动复制。

Active选 Never

image.png

image.png


添加控制代码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”,这个时候拉带就动了。

image.png

image.png


感应器碰到Can后,下降沿的时候就有了信号。些时拉带停止。

因为是下降沿,所以Can的罐体刚好越过感应区。

image.png

那怎么实现感应器上升沿时停止拉带呢?

很简单,如下代码中,如果为true,则JogForward=false。即可。

 if ((bool)obj.GetValue())
        {
            moveline.JogForward = false;
        }
        else
        {
            moveline.JogForward = true;
        }


下图展示了勇哥的另一次测试,它在上升沿时can就停止了。

pic2.gif


测试源码下载

支付1元或购买VIP会员后,才能查看本内容!立即支付升级会员查询订单




下面是理论说明部分:


(一)Sensor(传感器)

传感器会检测MU。传感器使用二种算法进行检测MU,一是BoxColliders碰撞检测,二是Raycasts射线检测。

必须将行为组件(例如Sensor_Standard)添加到传感器,以连接到PLC的输入和输出。

MU(可移动单元)
MU表示场景中可以自由移动的对象。它们可以被拾取或加载,并且可以放置在拉带上。
MU由Source创建,由Sink删除。
MU脚本会自动附加到Source创建的所有对象。
用户根本不需要与MU脚本交互,除非脚本本身发布信息或者请求一些输入。


下图是Sensor的属性:

image.png


下面介绍下感应器的两种算法:


(1.1) 使用碰撞体的传感器

要注意的是,游戏对象如果想碰到传感器并发生状态改变,两者应该在同一层上。

game4automation创建了一些预义的层,你直接应用即可。

image.png

另外,由于网格碰撞体的碰撞检测存在限制,传感器应该始终使用Box Colliders (盒型碰撞体)。


 (1.2) 使用 Raycasts 的传感器

image.png

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,一个勾了。也就是一个用的碰撞检测,一个用的是射线检测。




本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2024-11-18 15:07:31 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864