惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
P
Privacy International News Feed
Apple Machine Learning Research
Apple Machine Learning Research
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
GbyAI
GbyAI
The Hacker News
The Hacker News
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
A
About on SuperTechFans
S
Secure Thoughts
G
Google Developers Blog
博客园 - 司徒正美
Forbes - Security
Forbes - Security
T
The Exploit Database - CXSecurity.com
Latest news
Latest news
V2EX - 技术
V2EX - 技术
I
InfoQ
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Security Latest
Security Latest
AI
AI
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cloudbric
Cloudbric
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
博客园 - 聂微东
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Schneier on Security
博客园 - 【当耐特】
NISL@THU
NISL@THU
Y
Y Combinator Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
Lohrmann on Cybersecurity
Help Net Security
Help Net Security
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

机核

游戏性能旗舰最强之选,一加 Ace 6 至尊版国补到手价2999元起 6元钱自己更换电动车刹车线 《生化危机9:安魂曲》编剧Haris Orkin专访 摸金游戏?音乐游戏!暗区新赛季这把能弹的琴有何来历? 好评国产武侠SRPG《息风谷战略》免费DLC现已推出 | 机核 GCORES 碎片 《生化危机:安魂曲》将于5月实装首个免费更新内容 | 机核 GCORES 新锐东方游戏,谱写世界新章! 沉浸式恋爱视觉小说游戏《心象演算》免费试玩版现已正式上线 | 机核 GCORES 互动影游《代号三国:龙起》上线!穿越三国与曹操并肩、与佳人同行、与权谋博弈! 《老头收集梦想生活》,游戏酒桌会6,录音笔VOL.689 | 机核 GCORES 破界·共生——《白日梦:无限世界》五大核心游戏特点解析 价格已到史低,锐龙5 9600X/锐龙7 9700X正适合抄底 时间循环之旅即刻启程!《归环》一周目测试今日开启 热门在线韩游变魂游,洛奇衍生作能否打破“花瓶”魔咒? LG UltraGear evo 全新高端显示器系列:当“5K”遇见“AI”,不止强大,更懂热爱 反套路三国互动影游《代号三国:龙起》今日上线! 愿望单登记人数突破10万!备受瞩目的“女儿养成游戏” 《梦幻魔法公主》今日于Steam平台上线!限时八折优惠中 《黑神话:悟空》全球音乐会2026巡演将于4月29日12时开票 | 机核 GCORES “Snowguelike”生存肉鸽挖矿新作《蛙穿雪境》公布发售日期,5月7日正式上线 | 机核 GCORES 重塑移动办公、AI创作新境!全新华硕灵耀Air系列、ProArt 骁龙版震撼首发,创芯未来 均分88:《Saros》媒体评分汇总 | 机核 GCORES 上海烛龙公布合作遗迹探险游戏《吉时已到》首支预告片 | 机核 GCORES 首个独立游戏《萝薇日记》已上线Steam! 烛龙新IP《吉时已到》首曝,打造国内首款中式合作遗迹探险游戏 喜加一:《暗黑破坏神Ⅳ》国服现已开启限时免费领取本体活动 | 机核 GCORES 新版《生化危机》电影定于9月18日上映,官方网站现已上线 | 机核 GCORES 《冲就完事模拟器2》“星球大战”联动DLC正式宣布 | 机核 GCORES SteamController将于5月4日发售,售价99美元 | 机核 GCORES 事已至此,内存这么用也算省钱了,“2+1”非对称双通道应用实测 505游戏母公司现已收购《明末:渊虚之羽》IP | 机核 GCORES 基石 手动杂谈12|格斗游戏也能讲好故事 | 机核 GCORES I Love You Mr Snowball 我的向日葵小姐 会比GTA6先发售吗?最硬核的生存游戏《DAYZ》要推新DLC了 周记02:在2026遇到新怪谈 什么硬件,能让游戏Loading界面快速消失? | 机核 GCORES GadioSpec《百年风云世界杯》免费试听集 | 机核 GCORES 百年风云世界杯Vol.1丨足球崛起 | 机核 GCORES 100年前,一群人提前替我们经历了AI恐惧 | 机核 GCORES 《呼啸山庄》2026 ——一辆当代艺术的大卡车冲撞了我的大脑 手游《天穗之咲稻姬:日之香巡灵传》宣布将于7月27日停服 | 机核 GCORES 集结梦之队,征战世界杯,《最佳球会ONLINE》上线Steam 山水绝景随心拼 休闲建造游戏《千里山河录》Steam商店页公开 巫师帽、法袍、魔杖,为什么它们是影视、游戏里的法师必备三件套? 《无鞘信使》-第一章 复古风自动战斗肉鸽《终结之终结》Steam商店页面现已上线 电脑里有一款不破不立的MMO,录音笔VOL.688 | 机核 GCORES 《生化危机》30周年纪念周边发售,这次是真的“保护伞” 可靠耐用+AI全能,惠普战66 2025锐龙版深度体验 《时之书:无尽终章》关卡“大航海时代”全球首次公开 经典名作《乌龙派出所》改编经营模拟游戏《乌龙派出所~阿两的商店街物语~》正式宣布支持简体中文 明日开冲,解锁反套路三国互动影游《代号三国:龙起》即将上线 独立游戏《这是我的宝藏!》已发售~ 降低难度不是唯一解,无压力死亡也是好体验 Netflix官宣新片《普通人》:讲述韩国现代史上的权力风暴 《生化危机:安魂曲》全球销量现已突破700万份 《绝地鸭卫》PC版5月15日正式发售 亡妻回忆录?女性向情感叙事游戏《S-mail》现已正式发售 全新酷黑风格,酷睿Ultra 200S PLUS的高性价比搭档!七彩虹BATTLE-AX B860M-PLUS S WIFI7 V20 超级黑刃主板测评 胖狗 索尼发布了港台地区PS5产品价格调整公告,将于5月1日起实施 二次元怪猎+性感美女!《碧蓝幻想:无尽黄昏》开启Beta公测 这款怪谈类型中式恐怖游戏居然更新了?! 《百日战纪 -最终防卫学园-》改编漫画将于今年冬季开启连载 《如被附身,请致电我们》:匈牙利黑色幽默恐怖小说 《竹屿山房杂部卷五》(译文) 大树 超越引擎 摄影分享丨四月 碎片杂记vol.72 当老式FPS与老式动画技术碰撞出新时代的火花—《神探杰克鼠》 想做独游,如何避免首个项目就褒姒? 在线多人动作游戏《OCTOPinbs》将于5月12日上线Steam! 《酒鬼女神的酒诡》确定将于2026年登陆Steam 《CRYMELIGHT》将于11月5日(周四)正式发售!4月25日开始预购! 钢铁国度MKI部落Evolution,蛮兵部分 【钢铁国度】部落-Primal MK I,蛮兵部分 这是一个高中生用ai跑出来的作品,我自称他为物理神话 钢铁国度MKI部落Metamorphosis,蛮兵部分上 钢铁国度MKI部落Metamorphosis,蛮兵部分下 INDIE Live Expo于4月25日举办:首发9款新作,超200款独立游戏亮相 暗黑卡牌策略新作《魔忌:穷鼠啮狸》发布全新中文试玩版和发售预告片,4月30日正式上线在即 战锤40K长篇小说:变节者・苦难主宰(三)(全书完) 战锤40K长篇小说:变节者・苦难主宰(二) 战锤40K长篇小说:变节者・苦难主宰(一) 英语语言学习丨短语专题1:短语的特点 唯一的EVE战争 【少前同人】【M200】战术人形会梦见音乐会吗 【昏迷3】即将发售,前作主角悉数到场!“恶灵”宋老师化身可操控角色 业内人士:游戏公司“十有八九”使用生成式AI,包括卡普空 欢庆一周年:《光与影:33号远征队》全新纪念艺术图、超值折扣与免费更新同步上线 才刚刚开始呢 【抽奖】《星际卡车司机》推出免费大型更新,四折平史低折扣进行中 四人合作FPS游戏《佣兵猎手》抢先体验重大更新 1 现已上线 Raw Fury新作《深馅地牢 Deep Dish Dungeon》将于今秋加入 XGP 塔防幸存者游戏《魔怪来袭》推出首个 DLC 《饿狼传说:群狼之城》1周年纪念!新DLC“沃尔夫冈·克劳萨”今日参战 猫狗相伴 欢乐闯关 双人合作平台跳跃游戏《猫狗同行》上线Steam商店页 《同行:月球逃脱》(Together: Moon Escape)上线将于明日上线Steam
Godot入门到弃坑:GDScript精要——变量
cameLcAsE · 2024-01-27 · via 机核

上一篇中我们实际上已经讲解了函数的很多重要内容。这一篇中我们来学习另一个重要的基础概念——变量。

单刀直入,变量(variable)是给数据取的名字。

每次需要用到1的时候,我可以直接写1。但是每次写114514的时候,我每次都要按6下,就显得麻烦了,更不用说圆周率这么长的东西了。所以我可以给它取个名字:

在GDScript中定义变量时,首先写下关键字var(variable的缩写),后面是变量名称,等号后面是它的初始值。

这句话我们读作“定义变量n,并将114514赋值(assign)给它”。这里的=是等于号没错,但是在这里它不是“等于”的意思,而是要从右往左看,是“将114514赋值给n”的意思。而在编程语言中表达“等于”含义的符号将在未来讲解。

这样在每次需要用到这一数字时,我都可以通过这个变量来获得。例如在之前的可以动的logo的脚本中,我们是让它固定每次移动5个单位。现在我们来定义一个叫speed的变量,用来代表它的移动速度:

要改变速度,只需要改变speed的值就好了。

数据类型

对于计算机——准确地说是对于CPU来说,数据没有任何意义,它只需要完成它的工作就好。但是对于人类来说,数据在具体的问题中有具体的含义。将数据分为不同类型有助于我们防止错误地使用数据。比如我们一般不希望将一只熊猫除以数字2。

GDScript中可以为变量标注数据类型。除了上述提到的那样可以帮助我们防止错误,还能让编辑器为我们提供更准确的自动补全建议。例如,我们将speed标注为int类型:

int是integer的缩写,即整数。我们会不断遇到各种各样的数据类型,不同的类型有不同的操作可用。实际上,各节点也有自己的所属类型。

此外,除了整数,也有小数类型,在GDScript中,小数用float表示,float指的是浮点数(floating-point):

此前我们在输出Hello World时已经用到了字符串。字符串的类型名称为String(其本意就是“串”的意思,在编程中一般就指字符串,也是弦的意思):

前面提到,类型系统的作用之一就是防止对数据进行误操作。你可以试试看把数字2给这个标注为String的变量。

编辑器会报错:Cannot assign a value of type "int" as "String".即无法把类型为int的值作为String赋给变量。要想要一个内容为2的字符串我们要写"2"。

你可能已经注意到,整数和小数之间可以自动转换不会报错。但是字符串和数字没法,我们需要一些函数来实现数字到字符串的转换,例如:

这里用到了num函数,它可以把数字转换为String。

前面我们也看到在实现获得键盘输入时出现了Input.is_action_pressed这种写法,这里该怎么解读呢?这个点就相当于说后面这个东西是属于前面这个东西的,和前面这个东西是相关的。在你输入这个点时,你可以提供自动补全建议看到String的更多可用函数,可以先自己探索一下。

我怎么知道哪个函数有什么用呢

告诉你一个秘密。按住Ctrl键,然后移动鼠标,你会发现脚本编辑器中很多东西下方就会出现一条下划线:

变成小手的时候点一下,此时就来到了文档中对应的部分。

这就是各类开发工具必不可少的文档(Documentation,简称docs)。会介绍各种类型、函数等等。这里就提到了这个num函数有什么用,以及它的头部是如何定义的。

可以注意到左侧的方框中显示的是已打开的文件(包括脚本文件和文档),文档看够了点击自己要编辑的文件回去就好了。右上方的箭头符号也是和各种浏览器一样功能,可以前进后退。

同样,按住Ctrl点击类型名称可以直接进入某个类型的文档,在里面会介绍该类型的各种可用函数。也可以在在线文档中查询

由于各种类型的函数有很多,不可能有人会随时记得有哪些函数、各个函数怎么用。合格的开发者的基本技能之一就是要会查文档。

函数的类型

前面讲解函数的时候没有提到的是,函数本身也有类型,这里主要指的是它返回值的类型。上面提到的num函数的类型应该如何解读呢?

String num(number: float, decimals: int = -1) static

最开头的是返回值类型,后面和函数定义时类似,依次是函数名称和参数列表。这里有两处我们暂时不太清楚。

首先是最后的static,鼠标放到这个词上面会弹出提示:

它说,这个方法(暂时视作一类特殊函数)不需要实例来调用,可以直接用类名来调用。很抱歉,这里暂时要卖个关子。但是它就是说我们可以直接通过String类型的类型名String加上点来调用就行了,而不需要通过某个具体的String来调用。比如我们不需要写"haha".num(123)来将123转换为字符串(尽管可以这样做,但是纯粹多此一举)。

还有一处就是decimals: int后面的=-1,这是在之前将定义函数时没有提到的。这里就是说这个decimals参数是可选的,也就是说你可以不给它传递一个具体参数,没有给定的时候就采用默认值,所以我们前面只传递一个参数就可以调用num。从文档中可以得知,这个参数决定了转换为字符串时数字保留多少位小数。-1就是默认最多保留14位。

不过,在定义函数时,函数的返回值类型并不是像文档中这样标注的(写到前面)。我们可以看看模板中的_process函数:

参数列表的括号后面有一个箭头(实际上是->),然后后面有个void。void和float一样是绿色的,暗示它也是一个类型。但是void是啥意思呢?它也是啥也没有的意思,就是说这个函数没有返回值。

还记得double吗?我们来完善它的定义:

这样一来,就不怕有人乱用了!现在试试看正确使用double函数然后把结果保存到一个变量中吧!如果你给了一个字符串给它,编辑器是会报错的。

提醒一下,在函数中也可以定义变量。但是一定要记得缩进。

同样,我们可以自己给函数定义默认参数,这里的语法和文档中是一样的:

调用时就可以省略了:

但是要注意的是,如果有带默认值的参数,这些参数必须放在最后面:

这样是不行的,因为有默认值的参数可以省略,但要是省略了第一个参数,传入两个参数,怎么确定你是传入的前两个,还是后两个呢?所以要这样:

常量

一个变量可以随意改变其值:

和变量相对的,常量(constant)的值无法改变。对于一些在游戏运行过程中不会发生改变、且不应该改变的值,应当定义为常量。常量用const关键字定义:

尝试修改常量的值会直接报错。最为人熟知的数学常量π,在GDScript定义为常量PI。

变量和函数在何处可用

先思考一个问题,这里的代码输出了什么?

输出了1、2、2。

首先看函数g的定义。前面讲到,定义变量要用var,这里没有var。所以这个x指的是函数外面这一级的这个x。要是你把x换成一个哪里都没出现过的变量(比如y),那么就会出现错误。变量需要先定义再使用。而函数f呢,它自己定义了一个x,在后面它要print(f)时,首先就会找到函数内部定义这个x,因此也就输出1。

这里的问题是变量作用域(scope)的问题。在编程中,作用域指的就是某个名字在哪个范围内可见。简单来说,Godot会从内向外逐级查找一个名字是否已经定义,如果找到了,那就是它,也不用再往外找了。如果一直找到顶级都没找到,那就报错!

此外可以注意到,在一个脚本文件级别上,变量和函数定义的先后顺序无关,它总能找到其定义:

交换定义顺序也没问题。但是你必须确保在使用某个名字的时候,能找到它的定义。

问题

还记得讲Hello World那篇文章最后我们复制了好几个logo出来吗?如果我们更改脚本中speed的值,大家的移动速度都跟着变了。要是我们想让它们有不同的移动速度要怎么办呢?

你可能会想,新建一个脚本,然后设置speed为不同的值。就这个需求来说,可以,但是没有灵活性。如果需要十种不同的速度难道要复制十个差不多的脚本吗?

针对这个问题有一种更简单、地道的做法。

export变量

我们已经介绍过右侧检视面板,提到可以在其中修改节点的各属性。我们能不能把自己的变量也暴露在这里直接修改呢?当然有!这里用到@export标记(annotation):

现在在场景中选中你的某个有logo脚本的节点,或者是某个已经放到了场景中的logo场景,然后看右边:

看,这里出现了一个可以编辑的项目!就是我们自己的speed变量!如果没看到的话,可以按一下保存。此外,如果你的场景中和我一样有好几个logo,还可以分别给它们设置不同的speed:

Godot会根据变量类型,在检视面板中对不同类型的export变量显示不同的编辑控件。

省略类型标注

实际上在一开始,我们在很多地方省略了类型标注。这在GDScript中是允许的。数字可以和数字做运算,这很自然,不需要多说。

然而要是试图将a和b相加,在编辑代码时并不会提示错误。

但是要是运行游戏的话,你会被一个错误打断:

就是说不能把加号用到int和String上。但如果我们主动写上类型标注:

游戏还没运行,编辑器就报错了,你也不能就这样运行游戏。

不标注类型,Godot对代码就行的类型检查就被延后到了游戏运行时。开发者常说的“静态”和“动态”,在很多时候谈的就是“编译时”(处理源代码的软件处理人类编写的代码的时候)和“运行时”。大家说Python语言是动态类型语言,指的是它在运行代码之前不检查代码中和类型相关的约束,但是在运行时如果出现了类似于上面这种字符串和数字相加的情况就会报错;相应的,C#是静态类型语言,说的就是它会尽可能地在运行代码之前就会执行类型检查(除非开发者用到了某些故意延迟类型检查的东西比如dynamic),发现问题。

对于GDScript来说,如果没标注类型,Godot就不会提前检查,而是在运行时检查;反之,我们就会在运行游戏之前检查。

当然如你所见,如果处处写上类型,有时候会很麻烦,但是不写类型,我们就没法获得保障。所以GDScript给你足够的自由,如果你能确定你的代码很简单,或者不需要编辑器根据类型自动补全,那么你就可以省略类型标注。在后面我们会看到,省略类型标注还有一种重要的作用就是让函数接受不止一种类型的参数的同时保持函数正常工作。

全局作用域

前面提到了作用域的概念。不过似乎还是解释不通为什么print这样的函数随处可用?

如果按照前面讲的方法打开print的文档,我们可以在左侧看到,这是一个叫@GlobalScope的文档的一部分,说明print属于@GlobalScope。

Global Scope的字面意思就是全局作用域,简单来说这就相当于最外层的作用域,其中定义的各种东西在任何地方都能找到。举例来说,sin、cos这样的函数,以及PI这样的常量都定义在这里。试着探索一下里面还有哪些东西。

数值型变量的常见操作

这里快速简单展示一些数值类型变量的常见操作:

字符串的常见操作

更多操作我们后续会逐渐讲到。你也可以自行探索!

在这一篇文章中,我们对于编程中最重要的概念之一变量有了一个稳固的基础,我们也讨论了什么是类型,什么是类型系统,以及类型标注的重要性。下一篇文章我们要认识另一个重要的基础类型,以及和函数不同的一种代码块!