Godot中文教程.docx

上传人:b****6 文档编号:7198344 上传时间:2023-01-21 格式:DOCX 页数:30 大小:1.24MB
下载 相关 举报
Godot中文教程.docx_第1页
第1页 / 共30页
Godot中文教程.docx_第2页
第2页 / 共30页
Godot中文教程.docx_第3页
第3页 / 共30页
Godot中文教程.docx_第4页
第4页 / 共30页
Godot中文教程.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

Godot中文教程.docx

《Godot中文教程.docx》由会员分享,可在线阅读,更多相关《Godot中文教程.docx(30页珍藏版)》请在冰豆网上搜索。

Godot中文教程.docx

Godot中文教程

 

Godot中文教程

场景和节点

seraph526?

在星期三,10/14/2015-15:

10提交

介绍

想像一个,你不再是一个游戏开发者,而是一名大厨!

将时髦的衣服换成绒边帽和双排扣夹克.现在,你不做游戏,而是为你的客人烹饪新鲜美味的食物.现在,一位大厨如何烹饪食物分为两道工序,首先是材料,其次是准备工序的介绍.这样,每个人都可以按照食谱制作,并品尝你伟大的料理.

用Godot做游戏和做菜的感觉非常像.使用引擎就像置身于厨房中.在这间厨房里,"节点"就像是装满了要烹饪的原材料的冰箱.

有许多类型的节点,一些显示图片,另外一些播放声音,还有一些显示3D模型等等.有许多这样的节点

节点

让我们开始学习基础知识.节点是创建游戏的基本元素,它有以下几个特点:

*要定义一个名字*有可编辑的属性*逐帧运行以接收callback调用*可以被继承(拥有更多的函数)*可以作为其他节点的子节点

最后一点很重要.节点可以拥有其他节点作为子节点.当我们按这种方式组织节点,节点便成了"tree".

在Godot中,按这种方式管理节点的方式成就了一个伟大的管理项目的工具.因为不同的节点有不同的函数,组合他们会创建更复杂的节函数.这些可能你还不太清楚,没什么太深的理解.但是所有这些将来都会有所说明.现在最重要的是要记住,节点的存在,而且可以按上述的方式组织节点.

场景

既然已经定义了节点的存在,下一步便是说明什么是场景.场景由一组节点构成,这些节点被分级管理(以树的形式).它有以下的特征:

一个场景通常只有一个root节点*场景可以被保存到磁盘并加载加来*场景可以被instanced*(后面会详细说明)*运行一个游戏也就是运行了一个场景*一个项目中可以有几个场景,但是要开始游戏,一定要先加载其中一个.基本上,Godot编辑器就是一个"场景编辑器".它有许多工具用来编辑2D和3D场景以及用户界面,但所有的编辑器都是都是围绕编辑场景和节点展开的.

创建新项目

理论是枯燥的.让我们改变主题,实践一下.跟随一个传统的教程,第一个工程将是"helloworld".为此,将使用编辑器.当Godot在项目外运行时,工程管理器将会出现.它帮助开发者管理他们的项目.

要创建一个新项目.要使用"newProject"选项.选择并创建项目路径和定义项目名称.

编辑器

新项目创建后,下一步就是打开它.这将打开Godot编辑器.下图是我们新打开时编辑器的样子.

如前文所述,在Godot中制作游戏,就像置身于厨房.所以,让我们打开冰箱并填加一些新节点到场景中去.我们将以"HelloWorld"项目开始.按下"新节点"按扭:

这将打开节点创建对话框,它显示了所能创建的节点的长度列表:

这里,我们选择"Label",搜索节点通常更快捷一些.

最后,创建Label!

.当创建按扭被按下时,发生了很多事:

首先,场景变为2D编辑器(因为Label是2D节点类型),Label显示,被选中,在viewport的左上角.节点出现在场景树编辑器中(在右上角),label属性出现在Inspector面板中(在右下角).下一步,我们将改变label的"Text"属性,将其值改为"HelloWorld":

OK,所有的事都准备好了,可以运行场景了!

点击顶部的"PLAYSCENE"按扭(或者按F6):

哎呀

运行前场景要先保存,选择Scene->Save,保存场景为""一类的名字

这里有一些有趣的事情.文件对话框比较特别,它允许保存场景到工程内部.工程的根目录是"",它就是资源路径.也就是说,文件只能保存到项目内部.将来,当在Godot中做文件操作时,记住""是资源路径,不管是什么平台或安装路径,这是从游戏内部定位资源的方法.在保存了场景并按下run之后,"HelloWorld!

"最终正常运行了:

成功了!

!

配置项目

好了,是时候对项目做一些配置了.现在,运行场景是唯一执行程序的方法.项目通常都有向个场景,所以要将它们中的一个设置为主场景.主场景将在项目运行时被第一个加载.这些设置都被存储在文件中,这是一个纯文本的格式的文件,以便可以方便的编辑.还有很多选项可以设置以声明项目如何运行,为了让设置变得简单,可以通过项目设置对话框设置.

要访问此对话框,可通过Scene->ProjectSettings打开.窗口打开后,任务是设置一个主场景.我们可以很容易的改变application/main_scene的属性,选择""为主场景

修改后,点击"regularPlay"按扭(或F5)会运行项目,无论当前是哪个场景被编辑.

返回项目设置对话框.这个对话框提供了很多可以填加到的选项,这里显示了它们的默认值.如果默认值是正确的,我们不需要云改变它们.当值改变时,名字左侧的选择框会变为选中状态.这意味着这个值会被保存到文件中,会被项目记住所做的更改.这里是边注,为将来提供参考,有一些断章取义(毕竟,这只是第一篇教程).通过使用Globalssingleton可以填加自定义的设置选项,并且可以实时读取.

实例化

seraph526?

在星期三,10/14/2015-15:

27提交

基本原理

有一个小型的场景,有些节点在场景中,可能有很多小的项目都可以正常工作,但当项目成长时,越来越多的节点被使用,它很快就会变得难以管理.为了解决这个问题,Godot允许项目被划分为不同的场景.这和其他的一些游戏引擎的工作方式不一样.事实上,差别很大.所以请不要跳过这篇教程.

重申一下:

场景是节点的集合,按照trew的结构组织,只能有一个单独的节点做为这个树的根结点.

在Godot中,场景可以创建并保存到磁盘上.任意场景都可以创建和并按你希望的形式保存.

之后,当编辑一个存在的场景或新场景时,其他场景可以被初始化为此场景的一部分.

上图中,场景B被加载并初始化为场景A中的一个实例,开始可能会觉得奇怪,但当看完这篇教程时会完全了解是什么回事.

初始化,StepbyStep

要学习如何初始化,让我们从下载一个pre-madesouene.解压下载的场景到任意我们喜欢的路径下.然后,使用import选项加载到项目管理器

定位到你的项目,打开""文件.新的项目会出现在项目列表中.要管理这个项目,可以点击"Edit"选项.

这个项目包含两个场景""和"".ball场景只是一个带有物体属性的球,container场景有一个很好的碰撞形状.球会被限制指定的区域中.

打开container场景,选择根节点:

之后,点击"+"按扭,这就是初始化按扭!

选择ball场景,球会出现在origin(0,0)位置,围绕场景中心移动ball,如下:

点击"Play"按扭,瞧!

初始化的小球都落到底部的陷阱中

多一些

场景中可以有任意多个初始化实例,试下创建更多的球,或者复制(ctrl-D或复制按扭):

再一次运行场景:

是不是很酷这就是实例如何工作的.

编辑实例

选中实例化的小球中的一个,打开属性编辑器.我们让它的弹力再大些,查看bounce参数,将其值设置为:

接下来,会出现一个绿色的"revert"按扭,当这个按扭出现时,意味着我们编辑一个实例场景的属性,将重写这个实例为特别的值.甚至属性在原场景中编辑过.自定义的值将会重写它们.按下"revert"按扭将恢复场景中原来的值.

结论

实例化看起来很简单,实际上它还有很多功能,下一节实例化教程将会说明剩下的部分...

实例化(继续)

seraph526?

在星期三,10/14/2015-16:

06提交

概括

实例化有很多方便的用法.一目了然,使用实例,你可以:

*细分场景,使之易于管理.*更加灵活的方法替代prefabs(可以工作在更多层级的功能更加强大的实例化).*设计更加复杂的游戏流程甚至是UIs的方法(UI元素在Godot中也是节点).

设计语言

但是,实例化场景真正强大的点在于它像一门优秀的设计语言一样工作.这使得Godot完全不同于其他的游戏引擎.整个引擎从底层都是围绕这一概念设计的.用Godot制作游戏时,建议的方式是将其他的设计模式如MVC或Entity-Relationshipdiagrams放到一边.以更加自然的方式开始制作游戏.开始设想游戏中的可视化元素,那些不光可以被程序员命名,也可以被任何人命名的游戏元素.

如,这里是一个简单的射击类游戏的创意思路:

任何类型的游戏都可以十分简单的想像出这样的图表.只要写下想法中的元素,然后用箭头标注所有权关系.这个图表存在后,制作游戏基本就成了为这些节点创建场景,使用实例化(通过代码,之后会介绍,或者通过编辑器)表示所有权关系

编写游戏的大部分时间(或者一般的软件)都花在设计游戏模式并让游戏组件适应这一模式上.基于场景的设计取代了这些,使得开发更快更直接,允许直接关注游戏本身.基于场景/实例化的设计节省了大部分上述的工作,使工作变得十分有效率,因为大部分组件被直接映射成一个场景.这样,不再需要或只需很少的模式代码.

下面是一个复杂点的例子,一个开放沙盒类型的游戏,其中有很多资源或部分是交互的:

用家具搭建一些屋子,之后连接它们.制作一间房子,用这些房间作为这间房子的内部.这间房子可能是堡垒的一部分,堡垒有许多房子组成.最后,堡垒可以被放置到世界地图上.也要填加一些守卫和一些NPCsg到先前创建的场景中.使用Godot,可以快速的按你所想实现游戏,因为只是多个场景的制作和初始化.编辑器UI也设计成无需程序员操作的模式,所以,通常一个游戏开发小组包括3D或2D艺术家,关卡设计师,游戏设计师,动画师等等,都是通过编辑器界面工作.

脚本

seraph526?

在星期三,10/14/2015-16:

08提交

介绍

讲了许多关于不编辑就可以让用户制作游戏的工具.这是许多独立开发者的梦想,不学编程就可以制作游戏.这一需求已经存在了很长时间了,甚至是在公司内部,游戏设计者也希望更多的控制游戏的流程.

许多产品被制作出来承诺无编辑环境,但是往往结果都是不完美的,太复杂或跟传统的代码比没有效率.结果,编辑在这里停滞了很长一段时间.事实上,游戏引擎中通常的做法是增加一些工具以减少为特殊任务重新编码的数量,加快开发的速度.

在这个意义下,Godot为了这个目标做了一些有用的决定策略.首先也是最重要的场景系统.开始,它的目的还不是很明确,但是后来工作的很好.那就是让程序员从架构设计的代码中解放出来.

当使用场景系统设计游戏时,整个项目是碎片化的补充场景(不是各自独立的).各场景间相互补充,而不是各自独立.之后将会有大量的例子,但是要记住这非常重要.

为此有大量的专业编辑知识,这意味着一个不同于MVC的设计模式.Gosot允许放弃MVC模式的一些效率损失,取而代之的是场景填充(scenesasacomplement)设计模式

Godot脚本也使用extend模式,也就是说脚本可以继承自有可能的引擎类.

GDScript

GDScript(clicklinkforreference)是动态类型脚本语言,以适应Godot引擎,设计它主要有以下几个目标:

*第一个,也是最重要的,让它变得简单,熟悉,尽可能的易学.*使代码易读,让错误更安全.语法大部分是借鉴Python.

程序员通常要花几天去学习它,不超过两周就会适应它.像其他动态类型语言一样,高产出(代码易学,可快速编写,没有编译等等)是以平衡效率为代价的,但是引擎中大部分核心代码是用C++编写的(Vectorops,phsics,math,indexing等等),对大部分类型的游戏来说保证足够的效率.

任何情况下,如果要求更高的运行效率,重要部分的代码可以用C++重写并且暴露给脚本.允许用C++的类替换GDScript类,而不用改变游戏的其他部分.

脚本化场景

在继续之前,确保已经阅读了GDScript相关说明.它是一个简单的语言,说明非常短,看一下不用花太长时间.

场景设置

教程以脚本化一个简单的GUI场景开始.使用增加节点对话框用下面提到的节点创建下面的结构:

Panel

oLabel

oButton它在场景树中的样子如图所示:

同时确保它看起来像是在2D编辑器中,所以它是有意义的:

最后,保存场景,一个合适的名字可以是""

填加脚本

选择Panel节点,然后点击"AddScript"图标:

会弹出脚本创建对话.这个对话框允许选择语言,类名等等.GDScript在脚本文件中不使用类名.所以该区域不可编辑.

脚本要继承自"Panel"(因为这意味着继承的节点类型为Pannel,这里是自动由编辑器填充的).选择脚本名称(如果你之前保存过场景,那么脚本会被自动命名为,之后点击"Create"按扭.

这些完成后,脚本就创建了,并且被填加到节点上.你可以在extra图标看到它,也可以在脚本属性找到:

要编辑脚本,点击上面的按扭(虽然,UI可以让你直接到脚本编辑器界面),以下是script的模板:

它里面没有很多东西.当节点(和它的子节点)进入激活的场景时会调用"_ready()"函数.(记住,这不是构造函数,构造函数是"_init()")

信号处理

Signals大多是使用在GUI节点中,(虽然其他节点也有这些).当一些特别的动作发生时会发送Signals,可以连接到任意脚本实例的任何程序.在这个步骤中,按扭上的点击(pressed)信号将被链接到一个自定义的函数.有个GUI用来连接signals,只要选中节点并点击"Signals"按扭:

这将显示按扭能发射的信号的列表.

但是这个示例不会使用它.我们不想制作一个太简单的东西.所以,请关闭那个屏幕!

任何情况下,在这一点上,非常清楚,我们对点击信号有兴趣.我们不通过可视化界面创建它,而是通过代码的方式.对此,有一个Godot程序员经常会用到的函数,这就是get_node().此函数通过路径得到当前树结构下的节点,或场景上的其它元素.路径是指向挂载脚本的节点.

为了得到button,要使用如下语句:

```python

get_node("Button")

```然后,下一步,挡button点击时,返回调用callback会被填加到脚本.这将会改变label上文本的内容:

```python

func_on_button_pressed():

get_node("Label").set_text("HELLO!

")

```最终,按扭"pressed"信号会被连接到_ready()中的callback,使用connect().

```python

func_ready():

get_node("Button").connect("pressed",self,"_on_button_pressed")```最终的脚本看起来像这个样子:

```python

扩展Panel

membervariableshere,example:

vara=2

varb="textvar"

func_on_button_pressed():

get_node("Label").set_text("HELLO!

")

func_ready():

get_node("Button").connect("pressed",self,"_on_button_pressed")

```运行场景当你按下按扭时,会得到我们预期的效果.

脚本(继续)

seraph526?

在星期三,10/14/2015-16:

09提交

处理

Godot中的一些行为是通过callbacks或虚函数触发的,所以不需要写一直监测运行的代码.另外,许多事情可以由动画师来完成.

但是,通常还是要在每一帧运行一个脚本的情况.有两种运行模式,空闲处理和固定处理.

空闲处理通过()函数激活.激活后,()每帧都会执行.

```python

func_ready():

set_process(true)

func_process(delta):

[dosomething..]

```delta参数描述从上次调用_process()到现在过去的时间(以秒为单位的浮点类型)固定处理类似,唯一的要求是要和物理引擎同步.简单的测试这点的方法是创建一个只有一个Lable节点的场景,代码如下:

```pythonextendsLabel

varaccum=0

func_ready():

set_process(true)

func_process(delta):

accum+=deltaset_text(str(accum))

```这会显示一个按秒增加的计算器.

节点可以被添加到组中(每个节点下,你想要多少都可以).这对于管理大场景来说是简单而且有效的功能.有两种方法做这个,第一种方法是通过UI,从组按扭实现:

第二种方法是通过代码.这是一个有用的例子,如,标记场景,谁是敌人.

```python

func_ready():

add_to_group("enemies")

```这种方式,如果玩家潜行到秘密基地,如果被发现,所有的组中的敌人都会发出警报.通过调用():

```python

func_on_discovered():

get_scene().call_group(0,"guards","player_was_discovered")

```上述方法调用组中"guards"的每一位成员的函数"player_was_discovered".或者,通过调用()得到"guards"节点全部列表:

```python

varguards=get_scene().get_nodes_in_group("guards")

```关于SceneMainLoop的更多知识点将在后面讲述。

消息系统

Godot有一个消息系统。

通常这个系统不会在脚本层使用,因为它太底层了,虚函数提供了大部门接口,但知道它们的存在还是必要的。

在你的脚本中填加一个()函数:

```python

func_notification(what):

if(what==NOTIFICATION_READY):

print("Thisisthesameasoverriding_ready()...")elif(what==NOTIFICATION_PROCESS):

vardelta=get_process_time()print("Thisisthesameasoverriding_process()...")

```文档classlist中列出了所有有接收到的消息。

但是,再强调一下,大部分的函数都提供了简单的重写方式。

可重写函数

如前面提到的,最好使用这些函数。

节点提供了许多有用的重写函数,如:

```python

func_enter_scene():

pass#当节点进入激活的场景时,此函数被调用。

此时子节点还没有被加载到当前场景。

通常,大部分情况下,最好使用_ready()函数。

func_ready():

pass#此在_enter_scene函数后调用,但是它能保证所有的子节点都被正常加载,都能被函数调用

func_exit_scene():

pass#当节点退出当前激活场景时,调用此函数。

此时,所有子节点已经全部退出当前场景。

func_process(delta):

pass#当set_process()被激活时,此函数每帧都调用。

func_fixed_process(delta):

pass#当set_fixed_process()被激活时,此函数每物理帧调用。

func_paused():

pass#当游戏暂停时调用,调用后,节点不再接收任何callback进程

func_unpaused():

pass#当游戏继续时调用

```

创建节点

由代码创建节点,只要调用.new()方法,(像其他的基于类的数据类型一样),如:

pythonvarsfunc_ready():

s=()#createanewsprite!

add_child(s)#additasachildofthisnode要删除节点,在场景内或场景外,一定要使用free()

pythonfunc_someaction():

()#immediatelyremovesthenodefromthesceneandfreesit当节点释放后,所有的子节点也会被释放。

因此,手动删除节点要容易的多。

只是释放根节点,所有子节点也会被同时释放。

但是,经常会出现我们删除的节点处于锁定状态,就是说,这个节点正在发出信息或要访问一个函数。

这会导致游戏崩溃。

运行Godot的debugger模式,经常会抓取到这种情况,并提出警告。

最安全的删除节点的方法是使用queue_free代替free().它将安全的删除处于闲置状态的节点。

pythonfunc_someaction():

()#removethenodeanddeleteitwhilenothingishappening

初始化场景

从代码初始化场景非常简单,有两种方式。

第一种是从磁盘加载场景。

pythonvarscene=load("")#willloadwhenthescriptisinstanced有些时候,使用preload会更方便,因为,它在解析时执行。

pythonvarscene=preload("")#willloadwhenparsingthescript

但是,场景仍不是一个包含子节点的节点。

它是一种打包的特殊资源?

PackedScene.要创建实际的节点,要执行()函数。

它将返回可以加载到场景中的节点树。

pythonvarnode=()add_child(node)两步执行的优势是打包的节点可以保持加载和准备使用,所以可以按照需求用来创建更多的实例。

这一点特别有用,如,要在场景中快速地实例化几个敌人,子弹等。

创建2D游戏

seraph526?

在星期三,10/14/2015-16:

11提交

简单的2d游戏(乒乓球!

乒乓球

在这个简单的教程中,我们会创建一个简单的乒乓球游戏。

引擎中有许多复杂的示例,但这个示例会简单介绍基本的2D游戏编程。

资源

这个教程要包含一些资源文件pongpads,theballandthedivisor.

场景设置

因为是老年代的游戏,游戏设置为640*480分辨率。

这可以在项目设置中设置(请参考前面的教程),默认场景颜色为黑色。

为项目创建一个?

Node2D节点做为根节点。

Node2d是2D游戏引擎的基本类型。

之后,填加精灵(Spritenode),并设置相应的纹理图。

最终的场景效果如下图所示(注意:

球是在场景中央的):

场景结构,如图:

保存场景为"",并在项目属性中设置其为主场景

输入行为设置

电子游戏有许多输入方法...键盘,手柄,鼠标,触摸屏(多点触摸)。

我们要做的是个乒乓球游戏,唯一的输入是控制拍子的上下。

处理所的可能的输入方式是件令人崩溃的事,而且会花费大量的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1