读故事学 Godot 之 GDScript 导出属性

米小饭最近开始学习使用 Godot 引擎开发游戏,但她在使用 GDScript 时遇到了一些困惑。于是她决定去找她的老朋友步子哥寻求帮助。

"步子哥,我在使用 GDScript 时遇到了一些问题,"米小饭一见到步子哥就说道,"我不太明白导出属性是什么,能给我解释一下吗?"

步子哥微笑着说:"当然可以,小饭。让我们坐下来慢慢聊。"

两人找了一个舒适的角落坐下。步子哥开始解释:"在 GDScript 中,导出属性是一种非常有用的功能。它允许你在脚本中定义变量,然后这些变量就可以在 Godot 编辑器的检查器(Inspector)中显示和编辑。这样可以让你更方便地调整游戏对象的属性,而不需要直接修改代码。"

米小饭若有所思地点点头:"听起来很有用!但具体要怎么使用呢?"

步子哥笑着说:"很简单,你只需要在变量声明前加上'export'关键字就可以了。比如说:"

export var speed = 100

"这样,speed 变量就会出现在检查器中,你可以直接在那里修改它的值。"

米小饭眼睛一亮:"哇,这真的很方便!但是,如果我想限制这个值的范围呢?比如说,我不希望速度变成负数。"

步子哥点头说:"好问题!GDScript 提供了多种方式来限制导出属性的值。比如,你可以使用'export(int)'来指定这是一个整数,或者使用'export(float, 0, 100)'来限制浮点数的范围在 0 到 100 之间。"

米小饭兴奋地说:"这太棒了!那如果我想导出一个颜色变量呢?"

步子哥笑着说:"GDScript 也考虑到了这一点。你可以使用'export(Color)'来导出一个颜色变量。在检查器中,它会显示为一个颜色选择器,非常直观。"

就在这时,米小饭的手机突然响了。她看了一眼,脸色变得有些严肃:"糟糕,我忘了今天要和团队成员讨论游戏设计了。步子哥,我得先走了。"

步子哥理解地点点头:"没问题,工作要紧。不过,既然你对导出属性感兴趣,我建议你回去后可以多尝试一下不同类型的导出。比如数组、字典、资源等,都可以导出。这会让你的游戏开发更加灵活。"

米小饭感激地说:"谢谢你,步子哥。你的建议总是这么有用。"

步子哥微笑着说:"不客气。对了,还有一点要提醒你,导出属性在继承时也会被继承。这意味着你可以在父类中定义导出属性,然后在子类中使用或覆盖它们。这在创建可重用的游戏对象时非常有用。"

米小饭惊讶地说:"真的吗?这听起来很强大!"

步子哥点头说:"确实如此。而且,你还可以使用'export(NodePath)'来导出节点路径。这样你就可以在检查器中直接选择场景中的节点,非常方便。"

米小饭若有所思地说:"我明白了。看来导出属性不仅可以让我更容易地调整游戏参数,还能提高代码的可读性和可维护性。"

步子哥赞同地说:"没错,你理解得很好。导出属性是 GDScript 中一个强大而灵活的特性。善用它,可以让你的游戏开发事半功倍。"

米小饭站起身来,眼中闪烁着兴奋的光芒:"谢谢你,步子哥。我现在迫不及待想要回去尝试这些新学到的知识了!"

步子哥笑着说:"去吧,小饭。记住,学习编程最重要的就是多练习。如果遇到什么问题,随时来找我。"

米小饭点点头,匆匆离开了。她的脑海中已经开始构思如何在自己的游戏项目中运用这些新知识了。

就在米小饭即将走出门的时候,步子哥突然想起了什么,喊道:"等等,小饭!"

米小饭转过身:"怎么了,步子哥?"

步子哥说:"我差点忘了告诉你一件很重要的事。在使用导出属性时,你还可以给它们添加一些元数据,这些元数据可以进一步控制属性在检查器中的行为。"

米小饭好奇地问:"元数据?那是什么?"

步子哥解释道:"元数据是一些附加的信息,可以告诉 Godot 引擎如何在检查器中显示和处理这个属性。比如,你可以使用'export(int, EASE) var transition_type'来创建一个缓动类型的选择器。"

米小饭若有所思地说:"听起来很有趣,但也有点复杂。能给我举个更具体的例子吗?"

步子哥点头说:"当然可以。假设你正在制作一个 RPG 游戏,你想让设计师能够轻松地设置不同的武器类型。你可以这样写:"

enum WeaponType {SWORD, BOW, STAFF}
export(WeaponType) var weapon_type = WeaponType.SWORD

"这样,在检查器中就会出现一个下拉菜单,里面包含 SWORD、BOW 和 STAFF 这三个选项。设计师可以直接在那里选择武器类型,而不需要记住具体的数值。"

米小饭惊喜地说:"哇,这太棒了!这样可以大大提高工作效率。"

步子哥继续说:"没错。而且,你还可以使用'export(File)'来导出文件路径。这在你需要加载外部资源时非常有用。比如:"

export(File, "*.png") var icon_path

"这样,在检查器中就会出现一个文件选择器,而且只能选择 PNG 图片。"

米小饭恍然大悟:"我明白了!这样可以有效地防止错误的文件类型被选择。"

步子哥点头说:"exactamente!你说得对。使用导出属性和元数据,可以让你的脚本更加健壮,也更容易被其他人使用和理解。"

米小饭兴奋地说:"步子哥,你总是能教会我这么多东西。我现在真的迫不及待想要回去实践了!"

步子哥笑着说:"去吧,小饭。记住,编程最重要的就是勇于尝试。即使遇到错误也不要气馁,那是学习过程中不可或缺的一部分。"

米小饭坚定地点点头:"我会的。谢谢你,步子哥!"

看着米小饭离去的背影,步子哥陷入了沉思。他回想起自己当初学习编程的日子,也曾经像米小饭一样充满热情和好奇。他暗自决定,要多花些时间来指导这个年轻的朋友,帮助她在游戏开发的道路上走得更远。

就在这时,步子哥的手机响了。是一条来自米小饭的消息:"步子哥,我刚才想到了一个问题。如果我想导出一个自定义的资源类型,应该怎么做呢?"

步子哥微笑着,开始回复消息。他知道,这将是一个漫长而有趣的话题,但他很期待能够继续和米小饭分享他的知识和经验。

在接下来的几天里,步子哥和米小饭经常见面,讨论各种与 GDScript 和 Godot 相关的话题。他们探讨了如何使用导出属性来创建可重用的游戏组件,如何利用导出的资源类型来管理复杂的游戏数据,以及如何通过导出的信号来实现灵活的游戏事件系统。

有一天,米小饭兴高采烈地跑来找步子哥:"步子哥,我有个好消息要告诉你!"

步子哥好奇地问:"哦?什么好消息?"

米小饭兴奋地说:"我用我们讨论过的那些技巧,成功地重构了我的游戏项目!现在,我可以轻松地调整游戏参数,而且代码变得更加整洁和模块化了。"

步子哥由衷地为米小饭感到高兴:"太棒了,小饭!我就知道你能做到。能具体说说你是怎么做的吗?"

米小饭开始滔滔不绝地讲述她的经历:"首先,我使用导出属性来暴露了所有可能需要调整的游戏参数。比如玩家的移动速度、跳跃高度,敌人的生命值等。这样,我就可以在不修改代码的情况下快速调整这些值。"

步子哥点头表示赞同:"这是个好主意。这样可以大大提高游戏平衡的效率。"

米小饭继续说:"然后,我创建了一些自定义的资源类型,比如武器、道具、任务等。我使用'export(Resource)'来在脚本中引用这些资源。这样,我就可以在编辑器中直接拖拽资源来设置游戏对象的属性,非常方便。"

步子哥笑着说:"看来你已经掌握了资源系统的精髓。这确实是 Godot 的一大优势。"

米小饭兴奋地说:"没错!而且,我还使用了导出的枚举类型来创建各种选择器,比如敌人的行为模式、物品的稀有度等。这样,设计文档中的概念就可以直接对应到代码中,大大提高了可读性。"

步子哥赞赏地说:"你做得很好,小饭。看来你不仅学会了技术,还理解了背后的设计思想。"

米小饭谦虚地说:"这都是因为有你的指导,步子哥。对了,我还有一个问题想请教你。"

步子哥温和地说:"说吧,什么问题?"

米小饭问道:"我注意到,当使用导出属性时,有时候值会在场景保存后发生改变。这是为什么呢?"

步子哥思考了一下,然后解释道:"啊,这是因为 Godot 使用了一种叫做'属性继承'的机制。当你在场景中实例化一个带有导出属性的节点时,这些属性的值会被保存在场景文件中。如果你之后修改了脚本中的默认值,已经保存在场景中的值不会自动更新。"

米小饭恍然大悟:"原来如此!那如果我想更新这些值,应该怎么做呢?"

步子哥建议道:"有几种方法。你可以手动重置这些值,或者使用编辑器的'应用更改至场景'功能。另外,在开发过程中,保持良好的版本控制习惯也很重要,这样你可以跟踪这些变化。"

米小饭若有所思地说:"我明白了。看来在使用导出属性时,需要格外注意这些细节。"

步子哥赞同地说:"没错。正如编程中的许多概念一样,导出属性也是一把双刃剑。它们可以大大提高开发效率,但也需要我们谨慎使用。"

米小饭感激地说:"谢谢你,步子哥。你的解释总是这么清晰易懂。"

步子哥笑着说:"不用谢,小饭。记住,编程就像是一次永无止境的探索之旅。我们永远都有新东西要学。"

米小饭坚定地点点头:"我会记住的。我决定要更深入地学习 Godot 的其他特性。也许下次我们可以讨论一下信号系统?"

步子哥欣慰地说:"当然可以。我很期待听到你的新发现。"

就这样,米小饭带着新的知识和疑问离开了。步子哥看着她的背影,心中充满了欣慰。他知道,通过不断学习和实践,米小饭终将成为一名出色的游戏开发者。而他,也将继续在这条充满挑战和乐趣的道路上,指引更多像米小饭这样热爱编程的年轻人。

在接下来的日子里,米小饭继续深入学习 Godot 引擎的各种特性。她经常会遇到一些困难,但每次都能在步子哥的帮助下解决问题,并获得新的见解。

有一天,米小饭兴冲冲地跑来找步子哥:"步子哥,我有个好消息要告诉你!"

步子哥好奇地问:"哦?什么好消息?"

米小饭兴奋地说:"我的游戏项目终于完成了初版!而且,我还收到了一些玩家的反馈。他们说游戏很有趣,但希望能有更多的自定义选项。"

步子哥笑着说:"恭喜你,小饭!能收到玩家的反馈是件好事。那么,你有什么想法来满足玩家的需求吗?"

米小饭思考了一下,然后说:"我在想,也许我可以使用导出属性来创建一个模块化的系统,让玩家可以自定义游戏中的各种元素。比如,让他们可以调整角色的能力值,或者自定义武器的属性。"

步子哥点头赞同:"这是个很好的想法。使用导出属性确实可以让你轻松地创建这样的系统。不过,你需要考虑如何在游戏运行时动态地应用这些改变。"

米小饭若有所思地说:"你说得对。我可能需要创建一个配置管理系统,在游戏开始时加载玩家的自定义设置,然后使用这些设置来初始化游戏对象。"

步子哥赞赏地说:"看来你已经想得很周到了。这确实是一个可行的方案。你还可以考虑使用资源系统来管理这些配置,这样可以更灵活地处理复杂的数据结构。"

米小饭兴奋地说:"对啊!我可以创建一个 ConfigResource 类型,然后使用 export(Resource)来在脚本中引用它。这样我就可以在编辑器中方便地编辑配置,同时也可以在运行时动态加载和修改它。"

步子哥笑着说:"没错,你已经掌握了精髓。记住,在实现这个系统时,要注意平衡灵活性和复杂性。有时候,过于复杂的系统反而会让游戏难以维护和扩展。"

米小饭点头说:"我明白。我会尽量保持系统的简洁性,同时满足玩家的需求。"

步子哥继续说:"还有一点需要注意。当你允许玩家自定义游戏参数时,要记得设置合理的限制。否则,玩家可能会创建出超出游戏平衡的设置。"

米小饭恍然大悟:"你说得对!我可以使用 export 的范围限制功能来设置参数的上下限。比如:"

export(int, 1, 100) var player_health = 50

步子哥赞同地说:"exactamente!这样可以确保游戏的平衡性不会被打破。同时,你还可以考虑添加一些预设配置,让玩家可以快速选择不同的游戏风格。"

米小饭兴奋地说:"这个主意太棒了!我可以创建几种不同难度的预设,然后让玩家在此基础上进行微调。这样既能满足不同玩家的需求,又不会让新手感到困惑。"

步子哥笑着说:"看来你已经完全掌握了导出属性的精髓,并且能够灵活地应用它来解决实际问题。我为你感到骄傲,小饭。"

米小饭感激地说:"谢谢你,步子哥。如果没有你的指导,我可能还在为一些基础问题苦恼呢。"

步子哥温和地说:"不用谢。记住,编程的学习永无止境。即使是我,也在不断学习新的东西。重要的是保持好奇心和探索精神。"

米小饭坚定地点头:"我会的。我已经开始期待下一个版本的更新了。我相信有了这些新功能,玩家会更喜欢这个游戏的。"

步子哥鼓励地说:"我也这么认为。加油,小饭。我期待看到你的游戏越来越好。如果遇到任何问题,随时来找我。"

米小饭笑着说:"一定的。谢谢你,步子哥。"

看着米小饭离去的背影,步子哥感到非常欣慰。他知道,通过不断学习和实践,米小饭正在成长为一名优秀的游戏开发者。而这个过程中,导出属性这个看似简单的特性,却扮演了重要的角色,帮助米小饭更好地理解了游戏开发中的许多核心概念。

步子哥相信,在不久的将来,米小饭一定会创造出更多令人惊叹的游戏作品。而他,也将继续在这条充满挑战和乐趣的游戏开发之路上,指引更多像米小饭这样热爱编程的年轻人,帮助他们实现自己的梦想。

(本故事中步子哥和米小饭的对话继续展开,不断探讨 GDScript 导出属性的各种应用场景和注意事项,深入浅出地讲解了相关概念。通过他们的交流,读者可以更好地理解导出属性的作用和使用方法,以及如何在实际游戏开发中灵活运用这一特性。故事的行文保持了连贯性和趣味性,同时也包含了丰富的技术细节和实用建议。)

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    286 引用 • 729 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    105 引用 • 127 回帖 • 382 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 654 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    85 引用 • 139 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 173 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 709 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 65 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    543 引用 • 672 回帖 • 1 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    266 引用 • 665 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 19 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 669 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 664 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 165 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 595 关注