网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月27日漏签0天
godot吧 关注:9,035贴子:40,696
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 3 4 下一页 尾页
  • 208回复贴,共4页
  • ,跳到 页  
<<返回godot吧
>0< 加载中...

【新手向教程】GDScript从入门到基础

  • 只看楼主
  • 收藏

  • 回复
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先说一下初衷吧,我跟着官方教程学了GDS,可实战以后发现官方的脑回路太过清奇,好不容易整明白后想分享一下,好让大家避避坑
【本教程所介绍的可能并不严谨,望各位海涵。若有错误欢迎指出,谢谢(*^▽^*)】
(不知道贴吧界面兼容如何,如果分割线乱了我可不管)
-------------------------------------------------------------------------------------------------------------------------------------------------------
(本教程适合对godot有初步了解,但又没有编程经验的人)
00初步:
话不多说,我们先来编写一个最简单的例子
首先,创建一个新2d项目
添加一个文本节点,按照“传统”,我们应编写Hello World,但godot是游戏引擎,按行业前辈留下的惯例,编写GAME START

现在给这个节点添加一个脚本
添加如下代码

再运行
你会发现变成了这样

上面的例子虽然极其简单,但形象地表明了脚本在游戏中的作用
-------------------------------------------------------------------------------------------------------------------------------------------------------
01正文开始:
正如官方介绍的
GDScript 是一种用于创建内容的高级、动态类型的编程语言。
你可能看不懂这是什么意思,通俗的来说,这句话想表达的意思是:GDS真的很快。
这是真的!!!游戏引擎就像一个大仓库,GDS可以极快地找到你要的“货物”,但什么时候能送到你手里.......这是个x。
不提这些了,我们先来认识3个关键字:
#------------------
var定义一个变量
func定义一个函数
if做判断
#------------------------
我来解释一下啥是变量,啥是函数(注:这里用到的例子并不严谨):
变量:指将数据储存在特定的字符中
(print即打印数据)
print(“i am a boooooooooooooooy”)
可以写为
var say=”i am a boooooooooooooooy”
print(say)
(现在say即为i am a boooooooooooooooy)
函数(放心,不是数学课上的):一种可以将代码简化的方式
print(“1”)
print(“2”)
print(“3”)
可以写为
func pri():
print(“1”)
print(“2”)
print(“3”)
(现在你只要写下pri()就可以打印 1 2 3)
pri()
至于 if 嘛,就是做判断:
if 1+1==2:
print("一加一等于二")
else:
print("一加一不等于二")
你应该对这些有初步了解了吧,让我们回到编辑器看一下最初的脚本:

现在回顾一下最开始
你可能会问 text 是什么,而它并不算关键字,至于为什么,等我码完字再讲吧........
(当然这时你写的代码一般不会被编辑器“认同”的,至于为什么,这也是下节要讲的:代码基础格式)
|ू・ω・` )


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
话说贴吧真的坑,我的分割线还有空格都被吞了(#゚Д゚)


2025-08-27 14:41:42
广告
不感兴趣
开通SVIP免广告
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
02 GDS的基础格式
在GDScript内表示代码段结束,换到下一行即可,不需要也不能添加其他特殊字符
(两个不同的关键字不能在同一行上,三元运算除外[这个之后再讲])
而表示代码附属的方法就是缩进,而GDS有自己专用的缩进符,按Tab即可打出,这意味着GDS中不能随意打出空格。
(虽然好像4个空格与缩进符等同,但我试的时候编辑器报错)
而这就形成了级的分别(注:这是我自行定义的概念,可能会不严谨,但应该能方便理解):
级数就是缩进符的个数,而大部分 “级” 大的代码块附属于与其最近的 “级” 小的
0级(也就是无缩进)即为最大

你可能会问什么是“附属”,基本就是指当一个 级 拥有“级”时,它们会被一起运行
如运行一个0级块,那么它拥有的1级块都会被运行,然后1级所拥有的2级运行,以此类推(虽然话是这么说的,但严格意义上代码都是从上到下运行)
这就是GDS代码的基础格式,但并非所有的关键字(以及方法,属性)都可以成为“0级”
注:只有关于定义以及部分特殊的关键字才可以在“0级”(以后再慢慢讲)
至于03的内容,我觉得应该细讲var和func,至于方法和属性到04吧( ̄▽ ̄)/


  • Kizuna
  • godot
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
666


  • 花神庙会
  • 项目流程
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
加油,godot是支持python编程的么


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在下去查阅了Python一番,pass 官方解释道:
Python pass 是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句。
还有一个例子(Python语言下):
def sample(n_samples):
pass
该处的 pass 便是占据一个位置,因为如果定义一个空函数程序会报错,当你没有想好函数的内容是可以用 pass 填充,使程序可以正常运行。


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
04 var和func深入
在之前的例子中,我们已明白var是定义变量的,但变量类型多种多样,我们来了解一些常用到的数据类型:

从上到下:
null值为空,平时的作用就是清空一个变量
int整数;float小数 统称为number,定义方法就是写上阿拉伯数字
string字符串,定义方法就是给文本加上引号
(虽然我写的是1,但我加上了“”,所以它是字符串)
bool布尔值,值只有两种形式:true(真),false(假);bool一般做判断用
至于Vector3和Vector2就是三维向量和二维向量(之后再细讲)
array数组,可以储存其他任何形式的数据(数组也可以套数组)
形式就是用 [] 将数据括起来,并用 , (逗号) 将其隔开
Dictionary对象(关联容器),可以理解为数组的另一种形式
形式就是用 {} 将数据括起来,用一个数据(key)来表示另一个数据,每组数据间用 , 隔开
(array和Dictionary调用方法一会再讲)
讲到这里,相信你已经对数据类型有一定的了解,但你可能会问为什么要分这么多数据类型,举个例子(回到我们00的例子):

如果你这样写是无法运行的,为什么?因为dome赋值的是89,是int,而text只能输入string
所以你如果把dome赋值 "89" 就可以
这不是多此一举,这将形成严谨的逻辑
现在我们来讲一下array和Dictionary调用方法:
array调用很简单,只要将变量名加上[编号]即可,例如:
text改为 one
但要注意的是数组第一个数据的编号为0
附加一点:你可以写上负编号,实现倒着选取,但你初中数学老师应该对你说过:0没有负数,这意味着-0还是0,所以倒数第一个数据是-1:

Dictionary调用方法,你只要输入key就行了:
(key可以是任何但数据组数据,这意味着string,number甚至是bool都可以为key)
(但为了逻辑以及性能,只建议将string,number作为key)

行了,先吸收一下吧,过会再讲var的其他书写格式和一些嵌套实例(`・ω・´)


  • 孤独凄凉的美
  • 动画特效
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以,支持,希望每天坚持更新


2025-08-27 14:35:42
广告
不感兴趣
开通SVIP免广告
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
对了,补充一点:
数组可以用来收集储存交互数据,但数据过多可能会造成“内存碎片”,官方也给出了解决方法:
GDScript数组在内存中线性分配以提高速度。但是,大型数组(包含数万个元素)可能会导致内存碎片。如果这是一个问题,则可以使用特定类型的数组。它们只接受单个数据类型。它们避免了内存碎片,并使用了更少的内存,但是它们是原子的,并且运行起来比通用数组要慢。因此,建议仅将它们用于大型数据集:
PoolByteArray:一个字节(从0到255的整数)数组。
PoolIntArray:一个整数数组。
PoolRealArray:一个浮点数数组。
PoolStringArray:一个字符串数组。
PoolVector2Array:一个 Vector2 对象的数组。
PoolVector3Array:一个 Vector3 对象数组。
PoolColorArray:一个 Color 对象的数组。
可以看得出来,godot也是有做3A游戏的野心的(●—●)
(我是真的想不出来啥2D游戏可以“包含数万个元素”)


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
04-1-2 var格式
不能重复声明:

正确:

你可以先声明再赋值:

如果未赋值,则为null:

变量名不允许出现特殊字符或以阿拉伯数字开头(但 _ 除外):错误示例

正确示例:

但:
(单个 _不可以)
(多个_可以)
(贴吧有图片插入限制,接下楼)


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
var还有一种严格的书写形式:
var 变量名:类型 = 数据(这意味着你之后不能更改其数据类型)

你也不能“睁眼说瞎话”:


当然冒号后可以写的类型多种多样:
内置类型(Array、Vector2、int、String、等)。
(我们暂时只探讨内置类型)
引擎类(Node、Resource、Reference、等)。
常量名,如果它们包含脚本资源(MyScript 如果声明 const MyScript = preload("res://my_script.gd"))。
在同一个脚本中的其他类,尊重作用域(如果在相同作用域内,在 class InnerClass 中声明 class NestedClass 得到 InnerClass.NestedClass )。
脚本类使用 class_name 关键字声明。
我们再看一下Dictionary的格式:

我们再来讲一下Array,
修改方法:

添加方法:

Dictionary方式:

好了,如果你认真地读到了这里,并且你我的脑回路相同的话,那么恭喜你,在var方面你已经可以出师了


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
当然var还有个兄弟,叫做 const ,他所定义的是常量,这意味着他比
var a:int = 1 还狠
const A = 1 意味着A永远都是1,你已无法改变A (`Д´|)
(const定义的变量名开头只能是 _ 和大写字母,并且const不能在函数内)
还有个叫enum的家伙,但暂时意义不大,不多赘述了


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
提前小课堂:

#-------------------------------------------------------------------------------------------------------------
04-2 func详解
从01我们知道,函数的实质就是“代码调用简化”
按照惯例,我们先了解func的书写格式:
func + 函数名 + () + :

注意一下,函数名格式与变量名大体相同,但不建议函数名以 _ 开头,原因稍后解释
调用函数也很简单:
(这里注意一下,在脚本加载时,函数是优先加载的。这意味着,你可以将函数丢到脚本任意一处,即使丢到犄角旮旯里,也是可以调用的)

或许你已经注意了,为什么脚本中原本就有个_ready呢?
这就联系到了 函数的种类:
简单粗暴地来说,GDS中的函数只有两种:
(1)官方定义函数(内置函数)
(2)自定义函数
自定义函数很简单,就是我们定义的(就像刚才的 name() )
(注:自定义函数中不能再套函数)
而内置函数就是官方贴心地给我们定义好的(就像 _ready() )
(大部分内置函数以 _ 开头,所以为了区分,自定义函数最好别以 _ 开头)
既然知道了内置函数,那就先来认识几个:
(甭管明不明白,总之先混个脸熟)
_ready() 当节点包括其子节点加载完成时调用
_process() 每帧都会被调用
_input() 鼠标移动时调用
到这,基础知识就没了,但本段教程还没完,我们接下来学习一下 参数 的使用:
参数:在声明函数时,写在函数名后面的括号中,(其格式与变量名,函数名相同)多个参数间用 , 隔开
示例:

如果出现变量与参数重复情况,函数优先调用参数:
(如果变量在内部,则会报错)
这就是参数的使用方法
然后我们再讲一下return,它的作用就是跳出并返回值。也就是说,函数本身有了值:
如果return后什么都不写,经返回null
(return可以在函数任意位置,当函数运行到它时,将会返回值,并!!!停止运行!!!)
当然,函数返回值也有一种严格写法(类似var):

就是这些了(静态函数和引用函数,暂时用处不大,先不讲)
但本节课还没完,我们上节讲了var,现在讲了func,为什么要把他们连在一块呢?
因为他们合在一起就出现了一个官方文档里找不到,就算找到了新手也一脸懵逼的——
作用域问题,现在我就详解一下.........算了,码了这么久的字了,我先去喝点水再说
(・ω・`ll)


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(敲黑板~~)嗯嗯(清嗓子),同学们,我们先来看一段代码:

谁知道这段代码为什么报错?
同学A:“因为var a=1在函数add()中,而add()并没被调用,所以var a=1没有执行过,也就造成了错误。”
嗯,逻辑思路很好,但可惜是错的:

我调用了add(),可还是报错,为什么?大家再看一张图:

为什么我把var a=1丢出来后就正常了?
同学A:“我明白了,老师,var声明的变量在特定区域内才能用。”
是的,这就是var的作用域:
#--------------------------------------------------------------------------------------------------(回归正常)
var声明的变量有其特定的作用域
而作用域只分为两种:
(1)局部作用域(私有)
(2)全局作用域(公有)
局部作用域(即函数内)所声明的变量只能在该函数中使用
全局作用域(即函数外)所声明的变量可以在该脚本任意处中使用
例如:

虽然在04-1-2 var格式 中讲到:同一个变量不能重复声明,但因为作用域的关系,我们可以创造出 1个公有a 和 无限个私有a:

我们还可以玩出“无间道”的感觉:

说了这么多,你可能会问:我怎样才能在函数内声明一个全局变量
很可惜,在函数内声明的变量只能是局部变量,但可以用以下方法替代:

这就是作用域,本节课完毕。。。ヾ(o・ω・)ノ


2025-08-27 14:29:42
广告
不感兴趣
开通SVIP免广告
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第一大章终于讲完了,我们终于可以看 方法与属性 了(*^▽^*)
但说实话,本教程已经讲完了一半了(因为计划分为两章讲)(-ω-;)


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 4 下一页 尾页
  • 208回复贴,共4页
  • ,跳到 页  
<<返回godot吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示