尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

22、组件化实战与项目组织

22、组件化实战与项目组织 第22章 组件化实战与项目组织22.1 通用组件设计HealthComponentextends Node class_name HealthComponent signal health_changed(current: int, maximum: int) signal damaged(amount: int, source: Node) signal healed(amount: int) signal died export var max_health: int 100 export var invincible_after_hit: bool true export var invincible_duration: float 0.5 var health: int var is_invincible: bool false func _ready() - void: health max_health func take_damage(amount: int, source: Node null) - void: if is_invincible or health 0: return health clampi(health - amount, 0, max_health) damaged.emit(amount, source) health_changed.emit(health, max_health) if invincible_after_hit: start_invincibility() if health 0: died.emit() func heal(amount: int) - void: if health 0: return health clampi(health amount, 0, max_health) healed.emit(amount) health_changed.emit(health, max_health) func start_invincibility() - void: is_invincible true await get_tree().create_timer(invincible_duration).timeout is_invincible false func get_health_percentage() - float: return float(health) / max_healthInteractionComponentextends Area2D class_name InteractionComponent signal interacted(interactor: Node2D) export var interaction_text: String 按 E 交互 export var requires_line_of_sight: bool false var can_interact: bool false var current_interactor: Node2D null func _ready() - void: body_entered.connect(_on_body_entered) body_exited.connect(_on_body_exited) func _on_body_entered(body: Node2D) - void: if body.is_in_group(player): can_interact true current_interactor body show_interaction_prompt() func _on_body_exited(body: Node2D) - void: if body current_interactor: can_interact false current_interactor null hide_interaction_prompt() func interact() - void: if can_interact: interacted.emit(current_interactor) func show_interaction_prompt() - void: # 显示交互提示 UI pass func hide_interaction_prompt() - void: # 隐藏交互提示 UI passCollectComponentextends Area2D class_name CollectComponent signal collected(item_data: Dictionary) export var item_type: String coin export var item_value: int 1 export var auto_collect: bool true export var magnet_range: float 0.0 # 磁铁吸引范围 var is_collected: bool false func _ready() - void: body_entered.connect(_on_body_entered) func _on_body_entered(body: Node2D) - void: if is_collected: return if body.is_in_group(player): collect(body) func collect(collector: Node2D) - void: is_collected true collected.emit({type: item_type, value: item_value}) # 收集动画 var tween : create_tween() tween.tween_property(self, global_position, collector.global_position, 0.2) tween.tween_property(self, scale, Vector2.ZERO, 0.1) tween.tween_callback(queue_free)22.2 项目目录组织res:// ├── scenes/ │ ├── characters/ │ │ ├── player/ │ │ │ ├── player.tscn │ │ │ └── player.gd │ │ └── enemies/ │ │ ├── slime/ │ │ └── boss/ │ ├── levels/ │ │ ├── level_01.tscn │ │ └── level_02.tscn │ ├── ui/ │ │ ├── hud.tscn │ │ ├── main_menu.tscn │ │ └── components/ │ │ ├── health_bar.tscn │ │ └── dialog_box.tscn │ └── effects/ │ ├── explosion.tscn │ └── hit_spark.tscn ├── scripts/ │ ├── components/ # 可复用组件 │ │ ├── health_component.gd │ │ ├── hitbox_component.gd │ │ └── interaction_component.gd │ ├── systems/ # 游戏系统 │ │ ├── save_manager.gd │ │ ├── event_bus.gd │ │ └── audio_manager.gd │ └── resources/ # 自定义资源 │ ├── player_stats.gd │ └── enemy_data.gd ├── assets/ │ ├── sprites/ │ │ ├── characters/ │ │ ├── tiles/ │ │ └── ui/ │ ├── audio/ │ │ ├── bgm/ │ │ ├── sfx/ │ │ └── voice/ │ ├── fonts/ │ └── shaders/ ├── resources/ # .tres 资源文件 │ ├── stats/ │ ├── themes/ │ └── tilesets/ └── addons/ # 插件22.3 GDScript 代码规范# 命名规范 # - 变量/函数snake_case # - 类名PascalCase # - 常量UPPER_SNAKE_CASE # - 信号snake_case动词过去式 # - 私有变量_前缀 # 文件头部注释 # player.gd - 玩家角色控制器 # 负责移动、跳跃、攻击、受伤 extends CharacterBody2D class_name Player # 信号 signal health_changed(current: int, maximum: int) # 常量 const JUMP_BUFFER_TIME: float 0.1 const COYOTE_TIME: float 0.12 # 导出变量 export_group(Movement) export var speed: float 300.0 export var jump_force: float -500.0 # 私有变量 var _is_jumping: bool false var _coyote_timer: float 0.0 # 节点引用 onready var _sprite: AnimatedSprite2D $AnimatedSprite2D onready var _health: HealthComponent $HealthComponent # 生命周期 func _ready() - void: _health.died.connect(_on_died) func _physics_process(delta: float) - void: _handle_movement(delta) _handle_jump(delta) _update_animation() move_and_slide() # 私有方法 func _handle_movement(delta: float) - void: var input_dir : Input.get_axis(move_left, move_right) velocity.x input_dir * speed func _handle_jump(delta: float) - void: pass func _update_animation() - void: pass # 回调 func _on_died() - void: pass22.4 静态类型最佳实践# ✅ 推荐始终使用静态类型 var health: int 100 var speed: float 300.0 var enemies: Array[Node2D] [] onready var sprite: Sprite2D $Sprite2D # ✅ 使用类型推断 var health : 100 var pos : Vector2.ZERO # ✅ 函数参数和返回值标注 func take_damage(amount: int, source: Node null) - void: pass func get_nearest_enemy() - Node2D: return null # ❌ 避免无类型 var health 100 func take_damage(amount, source): pass
返回列表