罗布乐思开发官方指南:Lua 语言编程

978-7-115-60393-7
作者: [美] 罗布乐思公司(Roblox Corporation)
译者: 胡厚杨
编辑: 郭媛

图书目录:

详情

罗布乐思(Roblox)Studio是融合了3D引擎、社交、云存储的开发工具,也是优质的游戏化教育工具。 本书是官方推出的罗布乐思开发指南,旨在帮助读者学会:使用属性、变量、函数、if-then语句和循环语句编程;使用数组和字典存储信息;使用事件移动事物,制作爆炸、倒计时,以及实现任何人们能想象到的事情;通过抽象和面向对象编程使代码更容易维护;使用数据存储创建排行榜、保存库存数据;使用射线投射让玩家在游戏世界里放置事物,例如家具和道具等。 本书语言通俗易懂,内容循序渐进,在每章结尾设置常见问题及其解决方案、测验及其答案等内容,帮助读者回顾并巩固所学知识。同时,本书还设有练习环节,鼓励读者独立动手练习,以提升开发技能。本书尤其适合新入门的游戏开发者和教育创新者使用。

图书摘要

版权信息

书名:罗布乐思开发官方指南:Lua语言编程

ISBN:978-7-115-60393-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美] 罗布乐思公司(Roblox Corporation)

译    胡厚杨

责任编辑 郭 媛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e60393”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

内容提要

罗布乐思(Roblox)Studio是融合了3D引擎、社交、云存储的开发工具,也是优质的游戏化教育工具。

本书是官方推出的罗布乐思开发指南,旨在帮助读者学会:使用属性、变量、函数、if-then语句和循环语句编程;使用数组和字典存储信息;使用事件移动事物,制作爆炸、倒计时,以及实现任何人们能想象到的事情;通过抽象和面向对象编程使代码更容易维护;使用数据存储创建排行榜、保存库存数据;使用射线投射让玩家在游戏世界里放置事物,例如家具和道具等。

本书语言通俗易懂,内容循序渐进,在每章结尾设置常见问题及其解决方案、测验及其答案等内容,帮助读者回顾并巩固所学知识。同时,本书还设有练习环节,鼓励读者独立动手练习,以提升开发技能。本书尤其适合新入门的游戏开发者和教育创新者使用。

作者介绍

Genevieve Johnson 是罗布乐思公司的高级教学设计师,她负责教育内容方面的管理,指导世界各地的开发者使用罗布乐思循序渐进地学习编程,她的工作可以帮助学生走上企业家、工程师或设计师的道路。在进入罗布乐思公司工作之前,她是iD Tech 的教育内容经理。iD Tech 是美国一个每年有超过5万名6岁至18岁学生参与的全国性技术教育科技营。在iD Tech 工作期间,她协助推出了一项成功的全部由女性参与的STEAM方案,她的团队为60 多门相关技术课程开发了教育内容,并提供了从编程到机器人技术再到游戏设计等各种学科的指导。

译者简介

胡厚杨,毕业于华南理工大学,风铃软件创始人,拥有12年软件行业工作经验、9年创业经验,具备丰富的软件开发和项目管理经验。

他是罗布乐思官方特聘导师,曾指导北京大学、上海交通大学、同济大学等的课程小组开发罗布乐思项目。

他熟悉罗布乐思社区的生态和文化,带领团队开发过多款罗布乐思作品,积累了丰富的罗布乐思开发和运营经验。

他开发的罗布乐思作品如下:

 《色块派对》,截至2021年12月,累计访问量8.76亿次,日活用户120万,最高同时在线4 万人;

 《超级布娃娃》,截至2021年12月,累计访问量1.83 亿次,日活用户60万,最高同时在线1.8 万人;

 《坠块派对》,截至2021年12月,累计访问量1.81 亿次,日活用户20万,最高同时在线1.2 万人。

推荐词

罗布乐思(Roblox)是全球最大的UGC(User Generated Content,用户生成内容)社区之一,它庞大的用户生态、门槛极低的开发引擎、简洁的作品发布流程等为广大游戏开发者和游戏爱好者提供了非常理想的游戏创作和验证环境。罗布乐思引擎——罗布乐思Studio采用Lua编程语言,因此掌握好Lua是进行罗布乐思游戏创作的必要条件。这本书不仅全面、深入浅出地讲解了Lua的基础语法,还详细介绍了其编程环境——罗布乐思Studio在编程时的各种操作,同时对编写游戏时常用的3D运算、客户端与服务器通信、数据存储、Tween动画、游戏循环结构等罗布乐思引擎特有的功能和API进行了全面的说明。这本书既可以帮助零基础的初学者快速、系统地掌握罗布乐思Lua,也可以帮助已经掌握Lua的开发者深入了解罗布乐思特有的功能和Lua API,可以说它是有志于罗布乐思创作的开发者的常备书。

——袁江海,上海光之海网络技术有限公司创始人

在传统游戏开发和推广的成本不断攀升的大环境下,罗布乐思这个拥有巨大流量的创作社区成为越来越多游戏开发者的首选。作为游戏编辑器,罗布乐思Studio除了提供完整的3D游戏开发功能外,还包含了网络同步和物理引擎、多平台一键发布、多人协作开发、云端版本管理等一系列具有强大生产力的工具,大大降低了游戏开发成本,也让开发者可以更好地专注于游戏本身的制作。这本书强调在实践中学习,手把手教玩家制作属于自己的游戏,既能帮助读者快速上手,也能给读者提供创意空间,帮助读者把天马行空的想法变为现实。希望看到更多有理想、有创意的游戏开发者通过这本书在罗布乐思上大放异彩。

——沈翔,点点互动(北京)科技有限公司CTO

推荐序

作为全球最大的互动社区之一,罗布乐思(Roblox)是数百万创作者和数亿玩家活跃的平台,他们在这里创作、学习和交流,形成了一个活跃、有创造力、充满想象力的社区。与此同时,越来越多的人开始关注罗布乐思是如何成长为今天这样一个强大的社区的。这就要从它的编程语言开始说起。

为什么选择Lua?

当大家第一次接触到罗布乐思开发的时候,不管是初学者还是有经验的开发者,第一个问题可能都是:为什么罗布乐思开发的编程语言是Lua?

相较于C++、C#等在游戏开发中常见的编程语言,Lua其实相对冷门。Lua作为一种轻量级且多范式的编程语言,主要被嵌入其他应用当中使用。Lua方便开发者快速地学习与开发,就如JavaScript一样,只不过后者多用于网页端开发。相比同样轻量且易读的Python来说,Lua的容错能力更强,比如,编写Python时如果出现缩进问题会导致脚本无法运行,Lua则没有这样的问题。对于新手开发者,尤其是青少年来说,轻量、易读且容错能力强的Lua作为罗布乐思 Studio的开发语言再合适不过了。

罗布乐思Studio不仅使用Lua作为开发语言,而且罗布乐思的App UI(User Interface,用户界面)也是用Lua编写的。不仅如此,为了使语言更高效、功能更丰富、编写更容易,罗布乐思对Lua 5.1.4版本进行更改和扩展,塑造了一个新的衍生语言Lua(RBX.Lua)。

关于Lua的选择,我们还可以从更早期开始追溯。

罗布乐思的元宇宙愿景

为什么罗布乐思会如此青睐Lua这样一款冷门语言?这还要从罗布乐思对元宇宙长期的愿景说起。罗布乐思的愿景是搭建元宇宙,而搭建元宇宙的各种必要元素,我们也面向大众进行过详细的阐述:

identity, variety, friends, anywhere, immersive, economy, low friction, civility. 

(身份认同、多样性、社交关系、任意地点、沉浸体验、经济循环、低延迟、礼仪文明。)

在这里我必须强调的一点是,所有这些元素的存在,都基于一个支持UGC的游戏开发引擎。可以说,罗布乐思独有的游戏开发引擎就是它的灵魂。而基于这款游戏开发引擎,找到一个合适的交互工具,让所有的开发者可以快速上手,以相对简单的方式高效完成作品,便成为罗布乐思成功的关键。时至今日,我们能看到这个交互工具的一部分,就是罗布乐思Studio。创作者会将其比喻成“画布”和“颜料”,而于此之上的“画笔”和“动作”,即由什么语言来撰写、如何撰写,则是接下来要解决的问题。

在这种情况下,也许大部分人会认为使用当下比较通用的语言是一个不错的选择,因为通用的语言容易吸引更多成熟的开发者。但是罗布乐思另辟蹊径,用一个不同的思路来看待这个问题,于是做出了不太常规的选择。在这个过程中,其实我们会发现,选择Lua与罗布乐思一直以来的文化息息相关。元宇宙是一个非常未来化的概念,当我们选择通往未来的道路的时候,我们优先考虑的并不是这门语言在今天有多通用,而是使用这门语言能在多大程度上助力我们或者适配我们达成目标,从而抵达最终目的地。

因此对于元宇宙来说,我们最看重的就是所选语言的简易程度、拓展性和效率。

 简易程度对于罗布乐思十分重要。因为作为一个UGC社区,我们吸引的用户除了非常有经验的开发者,更多的还是对3D元宇宙有兴趣的初级开发者,一款上手简单的脚本语言是再合适不过的入门方式。

 跟任何社区一样,罗布乐思开发者社区也会在不断壮大的同时展现出更多的对高级语言的需求,所以语言的拓展性也同样重要。

 在3D世界里,玩家体验的效果基础是效率,一个故事再精彩的游戏,如果经常卡顿,也不会有任何用户愿意玩。所以语言的效率也是极为重要的。

而对于Lua的选择,正是基于这三个最重要的点。这样一看,Lua成为罗布乐思的编程语言这件事,就水到渠成了。

而随着罗布乐思社区拥有越来越多的创作者,大家也开始逐步认识到Lua的强大与便捷。与此同时,游戏开发也不仅仅是专业团队的事了,越来越多的独立创作者进入这个赛道,去实现他们的创意和想法。因此,如何让更多人习得Lua,尽情体验创作的快乐,就变得尤为重要。

关于游戏开发,我们就从这里开始

对于游戏开发而言,我们都知道编程是必不可少的技能。游戏中的一切功能、玩法与设计,都要经过程序的编写才能得以实现。不论是按下按键后角色的运动,击败敌人时分数的增加,还是场景里道具的交互,其背后都是一行行运行着的代码。 

在传统的游戏开发引擎中,开发者们需要完成诸如自行搭建服务器、为不同的设备配机型、与操作系统进行适配、保存玩家数据等大量与游戏本身内容无关的工作,而像是数据后台、运维容灾、好友聊天、网络通信等多人在线游戏所必需的功能,更是让个人开发者和小型团队望而却步。因此,许多对游戏开发饱含热情的开发者,无奈之下只能选择开发单机游戏和小游戏,这无疑限制了广大开发者的想象力与创造力。

在罗布乐思的创作环境中,上述功能已经为开发者封装打包好了,只需简单调用即可。除此以外,罗布乐思更搭配有自带的玩家社区运营工具。开发者可以免去繁杂的后端搭建工作,轻松地与喜爱自己游戏的玩家进行交流,收集反馈和发布更新,从而专注于实现游戏玩法创意。

综上所述,不论你是一位初入游戏开发领域的新手,还是精力有限但又想要尝试多人网络游戏的个人开发者,罗布乐思无疑都是你最佳的选择。

长久以来,国内的开发者一直苦于没有优秀的中文学习资料,而关于Lua这款较为冷门的编程语言的学习资料更是少之又少,更不用说为Lua语言和游戏开发的应用场景所专门准备的教材了。对罗布乐思抱有浓厚兴趣的开发者,如果因语言问题而被拒之门外,着实让人觉得可惜。

《罗布乐思开发官方指南:Lua语言编程》正是一本为了解决这一问题,由罗布乐思官方撰写、翻译的书。这不单是一本编程语言的学习教材,更是一本从游戏开发的角度配合游戏开发中的实际应用场景进行讲解的全方位教学指南。

这本书将站在游戏开发者的角度,深入浅出地讲解Lua语言编程,带你推开元宇宙与游戏开发的大门。

邹嘉,罗布乐思开发者关系副总裁

资源与支持

本书由异步社区出品,哔哩哔哩网站罗布乐思官方账号提供相关资源,异步社区(https://www.epubit.com)提供后续服务。

配套资源

本书提供如下资源:

罗布乐思新手视频教程(入门篇、物理篇、代码初学篇、进  阶篇)。

扫描右侧的二维码,进入哔哩哔哩网站罗布乐思官方账号“罗布乐思开发者”的主页(或者以网页、App 的方式打开哔哩哔哩网站主页,搜索“罗布乐思开发者”),进入合集和列表(网页)或视频(App),可以查看以上视频教程。

提交错误信息

作者、译者和编辑尽最大努力来确保书中内容的准确性,但难免存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,输入错误信息,单击“提交勘误”按钮(见下图)。本书的作者、译者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100 积分。积分可用于在异步社区兑换优惠券、样书和奖品。

扫码关注本书

扫描右侧的二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/contribute 即可)。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的维护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

异步社区”是人民邮电出版社旗下IT 专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

异步图书”是由异步社区编辑团队策划出版的精品IT 专业图书的品牌,依托于人民邮电出版社近40 年的计算机图书出版积累和专业编辑团队。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号

第1章 编写你的第一个项目

在这一章里你会学习:

 为什么罗布乐思和Lua是“合拍”的组合;

 罗布乐思Studio的主界面;

 如何用你的第一行代码向世界说“你好”;

 如何用代码实现部件爆炸效果;

 如何检查错误;

 如何添加注释。

罗布乐思是一个十分受欢迎的游戏开发社区,它让不同职业的人能在一起创造出优秀的作品,这些人包括美术设计师、音效师,以及——你猜对了——程序员。

编程可以让玩家与事物产生互动。罗布乐思使用的编程语言是Lua。Lua是最容易学习的编程语言之一,它与罗布乐思Studio一起使用时,其代码的执行结果可以快速呈现。例如,一个范围巨大的爆炸效果只需要几行Lua代码就可以实现。

罗布乐思Studio是创作罗布乐思作品的工具,它通常会与Lua配合,以便捷地使用多人服务器、物理和照明系统、场景构建工具、货币化系统等。其中,罗布乐思Studio提供程序执行的环境。

如果你能进行美术设计,你就是创造者和设计师的结合,罗布乐思Studio提供了“画布”和“颜料”,而Lua提供了“画笔”和“动作”,你可以编写代码来实现你的创意。下面介绍如何配置罗布乐思Studio,以及用它创建你的第一个脚本,并测试你的代码。

1.1 安装罗布乐思Studio

罗布乐思Studio可以在Windows平台和Mac OS平台上运行。你可以在罗布乐思创作中心官网(见图1.1)下载并安装罗布乐思Studio。

图1.1 罗布乐思创作中心官网

1.2 罗布乐思Studio概述

罗布乐思Studio提供创建游戏所需的一切,包括角色模型、放置在游戏世界中的物品、天空图、音效等资源。

打开罗布乐思Studio,其登录界面如图1.2所示,可以使用微信或者QQ登录。

图1.2 罗布乐思Studio登录界面

首次打开罗布乐思Studio时,你会看到一些模板,可以选择其中之一作为作品的起始场景。最简单的项目起始场景是Baseplate模板。选择Baseplate模板,如图1.3所示。

图1.3 选择Baseplate模板

先从图1.4所示的罗布乐思Studio主界面中快速概览其主要部分,然后开始你的第一行代码。

图1.4 罗布乐思Studio主界面

1.工具栏功能区:其中的功能会根据选择的菜单选项卡发生变化。

2.工具箱:包含可用于游戏的资源。还可以使用Blender3D等3D建模软件来制作自己的资源,罗布乐思Studio包含一组网格编辑工具,可用于自定义3D模型。

3.3D编辑器:提供游戏世界视觉窗口。按住鼠标右键拖动鼠标可以转换视角,按W、A、S、D等键可以移动摄像机。表1-1所示为摄像机的控制方法。

表1-1 摄像机的控制方法

按键

实现动作

W、A、S、D

移动摄像机,分别对应向上、左、下、右移动

E

升起摄像机

Q

下降摄像机

Shift

缓慢移动摄像机

鼠标右键(按住并拖动鼠标)

旋转摄像机

鼠标中键(按住并拖动鼠标)

拖动摄像机

鼠标滚轮

放大或缩小镜头

F

聚焦到选中对象

4.项目管理器:用于便捷地查看游戏中的关键资源和系统,可以使用它在作品中创建对象。

5.属性窗口:用于查看和修改游戏中对象的属性,例如颜色、比例等。在项目管理器中选择一个对象,就可以查看其属性。

配置罗布乐思Studio主界面包括隐藏某些元素、调整位置、改变大小等。

罗布乐思Studio是一个非常完整的游戏开发环境,不只是Lua,其所涵盖的知识范围很广,有兴趣的读者可以查看《罗布乐思开发官方指南:从入门到实践》以了解更多。

1.3 打开输出窗口

罗布乐思Studio中的输出窗口默认是关闭的,在开发过程中需要将其打开,以查看与代码执行相关的错误提示和其他信息。

可以按照以下步骤打开输出窗口。

1.单击“视图”选项卡(见图1.5)。如果你关闭了一个窗口,又需要重新打开它,可以在这里进行操作。

图1.5 “视图”选项卡

2.单击“输出”(见图1.6),屏幕底部会显示输出窗口,如图1.7所示。

图1.6 单击“输出” 

图1.7 输出窗口

1.4 编写第一个脚本

下面开始编程。代码需要脚本来存储,而脚本可以直接创建在游戏世界的对象中。本节把脚本创建在部件中。

1.4.1 在部件中创建脚本

部件是罗布乐思的基本构建元素。部件的尺寸可以很小,也可以很大;可以是简单的形状,例如球形或楔形,也可以是由多个形状组合成的复杂形状。

1.在“首页”选项卡中单击“部件”创建部件(见图1.8),新创建的部件会出现在3D编辑器中,位于摄像机的视觉中心。

图1.8 单击“首页”选项卡中的“部件”创建部件

2.在项目管理器中,把鼠标指针悬停在部件上,并单击“+”符号,在弹出的菜单中选择Script(见图1.9),创建脚本。

图1.9 在弹出的菜单中选择Script

提示 快速查找对象

在弹出的菜单中输入对象名的第一个字母(本例是Script,所以第一个字母为S)或前两个字母,会显示过滤的列表,从而可以快速找到要创建的对象。

脚本会自动在编辑器中打开,在编辑器的顶部可以看到所有程序员都熟悉的用于输出“Hello world!”的默认代码(见图1.10)。

图1.10 默认代码

1.4.2 编写代码

从1970年以来,输出“Hello world!”一直是人们学习编程的第一句代码。函数是用于实现特定目的的代码块。在学习编程的过程中,会使用到预构建函数,例如print(),它用于在输出窗口中显示信息。同时,你也会学习如何创建自己的函数。

print()用于显示一个字符串,字符串是由字母、数字等组成的。在脚本示例中输出的字符串是“Hello world!”。

1.把示例代码改为你自己的代码,修改双引号内的内容,如今晚想要的晚餐,示例如下。

代码清单1-1

print("I want lots of pasta")

2.测试代码,在“首页”选项卡中单击“开始游戏”测试代码(见图1.11)。

图1.11 单击“开始游戏”测试代码

你的游戏形象会出现在游戏世界里。你可以在输出窗口中看到输出的字符串信息(见图1.12),包括输出该信息的脚本。

图1.12 字符串显示在输出窗口中

3.要退出测试,单击“停止”(见图1.13)即可。

图1.13 单击“停止”退出测试

4.单击3D编辑器上方的选项卡可以返回到对应脚本,如图1.14所示。

图1.14 单击Script选项卡返回脚本

1.4.3 编写实现爆炸效果的代码

代码可以做的不仅是通过输出窗口显示信息,它还可以改变玩家与游戏世界的互动方式,让游戏世界变得更加生动。下面在Baseplate模板中创建一个部件,用一段稍长的代码让触碰到部件的东西被破坏,产生爆炸效果。

1.使用移动工具把部件移离地面,并远离其“出生”点(见图1.15)。因为要编写的代码会破坏触碰到部件的东西,所以要避免这些东西因过早地被破坏而消失。

图1.15 把部件向上移动并远离其“出生”点

2.在属性窗口中展开Part,并勾选Anchored(见图1.16),使得单击“开始游戏”时部件不会掉落。

图1.16 勾选Anchored

3.在脚本的输出函数下方添加代码(见代码清单1-1)。

代码清单1-2

print("I want lots of pasta!")
 
-- 破坏触碰部件的任何东西
local trap = script.Parent
local function onTouch(partTouched)
    partTouched:Destroy()
end
trap.Touched:Connect(onTouch)

4.单击“开始游戏”执行代码,并触碰部件。

代码执行结果应该是玩家角色被破坏。你可能会注意到,此代码只会破坏直接触碰到部件的东西,例如玩家角色的脚。你可以尝试控制玩家角色跳到部件顶部或用手触碰部件,会看到只有玩家角色触碰到部件的部分被破坏。

这是因为代码只做你“告诉”它的事情,而你“告诉”代码只破坏触碰到部件的东西。如果要破坏整个玩家角色,则必须“告诉”代码如何摧毁整个玩家角色。在本书中,你将学习编写代码来处理更多类似这样的场景。在第4章“使用参数”中,你将会学习如何破坏整个玩家角色。

1.5 错误信息

代码不起作用怎么办?其实许多程序员都会在编写代码时犯错,所以不用过度在意,编辑器和输出窗口可以帮助你发现错误并修复它。尝试犯一些错误,可以学习如何更好地发现错误。

1.删除print()函数的反括号,代码下方会出现一条红线(见图1.17)。在编辑器中,红线表示发现了错误。

图1.17 红线表示编辑器发现了错误

2.把鼠标指针悬停在红线上,编辑器会显示一条错误信息(见图1.18),提示出了什么问题。暂时先不要修复错误。

图1.18 把鼠标指针悬停在红线上时,会显示一条错误信息

3.单击“开始游戏”,输出窗口中会显示错误信息,如图1.19所示。单击红色错误信息,编辑器会定位到问题所在的位置。

图1.19 输出窗口中会显示错误信息

此时应停止游戏测试,修复问题。

提示 游戏测试期间所做的更改不会自动保存

在游戏测试过程中进行更改要小心,因为你所做的更改是不会自动保存的。

1.6 代码的注释

在前面的代码中,你可能会注意到这句话“-- 破坏触碰部件的任何东西”,这是一条注释。注释以两个半字线开头,与半字线位于同一行的内容不会影响脚本的执行结果。

程序员使用注释来为自己和其他人说明代码的功能或留下一些提示性文字,毕竟当一个人很久没有看一段代码时,是很容易忘记它的作用的。

以下是本章前面编写的脚本的顶部注释。

代码清单1-3

-- 晚餐想吃什么?
print("I want lots of pasta!")

总结

在短短一章里,你已经取得了很大的进步,如果你是第一次学习编程或使用罗布乐思Studio,进步会尤其明显。这一章介绍了如何创建账户和使用罗布乐思Studio,通过“+”符号可以在部件中创建脚本,然后编写代码,把部件变成一个“陷阱”,让任何触碰到它的对象都被破坏。

另外,本章还介绍了如何使用“开始游戏”测试代码,你可以使用脚本编辑器和输出窗口的错误检测功能来帮助你排查问题。

最后,本章还介绍了注释,注释在编辑器中用于说明代码的作用,方便阅读。

问答

 可以在Chromebook上使用罗布乐思Studio吗?

 不可以,罗布乐思Studio必须运行在Mac OS或Windows平台上。游戏发布后,即可在Android、iOS、iPadOS、Mac OS、Windows、Chrome和Xbox等平台上开始游戏。

 如果脚本被关闭了,如何重新打开它?

 可以在项目管理器中双击脚本对象来重新打开它。

 如何保存我的工作?

 单击“文件”→“保存至Roblox”把修改保存到云端,这样就可以在任何计算机上打开你的游戏。

 如何了解罗布乐思Studio的更多信息?

 可以访问罗布乐思开发者官方网站来查看罗布乐思Studio的所有功能和API文档。

实践

回顾所学知识,完成测验。

测验

1.罗布乐思Studio使用    编程语言。

2.可以在    窗口中查看游戏对象的属性,例如颜色、旋转角度等。

3.游戏对象可以在    中找到。

4.要打开输出窗口来显示错误提示和其他信息,请在“    ”选项卡中打开它。

5.判断对错:注释可以增加代码的功能。

答案

1.Lua。 2.属性。 3.项目管理器。 4.视图。 5.错的,注释不会影响代码的执行结果。

练习

使用本章所学知识制作一个迷你障碍游戏(见图1.20)来熟悉罗布乐思Studio的创作工具,游戏中可以包含一些需要玩家角色躲开的部件,也可以包含图中所示的熔岩地板。

图1.20 使用本章所学知识制作的迷你障碍游戏

提示

 创建许多部件,然后使用“首页”选项卡中的移动、缩放和旋转工具来对部件进行操作(见图1.21),还可以在其中修改部件的材质、颜色等属性。

图1.21 使用“首页”选项卡中的工具来创建和操作部件

 创建一个大部件,然后在部件里创建一个脚本,参考前面的破坏任何东西的代码,把部件变成熔岩。

 可以在工具箱中查找更多模型。请注意,某些模型中可能包含了脚本。

 锚固所有部件和模型。

 如果你知道如何使用地形工具,也可以用它来制作障碍游戏。

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e60393”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

第2章 属性和变量

在这一章里你会学习:

 项目管理器中对象的父子关系;

 如何修改对象的属性;

 如何创建变量;

 如何给变量赋值;

 哪种变量的数值可以保持不变;

 如何创建对象的实例。

在本章中,你将学习如何在层次结构中找到要修改的对象,制作一个可爱的NPC(Non-Player Character,非玩家角色)用于游戏指引,NPC可以向玩家提示游戏中的危险,如图2.1所示。你可以使用代码修改部件的外观和行为来制作NPC。

图2.1 NPC向玩家提示游戏中的危险

2.1 对象的层次结构

如果想用代码控制某些对象,则需要找出这些对象在游戏层次结构中的位置。查看项目管理器中的对象,可以看到一些游戏对象嵌套在其他对象中。例如,在图2.2中,Baseplate对象嵌套在Workspace对象内,这说明Baseplate是Workspace的子对象,Workspace是父对象。其实Workspace也是game的子对象,只是项目管理器中没有显示game对象。

图2.2 Baseplate是Workspace的子对象

在代码中,可以使用点号来表示游戏的层次结构,例如game.Workspace.Baseplate,这就告诉了代码需要使用什么对象。

使用点号在Workspace中调用Baseplate,然后使用Destroy()来销毁Baseplate。

1.在Baseplate中创建脚本,然后双击或按F2键来重命名脚本为DestroyBaseplate(见图2.3)。

提示 重命名脚本

重命名项目中的脚本可以使项目条理清晰。

2.在脚本中输入game.Workspace.Baseplate:Destroy()。

3.测试游戏,底板Baseplate会被销毁,它也可能在玩家角色加载之前被销毁。

图2.3 重命名脚本

2.2 关键字

关键字是编程语言中预先保留的词,每个关键字都有特殊的含义。Lua的关键字比大多数编程语言少,这让它成为最容易学习的编程语言之一。罗布乐思Lua中的一些关键字是内置在Lua中的,还有一些是罗布乐思为了让编程效率更高而增加的。例如罗布乐思Lua中的一个关键字workspace(小写),因为game.Workspace在开发中使用频率较高,所以罗布乐思工程师决定提供一个关键字workspace来缩短它。

修改刚刚编写的代码,即使用关键字workspace代替game.Workspace。

1.在代码中把game.Workspace替换为workspace。

提示 注意正确的大小写

关键字是区分大小写的,所以要确保workspace是小写的。

2.测试游戏,验证代码是否仍然有效。

使用点号不仅可以调用对象的子对象,还可以调用其父对象。通常使用关键字script来调用脚本对象的父对象,不管脚本对象的名称是什么,script都代表脚本对象自己。

可以使用script.Parent来缩短代码,并用Destroy()来销毁底板Baseplate。

1.在之前的脚本中用script.Parent:Destroy()替换代码。

提示 利用自动补全功能

你在输入代码时,会看到建议的代码,此时你可以按回车键接受建议。这样可以节省打字时间,并且最大限度地降低打错字的概率。

2.测试游戏,验证你的代码。

本书的附录提供了完整的Lua关键字列表。

2.3 属性

点号除了可以表示游戏对象的层次结构,还可以调用对象的属性。那什么是属性呢?我们用一个例子来解释,观察图2.4中的花,你怎么向别人描述它呢?

图2.4 一朵花

可能你开始会说它是一种植物,当被问到更多信息时,你可能会说它是一种有黄色花瓣的绿色植物。工程师可能会添加额外的细节,例如它是一株黄色花瓣的绿色植物,高3个单位,宽2个单位。根据图2.5,可能有人会说它着火了。

图2.5 燃烧的花

你所描述的一个对象的所有特点都是该对象的属性。

2.4 查找属性和数据类型

当你在项目管理器中单击不同对象时,属性窗口中的对象属性列表是会变化的,各个属性中的数值的格式称为数据类型。以下是一些重要的数据类型。

 Number:数字,也就是实数,例如11.9。

 String:字符串,用双引号引起来的字符,用于存储信息。print()可输出字符串类型的数据,例如“99根香蕉”。

 Boolean:布尔,值为true或者false。一般具有开、关状态或选中、未选中状态的属性使用布尔类型。

 Tables:表格,一组信息,例如{Amy, Bill, Cathleen}。

更多数据类型的介绍,请参阅附录。

2.5 创建变量

现在你已经学会了如何在层次结构中查找对象,了解了属性具有特定的数值格式(称为数据类型),下面就可以开始创建变量了。

变量用于存放信息,一般用于保存对象和各种类型的数据。某些变量只能在特定脚本或代码块中使用,被称为局部变量;而有些变量可以在脚本中广泛地使用,被称为全局变量。

一般情况下的变量都是局部变量,除非有特殊的原因,否则不会用到全局变量。局部变量可以使代码执行得更快,并且不太容易出现名称冲突的问题。本书中创建的变量几乎都是局部变量。

要创建局部变量,先输入local,然后输入所需的变量名称,举例如下。

代码清单2-1

local baseplate

创建变量后,可以使用等号设置变量的值,举例如下。

代码清单2-2

local baseplate = script.Parent

可以把等号看作“是”,所以上面的变量可以读作“baseplate是script.Parent”。创建变量后,可以使用变量名称多次访问变量保存的信息,举例如下。

代码清单2-3

local baseplate = script.Parent
baseplate.Transparency = 0.5

可以根据需要随时更新变量的值,如果使用变量来保存游戏中的得分,那么每次玩家的得分改变时,都把更新后的得分赋给变量,如下所示。

代码清单2-4

local playerScore = 10
 
print("playerScore is " .. playerScore)
 
local playerScore = playerScore + 1 -- 玩家得分加一
 
print( "new playerScore is " .. playerScore)

在输出窗口中可以看到图2.6所示的输出信息。

图2.6 先输出playerScore的初始值,再输出更新后的playerScore的值

提示 组合字符串和变量

字符串和变量可以用print()同时输出,但需要用两个点号来组合它们,组合值称为串联。

使用目前掌握的知识创建一个NPC,警告玩家熔岩场的危险。本练习将帮助你练习使用点号来调用层次结构的对象和属性,以及变量和数据类型。

首先创建NPC。

1.单击“部件”下拉按钮,从下拉菜单中选择创建球体或其他类型的部件。

2.把部件重命名为GuideNPC。

3.在球体内创建脚本,并重命名脚本。

4.在GuideNPC中创建Dialog对象,不要重命名Dialog(见图2.7)。

图2.7 在GuideNPC中创建Dialog对象

然后编写脚本。

在本示例中,将创建两个变量,第一个变量用于保存脚本的父部件,第二个变量用于保存提示信息,该信息在玩家第一次进入游戏时显示。还有一些用来定义NPC外观的代码。

1.把NPCScript中的默认代码删除,创建一个名为guideNPC的局部变量,变量赋值为脚本的父级。

代码清单2-5

local guide = script.Parent

提示 对象命名规范

为了保持代码编写的一致性,游戏中的对象使用大驼峰命名法,即所有单词的首字母都大写;变量使用小驼峰命名法,即除第一个单词外,其他单词的首字母大写。

2.创建第二个变量来保存提示信息,该信息是一个字符串。

代码清单2-6

local guideNPC = script.Parent
local message = "Danger ahead, stay on the rocks!"

3.为了让NPC像幽灵,可以把NPC的透明属性值设置为0.5。

代码清单2-7

local guideNPC = script.Parent
local message = "Danger ahead, stay on the rocks!"
guideNPC.Transparency = 0.5

4.把保存提示信息的变量赋给NPC的子对象Dialog的属性InitialPrompt作为其值。

代码清单2-8

local guideNPC= script.Parent
local message = "Danger ahead, stay on the rocks!"
guideNPC.Transparency = 0.5
guideNPC.Dialog.InitialPrompt = message

开始游戏测试,单击NPC头部上方的问号来查看提示信息。

2.6 修改颜色属性

对象的颜色属性是代码中经常会修改的属性。要修改颜色,需要了解色彩的光学原理。屏幕上的所有颜色都是由三原色(红色、绿色和蓝色)混合而成的。每种颜色的强度范围是0~255,这3种颜色等量混合并达到一定的强度就会显示为白色(255,255,255);这3种颜色调低到(0, 0, 0)就会显示为黑色。纯红色的色值是(255, 0, 0),纯绿色的色值是(0, 255, 0),你认为纯蓝色的色值是什么?

将少量红色与大量蓝色混合,把NPC变为紫色。

代码清单2-9

guideNPC.Color = Color3.fromRGB(40, 0, 160)

提示 使用颜色选择器找到正确的RGB值

当你输入颜色值时,会出现一个色轮(见图2.8),如果单击它,就会弹出用于选择颜色的窗口,选择所需的颜色,然后单击“确定”,代码中就会自动写入对应的RGB值。

图2.8 色轮

2.7 实例

本章的最后一个主题是实例,实例是游戏对象(例如部件、脚本和火花效果)的副本。

除了前面介绍的使用“+”符号,还可以使用函数Instance.new()来创建实例,如下所示。

代码清单2-10

local part = Instance.new("Part")

创建部件后,对其属性进行修改,然后把它的父级设为workspace。

本次不使用项目管理器来创建部件,而是使用代码来创建,然后修改部件的颜色,最后把它放在workspace中,就可以使其被看到。

1.在ServerScriptService中创建一个脚本。

2.创建部件的实例,然后设置颜色,最后设置它的父级。

代码清单2-11

local part = Instance.new("Part")
part.Color = Color3.fromRGB(40, 0, 160)
part.Parent = workspace

你甚至可以直接在实例内创建实例。

代码清单2-12

local part = Instance.new("Part")
local particles = Instance.new("ParticleEmitter")
part.Color = Color3.fromRGB(40, 0, 160)
particle.Parent = part
part.Parent = workspace

提示 新的部件实例默认生成在世界中心

使用代码创建部件时,它会生成在世界中心,即默认的“出生”点所在的位置。如果你在测试时看不到新建的部件,可以尝试移开“出生”点,然后再次测试。

总结

游戏中的对象都具有颜色、比例和透明度等属性,属性决定了对象在游戏中的外观和行为。属性使用特定格式的数值,这些格式称为数据类型。字符串、布尔和数字是常见的数据类型。

在代码中,点号可以用于调用对象的属性,也可以用于调用项目管理器中的对象。

当你了解了对象的属性和对象在游戏层次结构中的位置,就可以使用代码来对其进行修改。

变量用于保存脚本中需要使用的信息,主要有两种类型,全局变量和局部变量。如果没有特殊原因,一般都使用局部变量。

在脚本中,可以使用函数Instance.new()来创建游戏对象实例,如部件、脚本、对话框和粒子发射器等,此函数的输入参数是对象名称对应的字符串。

问答

 如何知道一个属性使用的数据类型?

 可以在罗布乐思开发者官方网站上搜索游戏对象、属性和它对应的数据类型。例如,在搜索框中输入Roblox Dialog Properties,然后查看搜索结果。

图2.9所示为Dialog的API页面,它有一段简短的描述、一个属性列表和对应的数据类型,可以单击每个属性和数据类型来了解如何使用Dialog。

图2.9 Dialog的API页面显示了属性和对应的数据类型的简短描述

 为什么不能创建一个变量来保存要更改的属性?例如local partColor = workspace.Part.Color。

 对象的层次结构和属性是两种不同的数据,不能混用。

实践

回顾所学知识,完成测验。

测验

1.什么数据类型只使用值true和false?

2.变量用于    信息。

3.如果要保存玩家的姓名,字符串String、布尔Boolean、枚举Enum、浮点数Float哪种数据类型合适?

4.要调用脚本的父级,请使用    

5.在部件中创建的对话框对象是此部件的    

6.print()输出的由字符串和变量组合而成的数值称为    

答案

1.布尔Boolean。 2.存放。 3.字符串String。 4.script.Parent。 5.子级。 6.串联。

练习

第一个练习,给NPC添加一张脸,让NPC更生动,可以创建贴花实例来进行添加。你可以使用以下链接的纹理,也可以上传自己的纹理。

提示

 要为NPC添加一张脸(见图2.10),可以在部件里创建Decal(贴花)实例,把Texture(纹理)属性的值修改为图片资源的链接。

图2.10 为NPC添加一张脸,看起来更生动

 你可能需要旋转NPC,使它面向正确的方向,或者你可以尝试修改贴花的Face属性来改变贴花的位置。

 参考代码见附录。

第二个练习,只使用代码来创建指引提示。

提示

 在ServerScriptService中创建一个Script对象来编写代码。

 使用Instance.new()创建提示的主体部分,即Dialog对象。

 锚固部件,锚固属性Anchored是布尔数据类型。

 对部件进行修改,把Dialog对象的父级设为部件,然后把部件的父级设为workspace。

 NPC会以立方体的形态出现在游戏世界的中心。在第14章“3D世界空间编程”,你将学习如何使用坐标系把对象移动到预期的位置。

 参考代码见附录。

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e60393”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

相关图书

Rust游戏开发实战
Rust游戏开发实战
JUnit实战(第3版)
JUnit实战(第3版)
Kafka实战
Kafka实战
Rust实战
Rust实战
PyQt编程快速上手
PyQt编程快速上手
Elasticsearch数据搜索与分析实战
Elasticsearch数据搜索与分析实战

相关文章

相关课程