创建房屋
约 699 字大约 2 分钟
2026-02-10
1. 创建节点,搭建房屋
需要将对应的Collision Layer设置为1

2. 绘制碰撞区域
在TileSet设置中选择指定节点,首先需要绘制区域,就是对应着Physics Layer0

然后选择物理层进行绘制

创建家具,可以采用同一个素材,shift可以多选

按照之前的步骤一样进行区域绘制


然后我们会发现人物太大了,进不去,可以考虑缩小人物框体
然后可以直接复用tileset,里面有导入场景功能,直接拖进来

可在调试中打开碰撞区域

接下来就是门的绘制,门有开、关等状态
3. 门开、关
创建一个StaticBody2D+Sprite2d 门的动画

可以直接按照开门动作进行帧的绘制,需要进行开门、关门、默认帧动画

再创建对应的碰撞体,但是我们需要这个碰撞体在地面层上面

将任务设置为固定的图层,这样就可以发生碰撞

在之前缺门的场景增加门,需要和墙的位置一致

可交互大门,创建新的Area2d,用于交互,需要实现对应的信号、body进入、body出去相关代码

class_name IteractableComponent
extends Area2D
signal interactable_actived
signal interactable_deactived
func _on_body_entered(body: Node2D) -> void:
interactable_actived.emit();
func _on_body_exited(body: Node2D) -> void:
interactable_deactived.emit();
需要创建新的图层和player进行交互,之前我们设置player为图层2,此时门的交互已经可以了,我们只需要将这个绑定到门即可,其中这个碰撞区域需要大一些,因为我们做的是检测门的开关位置是否有人,有人就自动进行开门。

接下来就是创建门的脚本,选中组件移动,然后按住ctrl即可自动引用
extends StaticBody2D
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
@onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D
@onready var interactable_componet: IteractableComponent = $InteractableComponet
func _ready() -> void:
# 绑定信号
interactable_componet.interactable_actived.connect(on_interactable_actived);
interactable_componet.interactable_deactived.connect(on_interactable_deactived);
func on_interactable_actived() ->void:
animated_sprite_2d.play("open_door")
func on_interactable_deactived()->void:
animated_sprite_2d.play("close_door")然后发现因为碰撞体,人物无法进出,最简单的方式是动态图层,和人物一层
extends StaticBody2D
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
@onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D
@onready var interactable_componet: IteractableComponent = $InteractableComponet
func _ready() -> void:
# 绑定信号
interactable_componet.interactable_actived.connect(on_interactable_actived);
interactable_componet.interactable_deactived.connect(on_interactable_deactived);
collision_layer = 1
func on_interactable_actived() ->void:
animated_sprite_2d.play("open_door")
collision_layer = 2
func on_interactable_deactived()->void:
animated_sprite_2d.play("close_door")
collision_layer = 2贡献者
flycodeu
版权所有
版权归属:flycodeu
