1. 项目概述:为什么数据类型是Godot 4脚本的基石
如果你刚开始接触Godot 4,尤其是从其他编程语言(比如Python、Java或者C#)转过来,可能会觉得GDScript看起来挺简单,写起来也快。但当你真正开始构建一个稍微复杂点的游戏逻辑时,比如处理玩家的背包系统、计算物理伤害,或者管理游戏状态,很快就会遇到一个核心问题:我的数据该怎么存、怎么传、怎么算?这时候,对Godot 4基础数据类型的深入理解,就从“可有可无”变成了“必须掌握”。
这篇笔记不是官方文档的简单复述。我会结合自己用Godot做项目的实际经验,带你拆解GDScript中那些最常用、也最容易让人困惑的数据类型。我们会从最基础的 int 、 float 、 String 聊起,一直深入到Godot的灵魂—— Variant 类型,以及那些能极大提升你开发效率的“打包数组”(PackedArray)。你会发现,搞懂这些,不仅能让你写出更健壮、更高效的代码,还能让你真正理解Godot引擎底层是如何运作的,从而避免很多莫名其妙的bug。
简单说,数据类型就是你跟Godot引擎沟通时,双方必须遵守的“协议”。用对了,沟通顺畅,游戏跑得飞快;用错了,轻则逻辑出错,重则性能卡顿。无论你是想做2D像素风独立游戏,还是想挑战3D大作,这套“协议”都是你的必修课。
2. 核心数据类型深度解析:从“是什么”到“为什么”
2.1 基础标量类型:数字、文本与逻辑的起点
Godot 4的GDScript提供了一套非常直观的基础类型,它们是你构建一切游戏逻辑的砖瓦。
整数( int )与浮点数( float ) : 这是最常用的两种数值类型。 int 用于存储没有小数部分的数字,比如生命值、金币数量、数组索引。 float 则用于需要精度或小数的场景,比如角色的速度、旋转角度、时间间隔。
var player_health: int = 100 # 生命值,整数足够
var movement_speed: float = 325.5 # 移动速度,带小数更精确
var jump_force: float = 850.0
这里有个新手常踩的坑: 整数除法 。在GDScript中,两个 int 相除,结果会被 截断 为 int ,而不是得到 float 。
var a: int = 5
var b: int = 2
var result = a / b # 结果是 2,而不是 2.5!
print(result) # 输出:2
# 正确的做法:确保至少有一个操作数是float
var correct_result_1: float = a / float(b) # 显式转换
var correct_result_2 = 5.0 / 2 # 使用浮点数字面量
print(correct_result_1) # 输出:2.5
print(correct_result_2) # 输出:2.5
实操心得 :在进行任何可能产生小数的数学运算时,我养成的习惯是,要么提前将
int变量用float()转换,要么直接使用带小数点的数字(如2.0)。这能避免大量隐蔽的计算错误。
布尔值( bool ) : 只有 true 和 false 两个值,用于条件判断和状态标志。Godot中很多节点的属性都是布尔类型,比如 CanvasItem.visible 、 CollisionShape2D.disabled 。
var is_player_alive: bool = true
var is_game_paused: bool = false
if Input.is_action_just_pressed("ui_accept") and not is_game_paused:
player_jump()
字符串( String ) : 用于存储文本。Godot的字符串功能强大,支持多行字符串、格式化以及丰富的内置方法。
var player_name: String = "Hero"
var dialogue: String = """这是一个多行字符串。
你可以直接在这里换行,
而无需使用转义符\n。"""
# 字符串格式化(推荐方式)
var health_text: String = "生命值: %d/%d" % [current_health, max_health]
var pos_text: String = "位置: (%.2f, %.2f)" % [position.x, position.y] # 保留两位小数
# 常用字符串操作
var path = "res://levels/forest.tscn"
var filename = path.get_file() # 获取文件名: "forest.tscn"
var basename = path.get_basename() # 获取无扩展名部分: "res://levels/forest"
var extension = path.get_extension() # 获取扩展名: "tscn"
注意事项 :虽然GDScript支持用
+号拼接字符串,但在循环内或性能敏感处大量拼接时,效率较低。更高效的做法是使用String的format方法(即%操作符)或Array的join()方法。
2.2 向量与数学类型:游戏世界的坐标与变换
2D和3D游戏的核心就是空间和运动,Godot为此提供了极其完善的数学类型。
Vector2 & Vector2i : Vector2 用于2D游戏中的所有浮点坐标、速度、加速度等。 Vector2i 是其整数版本,常用于网格坐标(如TileMap)、像素艺术或UI控件的位置。
var player_position: Vector2 = Vector2(100.5, 200.3)
var movement: Vector2 = Vector2(1.0, 0.0).normalized() * speed # 标准化向量并乘以速度
var grid_coord: Vector2i = Vector2i(5, 10) # 瓦片地图中的格子坐标
# 向量运算
var vec_a = Vector2(10, 20)
var vec_b = Vector2(5, 5)
var sum = vec_a + vec_b # (15, 25)
var diff = vec_a - vec_b # (5, 15)
var scaled = vec_a * 2.0 # (20, 40)
var dot_product = vec_a.dot(vec_b) # 点积,用于判断前后关系、投影等
var distance = vec_a.distance_to(vec_b) # 计算两点间距离
Vector3 & Vector3i : 3D世界的基石。 Vector3 用于3D空间中的位置、朝向(欧拉角)、缩放、物理力等。 Vector3i 同样用于需要整数精度的3D网格。
var world_position: Vector3 = Vector3(0.0, 10.0, -5.0)
var gravity: Vector3 = Vector3(0.0, -9.8, 0.0)
var rotation_degrees: Vector3 = Vector3(0, 45, 0) # 绕Y轴旋转45度
# 在3D中,叉积(cross product)非常重要,用于计算法向量、扭矩等
var forward = Vector3(0, 0, -1)
var up = Vector3(0, 1, 0)
var right = forward.cross(up) # 计算右向量
Rect2 & Rect2i : 矩形区域。 Rect2 用 position (左上角)和 size 定义, Rect2i 是整数版本。它们广泛用于碰撞检测、UI布局、视口裁剪、精灵图集(Sprite Sheet)的帧选择。
# 定义一个从(50, 50)开始,宽100,高80的矩形
var viewport_rect: Rect2 = Rect2(50, 50, 100, 80)
var sprite_frame: Rect2i = Rect2i(0, 0, 32, 32) # 像素艺术中一帧的矩形
# 常用操作
if viewport_rect.has_point(mouse_position):
print("鼠标在视口内")
var expanded_rect = viewport_rect.grow(10) # 向四周扩大10个单位
var intersection = rect_a.intersection(rect_b) # 求两个矩形的交集,若无交集则返回空矩形
if intersection.has_area(): # 判断交集是否有效(面积>0)
handle_collision()
Transform2D & Transform3D : 变换矩阵。 Transform2D 用于2D节点的复杂变换(平移、旋转、缩放、错切),它比单独操作 position 、 rotation 、 scale 更高效且能处理任意原点变换。 Transform3D 在3D中
553



被折叠的 条评论
为什么被折叠?



