一、引言
讲道理,用过了Unity与UE后,发现小的创意项目还是Godot强。于是便跟着B站的一位UP主的教程开始了学习。以后,我都将会做出笔记发在CSDN上。
(视频链接:Godot 4 教程《勇者传说》)
二、基础设置
1、窗口大小
在项目设置中,将窗口覆盖大小设置为原视口大小,又将视口大小转为原来的三分之一。
2、拉伸模式
该项目为2D像素,用canvas_items比较合适。
3、渲染设置
如果我们为纯像素风的游戏,因将默认纹理过滤设置为Nearest,这样可以避免素材的模糊。
三、场景搭建
1、新建场景
选择场景节点,便会创建一个新的场景,我对于Godot的理解,是它把游戏里的一切都看做是一个节点。就像是一颗树一样,最基本的类往下分为很多种子类,子类再往下有分成了许多小类——比如说角色,又或者是场景,这些都被Godot定义为一种节点,同样的,对于节点的利用,也在于给一个角色上刚体或是碰撞体之类的。这应该是Godot的基本定义。
2、TileMap
一个2D游戏缺不了TileMap。瓦片地图在Godot里的应用很简单——在世界下创建一个TileMap的节点,并将图片加入。
在Unity中,创建瓦片地图后,可以直接选择使用TileMap专属的碰撞体,而在Godot里,我觉得会多上几个步骤。
首选,要选择绘制。在绘制中选择物理层0,选择想要添加碰撞体的单个瓦片,就可以直接使用了。而绘制很简单,左键放置,右键删除,按住Shift还可以拉直线。
四、角色创建
1、精灵创建
似乎在Godot里创建角色可以直接忽略掉默认精灵,直接使用动画来创建。
首选选择其他节点,然后再选择CharacterBody2D节点。
官方对于CharacterBody2D的定义如下:CharacterBody2D是一个专门的类,用于用户控制的物理体。它们完全不受物理影响,但会影响其路径上的其他物理体,主要用于提供高级API来移动对象,除了PhysicsBody2D.move_and_collide()提供的一般碰撞检测外,还带有墙和坡度检测(move_and_slide()方法)。这使得它对于必须以特定方式移动并与世界碰撞的高度可配置的物理体非常有用,这通常是用户控制角色的情况。(官方文档:CharacterBody2D)
总而言之,它给了我们许多基础的定义。
2、动画创建
在角色节点根下创建Sprite2D,然后在Texture下添加切片素材,在Region区中将Enabled选为启用,然后选择编辑区域,选择栅格吸附,并根据自己的素材选择步长(一个格子的长和宽)。我们框出6帧的站立(Idle)动画。
同时,我们要分解Idle动画,所以选择Hframes(横向帧),并更改为6。
之后,我们在Character2D的根下创建AnimationPlayer,这将帮助我们创建动画。根据自己的需求,调整总时长与单个帧时长,并决定是否需要循环。
接着,我们点击动画器,并创建新的动画,名为Idle(自定义)。
现在,需要添加关键帧(目前对于几个步骤我也不知道是什么意思,后续补充),先点击rect右边的小钥匙,创建。然后再点击Hframes旁的小钥匙,最后就是Frame的,根据单个帧的总量来添加。
现在,我们拥有了一个动画,同上,我们可以接着创建Jump与Run了。
3、角色脚本
目前,我的理解就是,Godot-script就是python的改版,不过它也拥有C#脚本,跟当年的Unity一样,不知道会不会被取代——可能随着Godot的升级换代,功能变多,恐怕就需要C#来开发了。
点击Character2D上的小图标。
现在我们添加键盘映射。
我们在代码中写下程序:
#类的继承
extends CharacterBody2D
#基础常亮数据的定义
const RUNSPEED := 200.0
const JUMPSPEED := -300.0
#重力直接引用系统中的定义
var gravity := ProjectSettings.get("physics/2d/default_gravity") as float
#引用两个节点的方式,可以直接拖拽放入
@onready var sprite_2d: Sprite2D = $Sprite2D
@onready var animation_player: AnimationPlayer = $AnimationPlayer
#移动函数,目前还不是很理解,不过_physics_process()是类里自带的
func _physics_process(delta: float) -> void:
#获取输入阈值(-1~1)
var direction := Input.get_axis("move_left","move_right")
#velocity是Godot对角色移动的定义
velocity.x = direction * RUNSPEED
velocity.y += gravity * delta
#下面的is_on_floor()同样为系统
if is_on_floor() and Input.is_action_just_pressed("jump"):
velocity.y = JUMPSPEED
#动画机的改变
if is_on_floor():
if is_zero_approx(direction):
animation_player.play("Idle")
else:
animation_player.play("Running")
else:
animation_player.play("Jumping")
#角色的面朝方向
if not is_zero_approx(direction):
sprite_2d.flip_h = direction < 0
#下面的还不是很理解
move_and_slide()
程序里,字符串的部分都是在Godot里定义的,可以更改和自定义。其实乍一看,和Unity也相差不大,很好理解和上手,因为Godot在Character2D类里定义了太多可以直接使用的东西。
4、碰撞体
我们直接在角色的根下添加一个名叫CollisionShape2D的节点,碰撞体在本节课中还没有过多的讲解,我们添加即可。
五、结语
没有太多的话说,第一节课就这么多东西,我们可以点击运行看看自己的成果。
希望自己能够坚持下去。