Godot教程中文版-脚本(Scripting)

脚本 (Scripting) https://github.com/okamstudio/godot/wiki/tutorial_scripting

介绍

很多人都会谈及到一些可以允许开发者不用coding就能制作出视频游戏的工具。对于很多独立开发者来讲,不用怎么学习编程就可以制作游戏是一个梦想。这个需求已经存在很长一段时间了,甚至在一些公司内,很多开发者都希望可以更多的把控游戏流程。

很多产品被制造出来并且保证一个不用编程的环境,但是和传统的代码对比结果通常都是不完整的,过于复杂的或者不够有效的。在这种情况下,编程还是会存在一段时间。实际上,游戏引擎一般的方向都是通过添加工具来减少需要对特别任务进行编程的工作量,从而加速开发的效率。

从这个角度看,Godot已经采取了一些有用的设计决策来实现这一目标。首先最重要的是场景系统。它的目的刚开始不明显的,但后来效果很好,那就是,可以减轻程序员设计代码的责任。

当使用场景系统设计游戏时,整个工程会被分割为互补的场景(而不是个别的场景)。场景之间互相补充而不是单独的。后面会有大量的关于场景的例子,但是记住这个很重要。

对于那些有着大量专业编程知识的人来说,这意味着一个和MVC不同的设计模式。Godot保证减少MVC习惯所花费的效率,而是使用场景补充模式代替MVC设计模式。

Godot也在脚本中使用了继承模式,extend pattern。这意味着脚本可以继承自引擎中的所有可使用的类库。

GDScript

GDScript是一种在Godot中使用的动态类型脚本语言。它的设计有以下几个目的:

首先最重要的是,简单,友好,尽可能容易的学习。

脚本代码可读,容错并安全。它的语法借鉴自python。

程序员在几天内就可以学会它,两周内就可以熟悉使用。

和大多数的动态类型脚本语言一样,高效率编程(代码易学,已写,不用编译运行)是要和运行性能平衡的。但是所有的代码都是通过c++在引擎内写好的(例如vector ops, physics, math, indexing等等)所以对大多数的游戏来讲都可以得到足够好的性能。

在任何情况下,如果追求更高的性能,关键部分可以使用c++重写并且可以透明的暴露给脚本。这允许我们使用一个c++类来替换GDScript脚本类而不用改变游戏的其他部分。

Scripting a Scene

在继续之前,请确定已经阅读了GDScript参考指引。GDScript是一门简单的脚本语言,并且参考指引也很简短,看一看也不需要多少分钟。

Scene Setup

场景组织

这个教程开始通过脚本编写一个简单的GUI场景,使用并且添加节点来创建下面的层次结构和节点:


在编辑器场景中如下图:


在2D编辑页面上显示如下:


最后保存场景,名字保存为“sayhello.scn”

Add a Script  添加一个脚本

选择Panel节点,点击“Add Script”添加脚本图片如下:


接着会弹出脚本创建对话框,这个对话框允许选择语言,类名等等。GDScript在脚本文件中没有使用类名,所以类名那一项是不可编辑的。脚本应该继承自“Panel”,(意味着是继承自节点,属于Panel类型)。选择脚本文件名,并点击“Create”按钮创建脚本。


完成后,脚本就会被创建并且添加到节点,你可以看到节点中多了一个脚本图标,同时也可以看到脚本的属性。


编辑脚本,点击上面的icon就可以打开。这会直接打开脚本编辑器。下面是一个脚本模板:


注意:“_ready()”函数会在节点进入活动的场景时候被调用,但是它不是构造器,构造器是“_init()”

Handling a Signal 处理一个信号

信号大多用在GUI节点,尽管有些节点已经拥有信号。当一些指定的信号动作发生时,相应的动作会发射响应,也可以被连接到任意脚本的任意函数。这一步,按钮发送的“pressed”信号会链接到一个自定义的函数。

有一个GUI界面是用来连接信号的,选择节点,点击“Signal”按钮。


之后会显示一个按钮可以发射响应的信号列表


但这个例子不会使用它。我们不想让事情变得这么简单,所以请关闭这个信号事件选择窗口。无论如何,有一点是很清楚的,我们对“pressed”信号感兴趣,所以与其用可视化界面不用直接使用代码来做这件事情。

为了实现这一点,有一个函数可能是我们在Godot编程都需要知道的,那就是get_node()函数。这个函数会通过路径在当前树或者场景的其它地方获取绑定当前脚本的节点。

为了获取按钮,下面的函数是需要使用的:

get_node("Button")

下一步,一个回调函数会被添加来响应按钮的点击事件,从而改变标签的文本:

func _on_button_pressed():

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

最后,点击按钮的响应信号在_ready()函数中通过connect()函数链接到回调:

func _ready():

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


最后的脚本如下面所示:

extends Panel


# member variables here, example:


# var a=2
# var b="textvar"


func _on_button_pressed():
    get_node("Label").set_text("HELLO!")


func _ready():
    get_node("Button").connect("pressed",self,"_on_button_pressed")


运行当前的场景,点击按钮就会得到预期的结果:

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值