7.Godot脚本介绍及变量的定义和导出

本文介绍了Godot游戏引擎中的脚本GdScript基础知识,包括脚本的定义、使用、规范原则,以及变量和数据类型的处理,还讲解了如何通过脚本控制游戏对象位置和全局变量的导出。

1. 脚本的定义

  • 游戏脚本 Script ,用代码来控制游戏对象和逻辑
  • godot使用 GdScript 作为脚本语言和python最类似,比python简单
  • 注意:自本章开始,每节课的项目源码都放在了github项目godot-start,可以直接对照示例项目
  • 游戏开发,也是一种程序设计,如果是0基础的同学,建议先学习一个强类型语言比如Java,C#,C++,再来学习GdScript就一通百通了

2. 脚本的使用

  • 如何使用一个脚本?
新建脚本 hello.gd ,编辑代码 ,保存一下
把脚本挂载到游戏节点上
运行游戏,点 Play Scene 运行当前游戏场景,在 Output 窗口里观察打印输出

3. 认识脚本

  • 因为是GdScript是弱类型语言,所以比较自由,但是我们可以约定一些原则让代码更加的规范:
类名必须与文件名相同,且为小写
比如场景名和节点名和脚本名都是一样的
尽量继承于 Node2D 节点,Node2D 节点中的Transform是我们用的最多的节点
继承sprite也没有关系,但是sprit里的属性很多用不到,比较浪费性能
如果不用tranform,也可以继承node节点,更加清晰
继承的节点的层级越往上就更简单
  • 常用函数内部执行顺序
默认定义了一些事件函数,例如,
_init():脚本初始化的时候调用,对象的构造器,类似于Java的构造函数construct,首先被调用
_ready():开始调用一次,可用于初始化脚本,是一个事件函数,脚本挂载以后会回调一个ready函数
_process(delta):每帧调用,帧间隔不等,可用于更新游戏

生命周期开始的时候会回调ready,每帧刷新的时候会回调process,delta是每帧调用之间的间隔

4.变量和数据类型

变量的概念与简单操作
  • 变量是可以代表数据的一种抽象概念。可以通过对变量名的操作来对变量代表的数据进行操作。
  • 在 GDS 中,你可以创建自定义的变量,也可以使用内置代码中的变量。
  • 变量可以进行计算与转换。必须在函数内发生
  • 即使是同一脚本文件,绑定不同的对象从而产生了同名的变量,这两个变量以及变量代表的数据也分别属于不同的对象,互相独立。因此使用变量前必须指明变量所属的对象
  • 变量是用于存储信息的"容器"。
var x=5;
var y=6;
var z=x+y;

就像代数那样
x=5
y=6
z=x+y

在代数中,我们使用字母(比如 x)来保存值(比如 5)。
通过上面的表达式 z=x+y,我们能够计算出 z 的值为 11。
在 godot 中,这些字母被称为变量。
gds数据类型分类
  • bool,一个字节,默认为false
  • int(同C++和Java long),8个字节,默认为0
    • 在godot里的表示范围-9223372036854775808~9223378036854775807
    • 2^64-1
  • float(同C++和Java double),8个字节,默认为0
  • String,默认为null,字符串可以存储一系列字符,如 “John Doe”。
  • 数组
  • 对象
  • null,变量没有被赋值,则默认为null
变量的作用

变量除定义的过程外,必须在函数内进行数值的修改,内置代码中的许多变量在修改后,会直接对游戏内容产生实质性的影响。而自定义的变量则不会。因此,可以用自定义的变量来定义逻辑上的游戏数据,而后通过判断逻辑上的数据情况,来调整内置代码中的变量,对游戏的画面、音效等产生实际的影响。


通过内置变量影响游戏

  1. 给sprite节点添加一个脚本
    在process函数输入
self.position.x = self.position.x + 1

这样每帧这个精灵节点就会往右移动1

  1. 给label节点也添加一个脚本
    在函数外定义一个全局变量
var c:String = "Hello World"

在ready函数中输入

self.text = c

在运行场景的时候文本框内会显示Hello World

导出变量
  • @export关键字可以让变量在编辑器中编辑,godot编辑器里的文档中有详细的用法
# 导出一个数字
@export var a = 1
# 导出一个节点路径
@export var b:NodePath
# 导出一个文件路径
@export_file var sound_effect_path: String
# 导出一个文件路径,以txt结尾
@export_file("*.txt") var notes_path: String
<think>我们正在讨论Godot引擎中的命名规范。根据之前的讨论,我们知道帕斯卡命名法、蛇形命名法小驼峰命名法的特点。现在需要针对Godot脚本(通常使用GDScript)来具体说明变量、函数、类等的命名规范。 在Godot官方文档中,有关于命名规范的明确建议。以下是一些关键点: 1. **类名节点名**:使用帕斯卡命名法(PascalCase)。 2. **变量函数名**:使用蛇形命名法(snake_case)。 3. **常量**:使用大写蛇形命名法(SNAKE_CASE)。 4. **枚举**:枚举名称使用帕斯卡命名法,枚举值使用大写的蛇形命名法。 此外,Godot还有一些特定的约定: - 私有变量或函数,以下划线开头(例如:`_ready()`)。 - 信号名称使用过去时态(例如:`entered`, `skill_used`)。 下面我们结合具体示例来说明: ### 1. 类名(节点名)的命名规范 在Godot中,每个脚本文件默认代表一个类。当创建节点时,节点类型(类名)应该使用帕斯卡命名法。 例如: ```gdscript # 玩家角色类 class_name PlayerCharacter extends CharacterBody2D # 敌人AI类 class_name EnemyAI extends Node2D ``` ### 2. 变量函数 变量函数名使用蛇形命名法(snake_case)。 变量示例: ```gdscript var health = 100 var movement_speed = 200.0 var is_alive = true ``` 函数示例: ```gdscript func take_damage(amount): health -= amount if health <= 0: die() func die(): is_alive = false queue_free() ``` ### 3. 常量 常量使用大写的蛇形命名法(SNAKE_CASE)。 示例: ```gdscript const MAX_HEALTH = 100 const GRAVITY = 9.8 ``` ### 4. 枚举 枚举名称使用帕斯卡命名法,枚举值使用大写的蛇形命名法。 示例: ```gdscript enum EnemyState {IDLE, CHASING, ATTACKING} ``` ### 5. 私有成员 在Godot中,以下划线开头的函数或变量表示私有(虽然Godot没有真正的私有,但约定如此)。例如,`_ready`是Godot引擎回调函数,我们自定义的私有函数也这样命名。 示例: ```gdscript func _ready(): # 初始化代码 pass func _process(delta): # 每帧处理 pass var _private_variable = "internal" ``` ### 6. 信号 信号名称使用蛇形命名法,并且通常使用过去时态。 示例: ```gdscript signal health_changed(old_value, new_value) signal died() ``` ### 7. 导出变量 导出变量(在编辑器可见)也使用蛇形命名法,但可以添加提示。 示例: ```gdscript @export var max_speed: float = 400.0 @export_range(0, 100) var health: int = 100 ``` ### 总结:Godot中的命名规范 | 类型 | 命名规范 | 示例 | |--------------|------------------|--------------------------| | 类名/节点名 | 帕斯卡命名法 | `Player`, `EnemyAI` | | 变量 | 蛇形命名法 | `health`, `movement_speed` | | 函数 | 蛇形命名法 | `take_damage`, `die` | | 常量 | 大写的蛇形命名法 | `MAX_HEALTH`, `GRAVITY` | | 枚举名 | 帕斯卡命名法 | `EnemyState` | | 枚举值 | 大写的蛇形命名法 | `IDLE`, `CHASING` | | 私有成员 | 下划线+蛇形命名法| `_private_method`, `_private_var` | | 信号 | 蛇形命名法 | `health_changed`, `died` | | 导出变量 | 蛇形命名法 | `@export var max_speed` | ### 最佳实践建议 1. **一致性**:在整个项目中保持一致的命名规范。 2. **可读性**:使用描述性的名称,避免缩写(除非广泛接受)。 3. **与引擎一致**:遵循Godot引擎的命名风格,这样你的代码更符合社区标准。 ### 相关问题 1.Godot中,为什么推荐使用蛇形命名法而不是小驼峰命名法? 2. 如何为Godot中的自定义资源(Resource)命名? 3. Godot中的信号命名有哪些注意事项? 4.Godot中,如何命名一个会被多个脚本引用的全局常量? > 引用说明:Godot官方文档中明确建议使用蛇形命名法(snake_case)来命名变量函数[^1],而类名使用帕斯卡命名法(PascalCase)[^2]。</think>### Godot 脚本命名规范指南 在 Godot 引擎中,命名规范遵循特定的最佳实践,以下是根据官方推荐社区共识整理的完整规范: #### 一、类名与节点名(帕斯卡命名法) **特点**: - 所有单词首字母大写 - 无分隔符 - 用于核心实体定义 **示例**: ```gdscript # 自定义类 class_name PlayerCharacter extends CharacterBody2D # 节点类型 @onready var camera: Camera2D = $MainCamera var enemy_spawner: Node2D = preload("res://scenes/EnemySpawner.tscn") ``` **最佳实践**: 1. 所有脚本类名使用帕斯卡法 2. 场景根节点使用帕斯卡法 3. 自动加载单例(Autoload)使用帕斯卡法 4.定义资源类型(Resource)使用帕斯卡法 #### 二、变量与函数(蛇形命名法) **特点**: - 全小写字母 - 下划线分隔单词 - Godot 官方推荐风格 **示例**: ```gdscript # 变量 var current_health := 100 var is_player_alive := true var movement_speed := 200.0 # 函数 func take_damage(damage_amount: int) -> void: current_health -= damage_amount func _physics_process(delta: float) -> void: handle_movement(delta) ``` **最佳实践**: 1. 所有变量函数使用蛇形命名 2. 信号名称使用过去时态蛇形命名:`signal player_died()` 3. 枚举值使用大写蛇形命名: ```gdscript enum PlayerState {IDLE, RUNNING, ATTACKING} ``` #### 三、常量(大写蛇形命名法) **特点**: - 全大写字母 - 下划线分隔 - 显式声明不可变性 **示例**: ```gdscript const MAX_HEALTH := 100 const GRAVITY := 9.8 const LAYER_PLAYER := 1 ``` #### 四、私有成员(下划线前缀) **特点**: - 蛇形命名法 - 以下划线开头 - 表示内部使用 **示例**: ```gdscript var _internal_cooldown := 0.0 func _calculate_damage() -> int: return base_damage * damage_multiplier ``` #### 五、文件与目录命名(蛇形命名法) **特点**: - 全小写+下划线 - 保证跨平台兼容性 **示例**: ``` res:// characters/ player_character.tscn scripts/ enemy_ai.gd assets/ sprites/ player_idle.png ``` ### 命名规范对照表 | 元素类型 | 命名法 | 示例 | 重要说明 | |------------------|--------------|-----------------------|------------------------------| | **类/节点** | 帕斯卡法 | `PlayerCharacter` | 必须与文件名一致 | | **变量** | 蛇形法 | `movement_speed` | 包括成员变量 | | **函数** | 蛇形法 | `calculate_damage()` | 引擎回调使用`_`前缀 | | **信号** | 蛇形法 | `enemy_spawned()` | 使用过去时态 | | **常量** | 大写蛇形法 | `MAX_HEALTH` | 使用`const`声明 | | **私有成员** | 蛇形法+`_` | `_internal_timer` | 仅限类内部访问 | | **枚举值** | 大写蛇形法 | `ATTACKING` | 在枚举类型内定义 | | **资源文件** | 蛇形法 | `player_idle.png` | 避免空格特殊字符 | | **目录** | 蛇形法 | `enemy_ai/` | 保持全小写 | ### 特殊场景处理 1. **节点路径引用**: ```gdscript # 使用蛇形命名节点 @onready var health_bar: ProgressBar = $UI/HealthBar ``` 2. **信号连接**: ```gdscript # 信号名称蛇形命名 enemy.connect("enemy_died", _on_enemy_died) ``` 3. **导出变量**: ```gdscript # 导出变量仍用蛇形命名 @export var max_jump_height := 100.0 ``` ### 核心原则 1. **一致性优先**:整个项目统一规范 2. **可读性**:`is_player_grounded` 优于 `isGrounded` 3. **引擎兼容**:避免使用小驼峰防止与 GDScript 内置方法混淆 4. **类型提示**:始终添加类型注解 ```gdscript func move(direction: Vector2, speed: float) -> void: ``` > 引用说明:Godot 官方文档明确推荐变量函数使用蛇形命名法[^1],类名使用帕斯卡法[^2],此规范保证与引擎内部命名一致并避免大小写敏感问题[^3]。 --- ### 相关问题 1.Godot 中如何处理不同节点类型的命名冲突? 2. 为什么 Godot 推荐信号名称使用过去时态? 3. 如何为 Godot 插件设计符合引擎规范的 API 命名? 4. 在 GDScript 中使用小驼峰命名可能引发哪些兼容性问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值