Godot引擎 4.0 文档 - 循序渐进教程 - 创建你的第一个脚本

news2024/11/26 15:45:58

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:

Creating your first script — Godot Engine (stable) documentation in English

创建你的第一个脚本¶

在本课中,您将编写您的第一个脚本,使用 GDScript 使 Godot 图标转圈。正如我们在简介中提到的,我们假设您具有编程基础。为方便起见,等效的 C# 代码已包含在另一个选项卡中。

参考:要了解有关 GDScript、其关键字和语法的更多信息,请前往GDScript 参考。

参考:要了解有关 C# 的更多信息,请访问C# 基础知识页面。

项目设置¶

请创建一个新项目以从头开始。你的项目应该包含一张图片:Godot 图标,我们经常在社区中使用它来制作原型。

我们需要创建一个 Sprite2D 节点来在游戏中显示它。在场景停靠栏中,单击其他节点按钮。

在搜索栏中输入“Sprite2D”以过滤节点,然后双击 Sprite2D 创建节点。

您的场景选项卡现在应该只有一个 Sprite2D 节点。

Sprite2D 节点需要一个纹理【Texture】来显示。在右侧的 Inspector 中,您可以看到 Texture 属性显示为“[empty]”。要显示 Godot 图标,请单击文件并将文件icon.svg从文件系统停靠栏拖动到纹理槽中。

注:您可以通过在视口上拖放图像来自动创建 Sprite2D 节点。

然后,单击并拖动视口中的图标,使其在游戏视图中居中。

创建新脚本¶

要创建新脚本并将其附加到我们的节点,请右键单击场景停靠栏中的 Sprite2D,然后选择“附加脚本”。

出现附加节点脚本窗口。它允许您选择脚本的语言和文件路径,以及其他选项。

将模板字段从“节点:默认”更改为“对象:空”以从一个干净的文件开始。默认保留其他选项,然后单击“创建”按钮创建脚本。

脚本工作区应该出现在您sprite_2d.gd打开的新文件和以下代码行的情况下:

GD脚本
extends Sprite2D
C#

using Godot;

public partial class MySprite2D : Sprite2D
{
}

每个 GDScript 文件隐式地是一个类。关键字extends定义此脚本继承或扩展的类。在这种情况下,它是Sprite2D,这意味着我们的脚本将可以访问 Sprite2D 节点的所有属性和函数,包括它扩展的类,如Node2DCanvasItem和 Node

注:在 GDScript 中,如果您省略带有关键字的行extends,您的类将隐式扩展RefCounted,Godot 使用它来管理应用程序的内存。

继承的属性包括您可以在 Inspector 停靠栏中看到的属性,例如我们节点的texture.

注:默认情况下,Inspector 在“Title Case”中显示节点的属性,大写单词之间用空格分隔。在 GDScript 代码中,这些属性位于“snake_case”中,它是小写字母,单词之间用下划线分隔。

您可以将鼠标悬停在检查器中的任何属性名称上,以在代码中查看描述及其标识符。

Hello World!¶

我们的脚本目前没有做任何事情。让我们让它打印文本“Hello, world!” 到输出底部面板开始。

将以下代码添加到您的脚本中:

GD脚本

func _init():
    print("Hello, world!")

C#
public MySprite2D()
{
    GD.Print("Hello, world!");
}

让我们分解一下。关键字func定义了一个名为 的新函数 _init。这是我们类的构造函数的特殊名称。如果您定义此函数,引擎会 _init()在内存中创建每个对象或节点时调用它。

注:GDScript 是一种基于缩进的语言。该行开头的选项卡表示print()代码工作所必需的。如果您省略它或没有正确缩进一行,编辑器将以红色突出显示它并显示以下错误消息:“预期缩进块”。

如果您还没有保存场景,可以将场景保存为sprite_2d.tscn,然后按F6(在 macOS 上Cmd + R) 运行它。查看展开的输出底部面板。它应该显示“Hello, world!”。

删除_init()函数后,你只剩下一行代码了。extends Sprite2D

转动¶

是时候让我们的节点移动和旋转了。为此,我们将在脚本中添加两个成员变量:以像素/秒为单位的移动速度【speed】和以弧度/秒为单位的角速度【angular_speed】。在extends Sprite2D之后添加以下内容【GDScript】。

GDScript
var speed = 400
var angular_speed = PI
C#
private int _speed = 400;
private float _angularSpeed = Mathf.Pi;

成员变量位于脚本顶部附近,在任何“扩展”行之后,但在函数之前。每个附有此脚本的节点实例都将拥有自己的speed 和angular_speed属性副本。

注:Godot 中的角度默认以弧度为单位,但如果您更喜欢以度数计算角度,则可以使用内置函数和属性。

要移动我们的图标,我们需要在游戏循环中的每一帧更新它的位置和旋转【状态】。我们可以使用类Node的虚函数_process()。如果您在任何 Node派生类中定义它,例如 Sprite2D,Godot 将每帧调用该函数并向其传递一个名为delta的参数,即自上一帧以来经过的时间。

注:游戏通过每秒渲染许多图像来工作,每个图像称为一个帧,并且它们在循环中进行。我们以每秒帧数 (FPS) 衡量游戏生成图像的速率。大多数游戏的目标是 60 FPS,尽管您可能会发现在速度较慢的移动设备上为 30 FPS,或者在虚拟现实游戏中为 90 到 240 FPS。

引擎和游戏开发人员尽最大努力以恒定的时间间隔更新游戏世界和渲染图像,但帧渲染时间总是有微小的变化。这就是为什么引擎为我们提供了这个增量时间值,使我们的运动独立于我们的帧率。

在脚本底部,定义函数:

GDScript
func _process(delta):
    rotation += angular_speed * delta
C#
public override void _Process(double delta)
{
    Rotation += _angularSpeed * (float)delta;
}

关键字func定义了一个新函数【GDScript】。在它之后,我们必须在括号中写下函数的名称和参数。冒号结束定义,后面的缩进块是函数的内容或指令。

注:请注意_process(), 【类似于】_init(), 是如何以前导下划线开头的。按照惯例,Godot 的虚函数,也就是说,您可以覆盖以与引擎通信的内置函数,以下划线开头。

函数内的代码行,rotation += angular_speed * deltarotationNode2DSprite2D,其作用是每帧增加精灵【Sprite】的旋转。这里,【rotation】是一个继承自【Node2D】类的属性,【Sprite2D类】扩展了。它控制我们节点的旋转并使用弧度。

注:在代码编辑器中,您可以按住 Ctrl 键并单击任何内置属性或函数,例如positionrotation,或者_process在新选项卡中打开相应的文档。

运行场景以查看 Godot 图标就地转动。

注:在 C# 中,请注意_Process()参数delta为double类型. 因此,当我们将其应用于旋转时,我们需要将其转换为float。

移动¶

现在让节点移动。在函数内添加以下两行_process() ,确保新行的缩进方式与它们之前的行相同。rotation += angular * delta

GDScript

var velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

C#

var velocity = Vector2.Up.Rotated(Rotation) * _speed;

Position += velocity * (float)delta;

正如我们已经看到的,var关键字定义了一个新变量。如果将它放在脚本的顶部,它会定义类的一个属性。【这里用】在函数内部,它定义了一个局部变量:它只存在于函数的范围内。

我们定义了一个名为velocity的局部变量,它是一个表示方向和速度的二维向量【Vector2】。为了使节点向前移动,我们从 Vector2 类的常量Vector2.UP开始,即一个向上的向量,并通过调用 rotated()上的方法来旋转它。这个表达式Vector2.UP.rotated(rotation)【为】一个相对于我们的图标指向前方的向量。乘以我们的speed 属性,它给了我们一个速度,我们可以用它来向前移动节点。

我们添加【velocity * deltaposition】到节点【的位置(position)属性】以移动它。位置【position】本身是Vector2类型,是 Godot 中的内置类型,表示 2D 向量。

运行场景以查看 Godot 在原地转圈【运行效果】。

注:像那样移动节点不会考虑与墙壁或地板的碰撞。在您的第一个 2D 游戏中,您将学习另一种在检测碰撞时移动对象的方法。

我们的节点目前自行移动。在下一部分 Listening to player input中,我们将使用玩家输入来控制它。

完整脚本¶

这是完整的sprite_2d.gd文件以供参考。

GDScript

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    rotation += angular_speed * delta

    var velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta

C#

using Godot;

public partial class MySprite2D : Sprite2D
{
    private int _speed = 400;
    private float _angularSpeed = Mathf.Pi;

    public override void _Process(double delta)
    {
        Rotation += _angularSpeed * (float)delta;
        var velocity = Vector2.Up.Rotated(Rotation) * _speed;

        Position += velocity * (float)delta;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Datacom-HCIE 题库 02(10月26日更新)--含解析

单选题 1.[试题编号:189785] (单选题)如图所示,VTEP1上在BD20域内开启了ARP广播抑制功能,并且VTEP1通过 BGP EVPN路由学习到了PC2的ARP信息,则PC1发送的针对PC2的ARP请求,VIEP1在转发给VIEP2时…

设备采购信息管理系统

系列文章 任务14 设备采购信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试界面展示添加采购信息按编号查找采购信息按设备编号查找…

vue记录鼠标拖拽划过位置并将划过位置变色

首先 我们要做一个这样的基本组件 <template><div><!--循环遍历 List数组用当前下面当做key值然后定义了 onDragStart 鼠标拖动时触发定义 onDragEnd 拖动结束后触发定义 onDragOver 记录所有鼠标拖动经过的位置--><divclass"skeleton"v-f…

DAY 63 mysql的高级语句:存储过程

什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来&#xff0c;这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时&#xff0c;只需要调用它即可…

数据结构之堆详解

目录 1.什么是堆 堆的定义 结构体定义与函数接口 堆的初始化 堆的销毁 入堆 向上调整算法 大堆 出堆 向下调整算法 返回堆顶元素 判空 堆的应用 1.什么是堆 知道以上的存储方法&#xff0c;对于完全二叉树&#xff0c;有一个叫做堆的结构&#xff0c;堆本质就是一…

内核调试工具crash使用

内核调试工具crash使用 前言初识获取vmlinuxDwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) 其他 前言 在编写内核驱动的过程中&#xff0c;时不时就导致内核崩溃&#xff0c;也没啥好的调试方法&#xff0c;要么dmesg打印内核日志&…

socket | 网络套接字、网络字节序、sockaddr结构

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

量化论文学习之《基于 CNN-LSTM 混合模型的股价 预测》

主要原理 CNN-LSTM 混合模型首先使用 CNN 来提取时间序列数据的特征&#xff0c;然 后将特征输入进 LSTM 模型中来进行下一交易日股票收盘价的预测。 数据处理 使用数据 作者发现加入volume,pctChg后效果变差&#xff0c;可能原因是加入了相关性较低的特征后造成了数据冗余…

Ubuntu挂载阿里云盘

目录 所需环境安装docker安装rclone获取阿里云盘token 获取docker镜像并运行获取本机IP信息总结rclone配置挂载网盘到本地文件夹开机启动 所需环境 安装docker 使用官方脚本进行全自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh安装r…

Spring Boot 可执行 Jar 包运行原理

Spring Boot 有一个很方便的功能就是可以将应用打成可执行的 Jar。那么大家有没想过这个 Jar 是怎么运行起来的呢&#xff1f;本篇博客就来介绍下 Spring Boot 可执行 Jar 包的运行原理。 打可执行 Jar 包 将 Spring Boot 应用打成可执行 Ja r包很容易&#xff0c;只需要在 p…

数字信号处理基础(一):常用信号产生

目录 1. 写在前面2. 连续信号和离散信号2.1连续信号2.2 离散信号 3. 常用信号的产生3.1 单位脉冲序列3.2 单位阶跃序列3.3 指数函数3.4 正弦信号和余弦信号3.5 sinc函数3.6 矩形脉冲信号 4. 信号卷积5. 完整代码 1. 写在前面 为了更好的理解通信原理系列文章&#xff0c;在此补…

28 SQL——表子查询

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

使用Mathtype公式编辑器生成CSDN中的数学公式

使用Mathtype公式编辑器生成CSDN中的数学公式 在CSDN中输入数学公式&#xff0c;直接使用LaTeX编辑输入公式有一些难度&#xff0c;如果你熟悉Mathtype公式编辑器&#xff0c;那么在CSDN文档中输入数学公式也变的相对容易。 下面我们举例说明使用Mathtype转换输入CSDN的公式。…

Weex工具链的奥秘

在2017年1月12日 Weex Conf 2017上&#xff0c;来自阿里的卜道依据Weex开发中的痛点介绍了Weex的打包和插件机制&#xff0c;同样来自阿里的归影介绍了Weex的调试工具Devtools&#xff0c;共同揭秘了Weex的工具链。本文是卜道和归影关于Weex工具链实践的分享整理。 Weexpack与…

MyBatis各种类型查询数据的数据绑定

文章目录 1、前言2、查询一个实体类对象字段名和属性名无法映射处理方式一&#xff1a;起别名方式二&#xff1a;使用全局配置文件配置映射规则方式三&#xff1a;自定义resultmap 3、查询一个list集合4、查询单个数据5、查询一条数据为map集合6、 查询多条数据为map集合方式一…

Python中使用Scipy模块中root函数求解非线性方程的解法举例

Python中使用Scipy模块中root函数求解非线性方程的解法举例 Python中的SciPy模块功能强大&#xff0c;下面举例说明使用该模块求解非线性方程或非线性方程组。在求解时候&#xff0c;用到scipy.optimize模块中的root函数。 1.root函数的调用格式 调用它们的格式为 from scipy…

使用MinIO文件存储系统【完成视频断点续传】业务逻辑

目录 视频上传 接口一&#xff1a;检查该视频/媒资文件是否已经上传完成 接口二&#xff1a;检查视频分块是否已经在minio中已经存在 接口三&#xff1a;上传分块文件到minio中&#xff08;已经上传的分块会在接口二进行校验&#xff09; 接口四&#xff1a;合并上传的分块…

git生成密钥方法

1、密钥生成 打开Git Bash&#xff0c;查看ls ~/.ssh下是否有密钥文件id_rsa*&#xff0c;有的话可先进行备份。 然后用如下命令生成新密钥&#xff1a; ssh-keygen -t rsa -C "your_emailexample.com" 参数含义&#xff1a; -t 指定密钥类型&#xff0c;默认是 …

chatgpt赋能Python-pythonbif

Python Bif: 简介和使用指南 Python Bif是一种用于机器学习和数据科学的强大包。它提供了一些重要的功能&#xff0c;例如分类、集成和回归。这篇文章将向您介绍Python Bif的主要特性和如何使用它来完成各种数据科学任务。 什么是Python Bif&#xff1f; Python Bif是一个通…

Spring源码阅读:AOP原理

一、概述 以下便是Spring Aop的流程&#xff0c;下面我将一一介绍下面的各个方法。 下面是流程中的主要方法。 二、测试代码 下面我将写一个例子介绍Spring Aop的流程。 被增强类&#xff1a; public class MyCalculator {public Integer add(Integer i, Integer j) throw…