2024-11-27 20:46:12
勇哥注:modbus是主从模式(master/slave)。以服务端/客户端来做比喻的话,slave就是服务端,master就是客户端。game4automation支持modbus接口。但是只支持做从站,即做Slave端,而不是做Master端。并且modbus缺省会使用本机IP, 端口号固定502不能修改。添加方式如下图所示:(图1)下图是添加好的Modbus接口。Is Connected...
2024-11-26 16:19:34
kinematic组件的作用比较难懂。我们只用抓住它的两个核心能力:一是将已定义组(由Group Script组件定义的)中的零件集成到此 Kinematic 零部件中二是可以移动或者旋转kinematic零部件的轴心点(一)将已定义组(由Group Script组件定义的)中的零件集成到此 Kinematic 零部件中这样说其实可能你还是不能明白是啥意思。勇哥用下面的示例来说明:下面的场景是一个...
2024-11-26 09:09:47
从2023版本以后,版本命名又变成非年月日了,现在最新的被命名为unity 6。版本命名怎么变来变去~~见下图:unity6启动界面是下面这样的:启动更慢了。。。。...
2024-11-25 21:29:13
(一)Measure Raycast组件Measure Raycast组件,用来检测射线到碰撞体之间的距离。如果碰到则输出Hit状态。同时可以把测量结果连接到PLCInput信号,这样Measure Raycast就能当感应器来用。如下图所示:手动移动Measure Raycast,如果碰到了cube,则显示显示距离,以及Hit。层级面板结构如下:Cube必须添加Box Collider。Meas...
2024-11-25 14:29:37
勇哥注:这节研究一下怎么使用Grip组件,以实现Gripper的效果。本节的效果如下:跟gripper组件不一样的是,这个grip组件需要你做下面额外的事:(1)左右两个夹子,有一个可以增加一个感应器sensor。(2)左右两个夹子,都得增加Drive,开合的动作需要自己来完成。其中(1)是可选项,即使没有sensor,也可以用plc信号来控制取与放。有了sensor,你只需要控制plc信号完成放...
2024-11-23 16:58:02
勇哥注:夹抓使用gripper组件,它是一个自动组件,运行时会自动包含grip、fixer等功能,专用用来处理夹子取放物料的效果。夹取的效果如下图:(一)Gripper组件这个组件是一个组合了多个组件的自动化夹爪对象。在播放的时候,它会自动生成grip组件,并且产生Fixed一样的效果。它的作用就是用夹爪取放MU对象。Time Opening 夹子打开的时间,单位秒Time Closing...
2024-11-22 17:05:09
勇哥注:有了上节的基础,本节比较简单。场景基本没变,就是改下Fixer的几个参数。本节接上节的内容:game4automation教程(九)Kinematic、Grip、Fixer、Drive取放MU的实验一http://47.98.154.65/?id=2569 基于RayCast的方式比较简单,基本场景跟上一节是一样的,效果如下图:场景如下:不要添加Box Collider组件。如果有,删除它...
2024-11-21 09:34:23
勇哥注:抓取与放下MU,就是本节要讨论的话题。这个话题还比较多,本节讨论最简单的基于碰撞算法的方式。(一)Fixer组件这个组件,简单的说就是把要抓取的物体去掉物理属性,可以配合动力学,跟随夹爪一起运动。这个效果就像是你的MU物体突然变成了夹爪的子物体。Fixer有一个检测区域,这个检测有两种方式,一是碰撞检测,二是射线投影。检测区域一旦有效,则这个MU的 Physics (物理) 和 Gravi...
2024-11-21 07:53:02
我们先构建一个简单场景:问题1:怎么让source只产生一个Cube,而不用连续产生?如果我们选择Source的Active为Never,即不激活这个组件。你会发现播放后, Cube直接落下穿透了地板。如果你把Mu的Active置为Never,发现一切正常,难道Mu是多余的?在game4automation的组件中,Active属性用于控制组件的行为或状态,特别是在自动化测试或游戏自动化脚本中。...
2024-11-20 21:06:32
(一)MU组件可移动单元 (MU) 是在场景中自由移动的对象。它们可以被拾取或加载,并且可以放置在运输表面上。 MU 由 Source 创建,由 Sink 删除。MU 脚本会自动附加到 Source 创建的所有对象。作为用户,您根本不需要与 MU 脚本交互,除非脚本本身发布信息或请求一些输入。这是 MU 脚本的 Inspector 窗口:ID,Global ID每个 MU 都会自动接收一个全局 I...
2024-11-20 17:33:00
(一)Interact3D组件Interact3D 脚本允许您在 3D 场景中定义用户交互,例如按钮、开关或开门。此脚本可以附加到具有碰撞器的任何组件。如果用户正在单击对象,则状态将更改。你可以设置以下属性Switch 如果交互应该像开关一样工作,则为 True,如果为 false,则像按钮一样工作。MaterialOn 材料应用于 Switch 或 Button 的 ON 状态的...
2024-11-20 14:38:05
(一)Group Script组件Group 由 GroupName 命名。对于 Prefabs (预设件),您还可以定义对另一个对象的引用,这将为组名称创建 Prefix。如果要生成使用 Group 函数的可重用预制件,这将特别有用。Group scritp 由 Kinematic 脚本专门使用。通常一个CAD零件由许多层级的子对象构成。如下图所示,我们在层级1161292_p05_000_01...
2024-11-19 17:13:29
勇哥注:Grip是夹取组件,Gripper则是一个自动化对象,包含了Grip和相关的MU、感应器等。game4automation的grip系列组件如下图所示:(一)Gripgrip常见的应用就是拾取、放下MU。它的图标是:使用刚体固定或作为子组件(1)子组件:Grip 可以将 MU 作为子组件附加,这是推荐的方法(2)Fixed Joints(固定关节):或者,可以使用 Fixed Joints...
2024-11-18 22:09:00
勇哥注:这节讨论一下运动相关的组件。Drive组件的应用,它用来定义轴;Drive Behavior组件更像是运动方式(算法);Logic Steps逻辑步骤的功能可用于内测,即是不用plc,自己写逻辑测试动作。(一)Drive组件把游戏对象添加Driver组件后,就构建了运动轴。Drive将沿定义的旋转轴或者线性轴移动游戏对象。由于Driver不会向plc公开Signal接口,为此,除了游戏对象...
2024-11-18 15:05:06
勇哥注:game4automation的传感器有两种算法,一是基于刚体碰撞,二是基于RayCast(射线检测)。接上一节的场景,我们继续。我们想实现:plc给个信号拉带启动,碰到一个物料到位感应器后拉带停止。并且我们只需要一个Can在拉带上运动。添加三个对象。SensorBeam 是个传感器对象Sensor Beam。它需要绑定一个输入信号,如下图:startSingal 是PLCOutput...
2024-11-18 08:29:05
勇哥注:这篇勇哥演示一下创建一个带有光源、传送带和感应器的小例子。首先,必须在Assets的根创建一个目录,而不要在game4automation目录中创建场景。这是因为game4automation一但更新,里面的内容就清空了,你的场景就白搞了。然后创建一个新的game4automation Scene,新的场景。把这个场景保存在新建的test1目录中。创建成功的项目,包括基础灯光、相机、UI等...
2024-11-09 15:13:45
(一)灯光烘培基本操作就是如果一场景中,光源照射角度是固定的,那无需要要实时光照的。只需要计算一次光照,产生一个光照贴图。这个时候即使光源删除了,因为有这张光照贴图,还是有光照效果。这是一种节省系统资源的办法,毕竟实时光照是要消耗算力的。自动化设备的光照也可以是固定的,所以也非常适合灯光烘培。窗口-->渲染-->照明。照明面板中,直接点击“生成光照”即可。这个时候系统会开始计算全局光照...
2024-11-07 17:26:57
勇哥注:由于unity只能导入fbx格式的3d模型 ,但是solidwoks不能导出为fbx格式,我们只能让solickworks先导出为中间的格式,再弄到3dsmax中去导出为fbx格式。这样搞来搞去,事件就变复杂了。首先就是批量导入导出模形的问题,再就是材质与灯光的问题。还有一个简单些的问题,就是unity中单位是米,而solidwoks中单位是毫米,你怎么让两者统一。(一)导入一个设备模型试...
2024-11-07 16:02:30
勇哥注:由于unity只能导入fbx格式的3d模型 ,但是solidwoks不能导出为fbx格式,我们让solickworks先导出为step或者是stl格式,再弄到3dsmax中去导出为fbx格式。但是solidwoks中一个顶级装配体导出为stl后,会生成一堆stl文件。怎么样批量导入3dsmax中就成了个大问题,因为3dsmax只能一个一个的导入,让你崩溃。(至少3dsmax2019及之前版...
2024-11-06 14:05:12
勇哥注:动画的用途是做类似于夹取动作、气缸顶升降下这些。你可以认为气缸是一个角色,角色有自己的多种动画状态,只是动画控制器在播放时会根据需要,选择播放不同的动画状态。因此动画不会去让它孤立存在,它主要是作用于角色。Animation(动画)是老版的方式。现在我们一般使用Animator Controller(动画控制器)。(中文菜单)(英文菜单)有了动画控制器后,你就可以添加若干个Animatio...
2024-11-05 23:03:17
勇哥注:碰撞检测和触发器都可以用于检测轴运动是不是撞机了。如果我们的动作逻辑有撞机的可能性,就可以用它来检测到。对于含有相机的设备,则可以使用射线检测取得物料的信息。(一)基本的碰撞检测组件介绍碰撞组件名字没带2D的,都是3D的碰撞组件。Box Collider, Sphere Collider是盒子与球体的碰撞组件。其它几种是非简单几何体的复杂碰撞检测:Mesh Collider网格碰撞体,它能...
2024-11-05 21:54:56
(一)游戏时间Time.time //游戏开始到现在所花的时间Time.timeScale //时间缩放值,可以做游戏加速、减速、暂停等Time.fixedDeltaTime //固定时间间隔 0.02 private void FixedUpdate() { //0.02秒调用一次 }Time.deltaTime //上一帧到这一帧所用的游戏时...
2024-11-05 17:19:09
Update、Coroutines 和InvokeRepeating另一个很容易养成的习惯是在 Update0回调中以超出需要的频率重复调用某段代码。例如,开始时情形如下:void Update(){
ProcessAI();
}本例在每一帧中调用某个自定义ProcessAI()子例程。这可能是一个复杂的任务,需要人工智能系统检查某个网格系统,以找出它要移动的目的地,或者为组宇宙飞船决定一些瞬...
2024-11-04 10:38:17
这个现象是当点击播放后,自动会暂停。然后你取消暂停后,游戏可以继续。。。。是不是很烦?有没有可能是你的代码中有异常代码,靠成播放时出错,让游戏停止下来?其实是想复杂了。原因很简单,就是你不小心按下了这个“错误暂停”的按钮。这个按钮有效无效显示的差别不太明显,大家要注意了:有效时的显示无效时的显示经常有一些警告代码,也会认为是错误的,所以就会被停下来。例如下面这样的:...
2024-11-02 19:53:37
勇哥注:勇哥的这套教程侧重点是工业的数字孪生。我们知道工业4.0比较重要的一个基础技术就是数字孪生。有了它我们可以在设备3d图出来后就进行设备动作仿真,在设备采购与配电完成之前就可以完成设备的动作逻辑的编制与测试。对于非标自动化行业来说,可以极大的降低试错成本、提高设备产出。工业数字孪生是跨学科的综合应用。因此你需要下面的一些基础能力:1. C#语言,.netframework开发,要求较高,你...
2024-11-01 08:16:19
勇哥注:工业机器人使用两个约束就可以实现动作,一个是Aim Constraint,一个是Rotation Constraint。两种约束,都是“注视”一个目标,目标移动,则机器人凡是添加了约束的关节都会联动。下面是简易的机器人演示:只实现了三个关节的动作。球体是Aim Constraint的关注物体。Rotation Constraint的关注物体是GameObject(1)-->GameO...
2024-10-29 16:56:18
勇哥注:移动动画怎么让它持续的时间完全由速度和总距离来决定?这其实是模拟的运动控制卡API的工作方式。下面举的两个例子,使用了两种不同的方式实现目的。(一)Z轴上下移动using System.Collections;
using UnityEngine;
public class Lifting : MonoBehaviour
{
public Trans...
2024-10-29 10:28:20
在Unity中,获取场景中的对象通常是通过访问场景中的根对象(通常是SceneManager.GetActiveScene().rootCount和SceneManager.GetActiveScene().GetRootGameObjects())或者通过查找具有特定名称、标签或类型的对象来实现的。以下是一些常用的方法:1. 使用 Find 方法Find 方法可以在整个场景中查找具有特定名称的...
2024-10-29 09:01:01
(一)常见的生命周期方法在 Unity 中,除了 Awake() 之外,还有其他许多常用的生命周期函数,它们在游戏对象或脚本组件的生命周期中的不同阶段被调用,允许开发者在适当的时候执行特定的代码。以下是一些常用的 Unity 生命周期函数:(1)Start()调用时机:在 Awake() 之后调用,仅当脚本实例首次被启用时调用一次。用途:通常用于进行一些初始化操作,如设置初始状态、加载资源等。(2...
2024-10-26 19:21:04
勇哥注:本节举几个协程的例子。(一)鼠标唤出面板左键唤出,右键关闭,窗口变大和缩小的过程会有动画效果。这里用到了动画曲线,它的值可以在曲线指定范围内变化,从而带动panel的缩放的变化。源码:using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class panelTe...