-
2020-12-21 00:27:46
龙源期刊网
http://www.qikan.com.cn
基于
Unity3D
的机器人仿真实验系统
作者:庄严
卢阿丽
杨庆
来源:《电子技术与软件工程》
2018
年第
03
期
摘
要
针对日益增长的机器人技术教学培训需求,研究并设计了一款机器人仿真实验系
统。系统软件以
FANUC M-iA
系列工业机器人原型为依据,使用
SolidWorks
和
3ds Max
进行
建模,并将模型导入
Unity3D
,编程实现对机器人的操控,软件效果逼真,可实时交互,为同
类虚拟现实实验系统的开发设计提供了经验和参考。
【关键词】
Unity3D
机器人
虚拟现实
实验是机器人技术教学中的重要环节,目前的授课,大多数是以理论讲解结合视频动画方
式进行,缺少实际操作。而真实的工业机器人类型较多、价格昂贵,对实验环境要求严格,批
量采购和建设存在一定的困难。随着虚拟现实(
Virtual Reality
,简称
VR
)技术的不断进步,
虚拟实验室已得到了广泛的认可和应用。其主要思路是通过
VR
技术,对实验设备和环境的仿
真模拟,让实验者具有亲临工作现场进行实际操作的感受。
1
系统总体分析与三维建模
根据实际教学情况,虚拟实验系统的建立主要包括:实验室、机器人的仿真和示教器模拟
三个部分。实验室仿真包含实验室建模和场景漫游设计;机器人仿真包含零部件的建模组合以
及运动虚拟化;示教器模拟包括操作界面的制作和控制实现等。系统的开发流程分为两个阶
段:建模和运动仿真。建模阶段:首先对教学单位进行调研,详细分析用户需求,收集实验室
和机器人的数据和素材,然后使用建模工具进行各部件建模及场景搭建;系统仿真阶段:将制
作完成的模型整体导入
Unity3D
开发环境,设计用户界面,编写脚本实现对机器人控制,最终
进行封装并发布。
VR
系统要求对实体与环境的模拟实时逼真。早期的三维模型多数是对物体形态的简化和
抽象,随着建模工具的不断升级进步,用户越来越注重视觉效果,实物精度和逼真程度也成为
建模工作的重要指标。本实验系统所需模型包括实验室内部实景和机器人实体,经实践和分
析,选择了
3ds Max
和
SolidWorks
作为建模工具。
3ds Max
功能强大,控制选项丰富,但对于
机械零件建模存在不足。首先,对于形状较规则的零件,绘制截面时,点的精准定位困难,过
程相当繁琐;其次,不规则零件建模时,分几个部分利用不同的方法建模后再进行组合,不利
于修改,并且表面圆滑处理会造成模型面数增多,文件体积增大。使用
SolidWorks
三维制图
软件进行机械零件建模十分方便,模型尺寸都可用工具标注,在更改时只需改变尺寸,无需重
建。对于标准部件,可先根据变量参数驱动三维结构直接得到模型,如需新建,只要更改变量
重建即可,建模效率极高。虽然
SolidWorks
建模数据精度高,但对物体的表面渲染功能欠
缺,逼真度不够。
更多相关内容 -
unity机器人模型包
2018-07-16 13:57:48unity5.6.1 -机器人模型包 可以直接拿出来用 包含法线贴图 细节贴图 -
UnityAI与机器人对话功能源码.rar
2021-04-20 13:57:11与机器人对话功能 -
基于Unity3D的虚拟工业机器人建模与运动仿真.pdf
2021-08-13 00:14:57#资源达人分享计划# -
unity机器人仿真_ROS+AI:机器人人工智能方案小探
2020-11-24 03:07:33我只对在机器人领域,特别是ROS以及ROS2系统上融合的一些人工智能方案跟平台做一定程度的归纳、总结。其次,即使在机器人应用方面,在此之前的几年时间里,很多知名的、大型的公司都曾推出过或者评估过人工智能的...现在人工智能的方案很多,也并应用到很多的领域去了,我这里并不对这些方面展开。我只对在机器人领域,特别是ROS以及ROS2系统上融合的一些人工智能方案跟平台做一定程度的归纳、总结。其次,即使在机器人应用方面,在此之前的几年时间里,很多知名的、大型的公司都曾推出过或者评估过人工智能的渗透方案,他们的评估方案不一而足,有的是乐观的,有些是悲观的,有的到现在还在不遗余力地在拓展,有的已经偃旗息鼓了,由于他们或者与ROS不相关,或者并不是开源,都不在我的探究范围。同时,国内兴起了一批的现代机器人公司,也有一批专门的AI方面的研发、应用公司,他们大多不热衷于开源,也不在探究之内。是为“小探”的小字之解。
在网上能找到ROS跟AI结合的资料是2016年,基于Intel CPU+NVidia Jetson板子。这是一个叫Artificial Human Companions的小公司将turtlebot机器人底盘跟这样的两个板子组合起来的一种非常简易的AI方案,叫做Deep Learning Robot,售价不到400美元。
但是它所涉及的领域,到现在还是在大谈特谈。
这个机器人使用了Turtlebot2的移动能力以及ROS的分布式部署。
使用了Turtlebot2的移动能力以及ROS的分布式部署 使用了Intel架构的主板作为运行ROS主要模块的大脑版以及NVidia Jetson板子提供的深度学习计算能力。
使用了NVidia的DL计算能力 提供简易的基于物体识别和语音辨识的语义级地图,在理解环境跟完成指令等方面,增加了些许智能化的“人性”倾向,譬如人类可以通过语音控制机器人跑到指定的物体面前,而不是用冷冰冰的二维坐标。
Artificial Human Companions这个组织可能已经关闭了,而且它所做的这些尝试都是非常非常初级的尝试,把他们当产品来卖,实在是有点心中赧赧不胜娇羞啦。但是它所涉及的这些方向还是一直是研究的主流。当然到现在吹破了AI恐怖来袭的泡泡之后,很多公司或者项目也就大失所望+大失钱财之后被double kill了。此为后话,搁置不表。
在之后的时间里,使用NVidia各种NN板子来提供DL能力,似乎是唯一的选择了,有很多的方案都是如此部署。
还有人专门为NVidia Netson或其它板子做了图形化工具来简化ROS的安装。譬如:
https://github.com/rbonghi/jetson_easy/wikigithub.com譬如Aerial Vehicles 项目,2017年将ARM+NVidia (TK1 or TX2)应用到了他们的一些无人机项目上。它的其中一个功劳,是将CMU的OpenPose项目移植到了ROS系统。
https://github.com/CMU-Perceptual-Computing-Lab/openposegithub.com https://github.com/ildoonet/ros-openposegithub.comCMU OpenPose Package是一个比较著名的使用DL技术来分析人类的2D以及3D动作的框架。ROS系统的移植版本对它的主要功能进行比较完整的封装。当然这种封装还是比较容易的,只需要对输入数据跟输出结果封装成ROS Message格式就差不多了。可惜的是,这个项目最近缺少维护。
https://github.com/ildoonet/ros-openpose/blob/master/pose_face_hands.gif
在此期间,全球很多的自动驾驶公司也在从ROS社区挖人,做AI跟ROS的整合,因为搜索不到他们成型的产品或项目,而且很多公司都是作为前浪被其它前浪拍死在沙滩上了,这里也就不罗列他们的名字了。不过有个插曲,我在浏览他们的网站的时候,竟然发现有一些网站都已经被反美hacker们贡献了,WTF。
赛灵思(Xilinx)是设计、制造FPGA方面的大牛,同时在AI(特别是边缘服务器层面的AI应用框架)方面也有很不错的业界知名度。最近也在发布了一些官方和非官方的声明,明确人工智能在未来机器人应用中的重要性,认为在现代机器人上加持物体分类以及语义分割等AI功能是大势所趋。赛灵思也开始针对于ROS/ROS2做一些实质性的部署:
- ROS
- ROS2
- OpenCV4
- Librealsense2 (为Intel RealSense立体相机的底层库)
- Xilinx DPU TRM
赛灵思AI Edge Platform提供里一套完整的工具跟预训练的深度神经网络模型,并在相关的硬件平台(embedded-CPU-based FPGA)上做了较为完备的硬件加速。
因此赛灵思如何切实推动其AI技术、AI平台与ROS/ROS2的融合,以及这种集成到底对机器人业界与开源社区意味着什么,让我们拭目以待。
近来,也有一些AI相关的项目是支持ROS2系统的。
2019年,LG发布了一款基于Unity的LGSVL Simulator的仿真器,应用于自动驾驶领域,跟ROS2兼容。其跟ROS2的兼容是通过ros2-web-bridge模块桥接的,属于轻量级相互相对隔离的模式,好处是可以容易地跟其它第三方的自动驾驶软件栈整合。
支持3D LiDAR传感器和摄像机。
同时内置了自动巡道驾驶的深度神经网络模型和算法,部分源代码和相关文档见下面。
https://github.com/lgsvl/lanefollowinggithub.com https://www.lgsvlsimulator.com/docs/lane-following/www.lgsvlsimulator.com
Intel对ROS2的贡献也是实心实意可圈可点的。
在过去的两年里,Intel部署了大约20个人力全力支持ROS2的成熟与产品化,除了主导了ROS2全新一代的导航软件栈Navigation2之外,在ROS2的早期阶段,还移植了一些核心模块,例如cv_bridge, image_pipeline, message_filters等等。另外,Intel还评审了ROS2的各个核心模块,并在代码安全、代码质量、实时性能等多方面提出了建设性意见,部分贡献见下图:
Intel开发并持续在维护的OpenVINO Toolkit,在基于openCV的计算机视觉的基础上,扩展了CPU、GPU、FPGA以及其它一些专有计算单元在神经网络推断能力和优化方面发挥了它们的算力极致。Intel围绕OpenVINO技术及其扩展,实现了对端、边、云的无缝链接,对于软硬件整合方面,特别是软件定义系统成为主流的当下,对业界实在是一种利好,对正在打算建立自己的人工智能体系的公司或者个人来说,是不可忽视的重要参考。毕竟IA架构,在众多的跨界领域里面,似乎是唯一的选择。就拿目前运行ROS或者ROS2的机器人系统来说,9成以上还是IA架构。在这种情况下,如果发挥CPU及其内嵌的GPU就足以满足人工智能的需求的话,也不啻为一种cost saving的一种有效方式。Intel已经将OpenVINO Toolkit的部分视觉推断功能移植到了ROS跟ROS2系统,见下面的链接。
https://github.com/intel/ros_openvino_toolkitgithub.com https://github.com/intel/ros2_openvino_toolkitgithub.comROS/ROS2 OpenVINO Toolkit除了提供在CPU、GPU、FPGA、Movidius等等硬件上的优化了的视觉推断功能,还提供了一整套深度学习模型的流水线模型,可以让使用者在不改变代码的情况下,自由串联需要的推断功能(Inference)和模型(Model),对自己的应用场景做深度定制。
Intel另一个被引用广泛的ROS2项目是Smart Grasp项目。这个项目基于视觉来源(RGB数据或者点云数据),通过OpenVINO框架加速,实现对物体的识别、分割,进而实现对物体的精确抓取,在智能制造方面做出了一定的尝试。
为了配合机械手臂跟视觉相机的高精度校准,Intel还提供了一套手眼标定的算法跟工具。
这个项目跟大名鼎鼎的Moveit是接口级别兼容的,可以被很容易地整合到更多的智能运动控制领域。该项目也在ROSCON2019峰会上以及第一届Moveit中国开发者年会上向业界做过展示。
相关的源码跟资料见下:
intel/ros2_grasp_librarygithub.com
当然,最为新鲜出炉的消息是,ROS2在2020年2月底刚启动了一个Edge AI工作组,专门致力于机器人端(之后或许有服务器端)的包罗众家所长的大一统的官方的人工智能框架,这个对业界或许是好事,请大家关注。
Proposed Edge AI WGdiscourse.ros.org又当然,深度强化学习(Deep Reinforcement Learning)最近几年如火如荼,而且跟ROS/ROS2特别是机器人运动规划相关领域结合比较密切。这种以控制为优势的深度学习算法,仅仅是下个棋并不能满足它的进取心,也不是淘金的正确战场。DRL跟机器人的结合将会有很大的看头,这里就不展开了,如果有机会,另外写个文总结吧。
希望对大家有用。
-
Unity3D机器人之战
2014-01-06 23:50:01Unity3D的2D游戏开发,机器人之战 源代码(D) -
Unity演示效果的机器人例子程序
2019-12-19 17:55:32Unity演示效果的机器人例子程序,里面自带的天气系统,第三人称视角类似于野外求生的视角,新测可以用,在需要的拿下 -
Unity-Robotics-Hub:用于Unity中机器人仿真的工具,教程,资源和文档的中央存储库
2021-02-06 06:26:13Unity机器人中心 这是用于Unity中机器人仿真的工具,教程,资源和文档的中央存储库。 该存储库的内容正在积极开发中。 随着开发的进行,其功能和API可能会发生重大变化。 介绍 模拟在机器人技术的发展中起着重要的... -
【Unity新闻】如何使用Unity进行机器人模拟? | AR/VR全球需求率激增1400%
2020-11-24 10:33:54机器人开发工作流程依赖于模拟进行测试和培训,Unity展示了机器人专家如何使用Unity来进行机器人模拟,描述了一个通用的机器人技术开发工作流程。此外,Unity还引入了一组新工具,使Unity中的机器人模拟比以往更快、...洪流学堂,让你快人几步。
我们一起看看上周Unity有什么大事情发生吧!如何使用Unity进行机器人模拟?
机器人开发工作流程依赖于模拟进行测试和培训,Unity展示了机器人专家如何使用Unity来进行机器人模拟,描述了一个通用的机器人技术开发工作流程。此外,Unity还引入了一组新工具,使Unity中的机器人模拟比以往更快、更有效、更容易。
为了使机器人专家更轻松地将机器人导入Unity,Unity发布了URDF Importer,这是一个开放源代码的Unity包,用于使用其URDF文件将机器人导入Unity场景。该软件包利用了对Unity中“清晰度”的新支持,这是通过PhysX 4.1的改进而实现的。这次更新使我们能够精确地模拟机器人的物理特性,以实现更逼真的运动学模拟。
原文链接:
https://blogs.unity3d.com/2020/11/19/robotics-simulation-in-unity-is-as-easy-as-1-2-3/AR/VR和游戏工程师全球需求率激增1400%和146%
AR/VR和游戏工程师在2019年的全球需求率最高,分别为1400%和146%。
原文链接:
https://blogs.unity3d.com/2020/11/17/new-career-pathways-help-you-break-into-the-gaming-and-tech-industries/扩展阅读
关注洪流学堂公众号,每周一定期推送。
我是大智(vx:zhz11235),你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。
-
unity实战:狂暴机器人游戏教程(上篇)
2021-06-11 08:09:02文章目录一、准备开始1.创建场景1.1打开场景1.2新建标签1.3设置标签1.4烘培导航2.添加主角2.1导入标准资源包2.2创建脚本3.创建武器3.1添加手枪3.2添加武器标签4.创建常量文件4.1创建Constants脚本5....一、准备开始
1.创建场景
1.1打开场景
首先,在Unity中打开启动项目。在项目视图中,打开“Scenes/Battle”,如下图所示。
1.2新建标签
-
首先,需要设置“Wall”的游戏对象,避免机器人AI撞到墙上。
Tag是一个用来标识游戏对象的文本。每个游戏对象只能有一个标记。通过给每个墙的游戏对象分配一个标签,再为机器人设定一些寻路规则,这样它们就可以绕开墙走动。
在层级视图中,单击“Inner Walls”游戏对象。在检视视图中,单击“Tag”下拉列表,然后选择“Add Tag”命令,
-
单击“Tag”窗口中的加号按钮,然后新建一个“Wall”标签
1.3设置标签
通过单击层级视图中“InnerWalls”游戏对象左边的箭头展开它。选择它所有子对象 (名为“Wall”和“WallPost”)。快速的方法是选择第一个游戏对象,然后按住Shift键并单击最后一个游戏对象。选中所有子对象后,单击“Tag”下拉列表并选择刚刚创建的“Wall”标签,
注:当所有的墙壁都被标记为“Wall”时,可以开始着手为机器人添加“NavMesh”了。
1.4烘培导航
通过“Window/Navigation”打开“Navigation”视图。确保选中了所以的“Wall”和“WallPost”游戏对象,并确保选中了“Object”选项卡中的“Navigation Static”复选框。
选择“Bake”标签并单击“Bake”按钮
可以看到场景中出现了浅蓝色的面片,这个浅蓝色的面片就是被限制后的机器人可移动区域。
)
2.添加主角
2.1导入标准资源包
在层级视图中,创建一个空的游戏对象并命名为“Player”。案例将使用Unity自带的Character Controller(角色控制器),并稍作修改来实现玩家对主角的控制。选择菜单栏中的“Assets\ImportPackage\Characters”命令,导入标准资源。
注意:如果在ImportPackage中看不到“Character Controller”选项,说明在安装 Unity 时没有导入Standard Assets(标准资产)。要修复此问题,需要重新执行Unity安装程序,只安装Standard Assets。标准的Unity资产就像任何常规包一样。它只是一个文件的集合。
单击菜单上的Import按钮以导入Characters资产。2.2创建脚本
创建移动脚本,包含人物移动,跳跃和转动摄像机,然后将脚本赋予Player确保各个功能的正常实现
创建好的脚本如图所示,speed表示人物移动,jump表示人物跳跃,Gravity表示重力,camera_x和camera_y表示鼠标移动时摄像机的转动倍率。
Camera摄像机需要放在Player人物下,程序会自动获取摄像机
备注:想要实现shift奔跑只需要添加
private float moveSpeed=Speed;
然后将以下代码添加进move函数中即可
if(Input.GetKeyDown(KeyCode.LiftShift))
{
Speed=跑步速度;
}else Speed=moveSpeed;3.创建武器
3.1添加手枪
在Unity中,枪只是另一个游戏对象。最大的区别在于视角。把它靠近镜头,立刻就能找到第一人称射击的感觉。
选择Camera游戏对象,然后右击它并选择“Create Empty”,创建一个空的子游戏对象,命名为“1Pistol”。名字前面的数字是指玩家将使用的装备ID。
将项目视图中“Models/RobotRampage_Pistol”模型拖到1Pistol 游戏对象上。
调整模型的位置大小,让枪在摄像机中正常显示,然后勾选下框,隐藏模型
根据此流程,添加猎枪和步枪。3.2添加武器标签
接下来要为每个武器设置标签。
首先创建三个新的Tag,它们是Pistol、AssaultRifle和Shotgun。
然后给武器分配对应的标签。
1Pistol设置Tag为Pistol,2AssaultRifle设置为AssaultRifle,3Shotgun设置为Shotgun。如下图所示
4.创建常量文件
4.1创建Constants脚本
在项目视图中右击Assets文件夹,选择“Create\Folder”命令创建一个新文件夹,命名为“Scripts”。在Scripts文件夹中,创建一个C#脚本,命名为“Constants”。
在脚本编辑器中打开Constants脚本,并将文件的内容替换为:
5.武器逻辑
5.1切换武器
保存脚本,回到Unity。在Scripts文件夹中新建一个C#脚本,将其命名为“GunEquipper”,添加以下变量。
保存脚本,回到Unity。在Scripts文件夹中新建一个C#脚本,将其命名为“GunEquipper”,添加以下变量。
保存脚本,回到Unity,并将GunEquipper 脚本添加到Player游戏物体上
选择Player游戏对象,并将1Pistol 游戏对象从层级视图拖动到 GunEquipper 脚本组件中的相应字段。以同样的方法操作2AssaultRifle 和3Shotgun。
二、子弹弹药
1.弹药的逻辑
1.1创建Gun基类
首先,需要确定了一个攻击频率。当玩家持续开枪时,每颗子弹射出之间有一个停顿。这意味着必须跟踪最后一颗子弹发射的时间,以便于判断何时可以发射下一颗子弹。
创建一个C#脚本,命名为“Gun”,并添加下面的变量:
fire Rate表示攻击的频率,而lastFireTime表示最后一次攻击的时刻。在Gun脚本中修改Start方法:
设置lastFireTime默认值为游戏开始的10秒前。10秒远远大于攻击间隔,所以当游戏开始时,玩家将能够立即发射子弹。最后,修改Update方法,代码如左。
因为每个武器在具体实现上都有细微差异,所以稍后将在子类中对这些方法进行重载。1.2创建手枪脚本
保存脚本,切换回Unity。创建一个C#脚本,将其命名为“Pistol”,并将其内容替换为:
这将检查下一次射击是否达到攻击间隔。如果达到,将触发下一次射击动作。
保存脚本,回到Unity,并将Pistol脚本添加到1Pistol游戏物体。
选中1Pistol游戏物体,将fireRate设置为0.6。1.3创建猎枪脚本
选择Pistol脚本,然后按下Ctrl+d键,复制脚本。把名字改成Shotgun,在代码编辑器中打开该脚本。将如下代码:
与手枪一样,这也是一个半自动武器,但因为它是一把猎枪,所以它需要更长的发射间隔。保存脚本,回到Unity,将Shotgun脚本附加到3Shotgun 游戏物体上,并将 fireRate 设置为1。1.4 创建突击步枪脚本
最后,需要对突击步枪做同样的操作。创建一个名为“AssaultRifle”的脚本,将其附加到2AssaultRifle 游戏对象上,并将其内容替换为:
看上去这个脚本与Pistol脚本几乎相同,但有一个关键区别:该脚本使用 GetMouseButton来监听玩家是否按住鼠标左键,而不是用GetMouseButtonDown监听单次按下鼠标左键。
保存脚本,回到Unity。在检视面板中将AssaultRifle脚本的fireRate设置为0.1。2.创建开枪动画
2.1创建动画控制器
右击“Animations”文件夹,选择“Create\Animator Controller”命令,并将其命名为“Pistol”。右击Pistol.AnimatorController,然后单击“Open”按钮,打开Animator窗口。
在Animator窗口的网格区域中右键单击,然后选择“Create State\Empty”创建一个新的状态。单击新状态,并在检视视图中,将其重命名为“Fire”。
单击Motion框右侧的控件,然后在搜索框中查找“Fire”。在结果列表中找到Assets/Models/RobotRampage_Pistol.fbx,然后双击它,如下图所示。
需要为动画创建默认状态。和之前一样,在动画窗口中创建另一个空状态,命名为“Base”。
右击“Fire”,然后选择“Make Transition”命令。从Fire拖到Base,如图2-2-2所示。
Fire动画播放后,动画应该回到Base状态。右键单击Base状态,然后选择“Set as Layer Default State ”,使其成为基本动画,如下图所示。
2.2用代码控制动画播放
打开Gun脚本,并将以下代码添加到Fire ()方法:
GetComponentInChildren<Animator>().Play("Fire");
这需要在代码中获取Animator,并告诉它何时播放Fire动画。在这之前,需要先在游戏对象上添加Animator组件。
当然,目前只创建一个手枪动画控制器,还需要创建猎枪和突击步枪的动画控制器。
在项目视图中,选择Animations文件夹下的Pistol动画控制器。按下Ctrl+D两次,复制出两个动画控制器。其中一个命名为“Shotgun”,另一个命名为“AssaultRifle”。
打开Shotgun动画控制器,并选择Fire状态。在检视视图中,设置Motion为Grip|Fire,来源于Assets/Models/ RobotRampage_Shotgun.fbx 模型。
最后,打开 AssaultRifle 动画控制器,并选择Fire状态。在检视视图中,设置Motion为Grip|Fire,来源于Assets/Models/RobotRampage_AssaultRifle.fbx模型。
所有的动画已经设置到位,下面需要将它们添加到武器上。2.3设置Animator组件
回到Unity,选择1Pistol 游戏对象,单击Add Component按钮,输入Animator,在搜索结果中选择Animator。单击刚才添加的动Animator的Controller栏,然后从弹出窗口中选择Pistol动画控制器,如下图所示。
接下来点击Animator的Avatar框,并设置为 RobotRampage_PistolAvatar。如图2-2-5所示。
Avatar告诉动画系统如何在动画过程中变换模型。导入模型时,需要配置Avatar。为了简单起见,Avatar已经被提前配置好
对于突击步枪,选择2AssaultRifle 游戏对象,并将AssaultRifle动画控制器拖到检视视图,在所有现有组件之下。Unity会自动将Animator添加到游戏对象上。把Avatar设置为RobotRampage_AssaultRifleAvatar。
对3Shotgun做同样的操作,拖动它的Shotgun动画控制器,并设置Avatar为 RobotRampage_ShotgunAvatar,如下图所示。
运行游戏,测试武器,通过键盘上的1键、2键或3键在它们之间切换。3.添加准心
3.1绘制手枪准心
原理很简单,只是一个放置在摄像机前的简单的2D图像。这不是什么很高明的技术,但是很实用。
在开始放置UI元素前,首先需要一个画布。Unity提供了几种类型的画布。本游戏将使用叠加画布,即overlay canvas。
在层级视图中的空白处,右击选择“UI\Canvas”命令创建一个画布,重命名为“GameUI”。右击Canvas游戏对象,选择“UI\Image”命令创建一个图片,并重命名为“Reticle”。
在检视视图中,单击Source Image右侧的控件,然后选择reticleRed。
可以看到屏幕中央的红色准心。
3.2创建GameUI脚本
当切换成猎枪和突击步枪时,应该更新颜色。
创建一个新脚本,命名为“GameUI”。将GameUI脚本附加到GameUI游戏对象上。
在代码编辑器中打开GameUI,并将以下内容添加到脚本的顶部。using UnityEngine.UI;
这使脚本可以访问Unity基本的UI 类。接下来,在类中添加以下变量
[SerializeField] Sprite redReticle; [SerializeField] Sprite yellowReticle; [SerializeField] Sprite blueReticle; [SerializeField] Image reticle;
SerializeField 属性允许开发者向 C# 运行时传递有关特定类的信息。Sprite(精灵)代表了一个导入的纹理,可以被使用在2D游戏或用户界面。通过将纹理类型设置为Sprite,可以将其添加到用户界面中。
现在有三个精灵作为图像的源数据。但是只有一个会被显示,所以只需要一个Image。
在最后一个变量下面添加以下方法:public void UpdateReticle() { switch (GunEquipper.activeWeaponType) { case Constants.Pistol: reticle.sprite = redReticle; break; case Constants.Shotgun: reticle.sprite = yellowReticle; break; case Constants.AssaultRifle: reticle.sprite = blueReticle; break; default: return; }}
选中GameUI游戏物体,添加适当的精灵。拖动Reticle游戏对象到Reticle栏,如下图所示。
3.3修改GunEquipper脚本
在代码编辑器中打开 GunEquipper 脚本。为其添加一个GameUI 变量,创建对 GameUI 的引用,代码如下。
[SerializeField] GameUI gameUI;
保存脚本,回到Unity。在层级视图中选择Player游戏对象,并将 GameUI 对象拖拽到GunEquipper组件中的GameUI字段,如下图所示。
在代码编辑器中打开GunEquipper 脚本,并在 Update () 方法中的每个 if 语句的末尾添加以下代码。gameUI.UpdateReticle();
Update()现在应该如下所示,每次玩家改变武器将更新准心。
void Update() { if (Input.GetKeyDown("1")) { loadWeapon(pistol); activeWeaponType = Constants.Pistol; gameUI.UpdateReticle();} else if (Input.GetKeyDown("2")) { loadWeapon(assaultRifle); activeWeaponType = Constants.AssaultRifle; gameUI.UpdateReticle();} else if (Input.GetKeyDown("3")) { loadWeapon(shotgun); activeWeaponType = Constants.Shotgun; gameUI.UpdateReticle();}}
4.弹药管理
4.1创建Ammo类
游戏中应该提供一些声音的反馈,使玩家知道什么时候快没子弹了。如果玩家有足够的弹药,在开火时播放开火的声音。如果没有足够弹药,播放空弹夹的声音,并且不播放开火动画。
创建一个C#脚本,命名为“Ammo”。在代码编辑器中打开它,在顶部添加如下代码。using System.Collections.Generic;
这里可以使用字典类型。添加以下变量。
[SerializeField] GameUI gameUI; [SerializeField]private int pistolAmmo = 20; [SerializeField]private int shotgunAmmo = 10; [SerializeField]private int assaultRifleAmmo = 50; public Dictionary<string,int> tagToAmmo;
变量 pistolAmmo、shotgunAmmo、assaultRifleAmmo表示三种枪各自的弹药数。
tagToAmmo是一个由字符串映射int类型的字典,可以通过枪的类型找到其对应弹药计数。
在游戏开始时初始化Dictionary,添加如下代码。void Awake() { tagToAmmo = new Dictionary<string,int> { { Constants.Pistol ,pistolAmmo}, { Constants.Shotgun ,shotgunAmmo}, { Constants.AssaultRifle ,assaultRifleAmmo} }; }
Awake方法是在Start方法之前调用的一种特殊方法。在本例中,为了防止null 访问错误,需要在所有Start方法执行之前对字典进行初始化。
该方法只是简单地让每支枪在字典中键入一个键,并将值设置为适当的弹药类型。如果希望添加另一个弹药类型,可以简单地扩展字典。
添加如下方法:public void AddAmmo(string tag,int ammo) { if (!tagToAmmo.ContainsKey(tag)) { Debug.LogError("Unrecognized gun type passed: " + tag); } tagToAmmo[tag] += ammo; }
这个方法将增加特定类型的弹药。如果字典中不存在tag传入的类型,则会报错。
接下来添加以下方法:
// Returns true if gun has ammo public bool HasAmmo(string tag) { if (!tagToAmmo.ContainsKey(tag)) { Debug.LogError("Unrecognized gun type passed: " + tag); } return tagToAmmo[tag] > 0; }
这个方法将会判断是否还存在某类型的子弹,如果有,返回true。
同时添加以下方法:
public int GetAmmo(string tag) { if (!tagToAmmo.ContainsKey(tag)) { Debug.LogError("Unrecognized gun type passed:" + tag); }return tagToAmmo[tag]; }
这个方法只是简单地返回某种类型的枪的弹药数量。
最后,需要一个方法来实现弹药的消耗。添加如下代码。public void ConsumeAmmo(string tag) { if (!tagToAmmo.ContainsKey(tag)) { Debug.LogError("Unrecognized gun type passed:" + tag);} tagToAmmo[tag]--;}
与所有其他方法一样,首先会检查弹药名是否正确。如果正确,它将会找到对应的弹药,并减去一颗子弹。
保存脚本,回到Unity,并将Ammo脚本添加到Player游戏对象上。点击Player游戏物体,将 GameUI 游戏物体拖拽到Ammo组件中的 GameUI 字段上。如下图所示。
4.2添加声音
在代码编辑器中打开Gun脚本,并添加如下变量。
public Ammo ammo;public AudioClip liveFire; public AudioClip dryFire;
这将跟踪枪的弹药数量和保存开火和空弹的音效。修改Fire方法,代码如下。
protected void Fire() {if (ammo.HasAmmo(tag)) { GetComponent<AudioSource>().PlayOneShot(liveFire); ammo.ConsumeAmmo(tag);} else { GetComponent<AudioSource>().PlayOneShot(dryFire);} GetComponentInChildren<Animator>().Play("Fire");}
这将检查玩家是否有剩余的弹药。如果有,播放liveFire的声音;否则,播放dryFire的声音。如果开枪成功,花费一颗子弹。
接下来需要为每支枪单独设置弹药和音效。
单击1Pistol游戏物体,并拖动Player游戏物体到Ammo属性栏,表示对玩家Ammo脚本的引用。单击LiveFire字段右侧的控件,然后选择pistolShot音频文件。单击dryFire字段右侧的控件并旋转dryFire音频,如下图所示。
对3Shotgun和2Assaultrifle做同样的操作。
剩下的就是添加AudioSource组件。选中1Pistol、2AssaultRifle和3Shotgun游戏对象。在检视视图中单击AddComponent,键入AudioSource并选择AudioSource组件,如下图所示。
运行游戏,检查每只枪的射击音效。突击步枪有一个问题,枪的射击速度比动画播放速度快,这使运动与动作不同步。为了解决这个问题,需要回到Animator那里。
如果动画窗口已关闭,可以通过单击“Window\Animator”重新打开它。在层级视图中,选择2AssaultRifle 游戏物体,将会在Animator视图中看到它的动画状态。
默认情况下,动画在过渡过程中会有一段混合过程。这种混合过程被称为退出时间。选择从Fire到Base的转换。在检视视图中,可以看到退出时间的可视化效果。如下图所示
有两种方法可以取消退出时间。第一种,取消选中“Has Exit Time”属性。但是只有在有过渡条件时才能这样做。第二种,将时间轴中的右边的蓝色箭头拖到左侧,然后按Enter键将其保存。
这将导致新的动画会中断任何正在播的放动画。运行游戏,切换到突击步枪。测试修改过的内容。
总结
共同学习
-
-
基于Unity虚拟仿真实现机器人三轴孔明锁的装配.pdf
2021-08-11 23:49:46#资源达人分享计划# -
unity实战:狂暴机器人游戏教程(下篇)
2021-06-16 08:24:08文章目录前言三、敌人3.1创建...unity实战:狂暴机器人游戏教程(上篇) 提示:以下是本篇文章正文内容,下面案例可供参考 三、敌人 3.1创建机器人 步骤1 创建脚本 单击“Resources”文件夹,然后将RedRobot、Yellow -
Unity之机器人AI
2019-10-07 08:48:44接着上篇简单机器人AI的那个,下午搜了下相关的看到“Unity3D研究院之游戏开发中的人工智能AI(三十八)”,便仔细尝试按照他的思路着写了并测试了,效果杠杠的 我就贴自已写的一遍的代码了,作为一个小小小笔记吧... -
机器人战士角色3D模型Unity游戏素材资源
2018-05-01 13:20:24非常酷的机器人战士角色3D模型Unity游戏素材资源,有材质 -
unity六轴机器人自动移动路径
2019-06-24 17:00:59unity六轴机器人自动移动路径 六轴机器人如下图: 首先我们要明白在unity里面机器人的移动是在一个面上(取巧).只需要让他的一轴转90度可以自由的左右移动就可以了.这时候机器人的六轴想移动到哪一个点只需要移动对应... -
【Unity3D-Mirror多人坦克大战】机器人的产生和创建(十三)
2022-03-12 16:24:39机器人的产生和创建 -
unity机器人视野监测及寻路路径
2018-11-07 19:47:01以下为robot部分代码,其中具有robot检测player的功能,比较路径长度与检测距离问题。注释,, void Start() ...//机器人视野角度数 alertposition =Vector3.zero; animplayer = GameObject.FindGameOb... -
基于Unity3D的机器人仿真实验系统.pdf
2021-08-14 17:04:33基于Unity3D的机器人仿真实验系统.pdf -
强化学习训练机器人2 Unity3D环境
2019-08-09 18:47:01之前在Unity3D中尝试训练四足机器人学习奔跑前进,只是做了简单的尝试。在19年的寒假里由于要写论文,所以基于强化学习提出一种分层学习算法,实现四足机器人在腿瘸后仍可以继续向前运动。这种是一种比较简单的,... -
Unity3D机器人之战的教学资源及视频
2020-05-28 10:48:43Unity3D机器人之战的教学资源及视频 链接:https://pan.baidu.com/s/18-nrwzLJw3Vu89TW0BfvOA 提取码:6deb 我的资源里也上传有完整的项目代码,需自拿。 -
基于Unity3D的陪伴机器人设计.pdf
2021-08-14 10:16:37#资源达人分享计划# -
unity3d百度语音+图灵机器人
2018-03-19 23:27:54using NAudio.Wave; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using UnityEngine;...public class AsrR... -
基于Unity3D反恐排爆机器人虚拟仿真设计.pdf
2021-08-13 22:17:11#资源达人分享计划# -
基于Unity3D的工业机器人实训仿真教学系统的研究.pdf
2021-08-14 09:13:36#资源达人分享计划# -
Unity3d下使用图灵机器人
2018-04-12 10:43:58unity3d中问题内容通过WWW或者Httprequest进行POST请求返回图灵机器人的回答 -
Unity和C#-游戏开发-机器人跑酷+源代码工程
2021-08-11 19:30:48Unity和C#-游戏开发-机器人跑酷+源代码工程 -
Unity 2d 机器人的来回巡游
2020-06-06 00:04:38控制方向 changeTimer -= Time.deltaTime; //计时器每一帧都减小 if(changeTimer) { moveDirection *= -1; //如果小于0,改变方向 changeTimer = ... } } 附完整教程: Unity2d Rubys Adventure 课程设计报告 -
Robot-Killer:Unity上有关机器人的游戏
2021-04-13 15:02:15机器人杀手 Unity上有关机器人的游戏 -
unity3d 机器人 女战士 模型 插件 带18动作 Droid Girl v1.4.zip模型资源unity模型资源下载
2022-03-26 01:16:35unity3d 机器人 女战士 模型 插件 带18动作 Droid Girl v1.4.zip模型资源unity模型资源下载unity3d 机器人 女战士 模型 插件 带18动作 Droid Girl v1.4.zip模型资源unity模型资源下载unity3d 机器人 女战士 模型 ... -
基于Unity3D与Kinect的康复训练机器人情景交互系统.pdf
2021-08-14 20:24:18#资源达人分享计划#