Back to skills
SKILL.md
godot-tscn-format
ASecurityGodot 4.x .tscn 场景文件纯文本格式规范与 AI 操作指南 — 文件结构、资源引用、 Transform 变换、属性值格式、信号连接,以及 AI 直接读写 .tscn 文件的操作方法。
- 103 stars
- 0 votes
- 0 copies
- 3 views
- Added September 12, 2026
Security analysis
100/100Pro scans all 2 files and shows the line behind each finding
npx -y skills add 925236118/AlphaAgent --skill skills --agent claude-codeAre you the author of godot-tscn-format?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/925236118-godot-tscn-format)---
name: godot-tscn-format
description: >-
Godot 4.x .tscn 场景文件纯文本格式规范与 AI 操作指南 — 文件结构、资源引用、
Transform 变换、属性值格式、信号连接,以及 AI 直接读写 .tscn 文件的操作方法。
version: 1.0.0
---
# Godot .tscn 场景文件格式规范
> **用途**:让 AI 能够直接读写 Godot 场景文件
> **版本**:v1.0 · 2026-04-24
> **适用引擎**:Godot 4.x
---
## 核心原则
**Godot 场景文件是纯文本**,AI 可以直接通过 `write_to_file` 和 `replace_in_file` 操作,无需任何中间层。
---
## 一、文件结构总览
```
[gd_scene load_steps=N format=3 uid="uid://xxx"] ← 头部(必需)
[ext_resource type="Type" path="res://..." id="ID"] ← 外部资源引用(可选)
[ext_resource ...]
[sub_resource type="Type" id="ID"] ← 内嵌资源定义(可选)
property = value
[sub_resource ...]
[node name="Name" type="Type"] ← 根节点(必需)
property = value
[node name="Child" type="Type" parent="."] ← 子节点
property = value
[connection signal="sig" from="Node" to="Target" method="func"] ← 信号连接(可选)
```
---
## 二、头部声明
### 2.1 基本格式
```
[gd_scene load_steps=4 format=3]
```
| 字段 | 说明 |
|------|------|
| `load_steps` | 资源加载步数 = ext_resource 数 + sub_resource 数 + 1(场景本身) |
| `format` | 固定为 `3`(Godot 4.x) |
| `uid` | 可选,Godot 自动生成的唯一 ID,创建时可省略 |
### 2.2 计算 load_steps
```python
load_steps = len(ext_resources) + len(sub_resources) + 1
```
示例:2 个外部资源 + 3 个内嵌资源 → `load_steps=6`
---
## 三、外部资源引用 (ext_resource)
### 3.1 格式
```
[ext_resource type="Type" path="res://path/to/file" id="ID"]
```
### 3.2 常见类型
| type | 文件类型 | 示例 |
|------|----------|------|
| `Script` | GDScript | `path="res://scripts/player.gd"` |
| `PackedScene` | 场景 | `path="res://scenes/enemy.tscn"` |
| `Material` | 材质资源 | `path="res://materials/floor.tres"` |
| `Texture2D` | 2D 纹理 | `path="res://textures/icon.png"` |
| `AudioStream` | 音频 | `path="res://audio/shoot.wav"` |
| `Shader` | 着色器 | `path="res://shaders/outline.gdshader"` |
### 3.3 ID 命名规范
AI 生成时使用有意义的 ID:
```
[ext_resource type="Script" path="res://scripts/player.gd" id="1_player_script"]
[ext_resource type="Material" path="res://resources/floor_mat.tres" id="2_floor_mat"]
[ext_resource type="PackedScene" path="res://scenes/bullet.tscn" id="3_bullet_scene"]
```
---
## 四、内嵌资源定义 (sub_resource)
### 4.1 格式
```
[sub_resource type="Type" id="ID"]
property1 = value1
property2 = value2
```
### 4.2 常用碰撞形状
```
# 胶囊体(角色常用)
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_player"]
radius = 0.35
height = 1.8
# 球体
[sub_resource type="SphereShape3D" id="SphereShape3D_001"]
radius = 0.5
# 盒子
[sub_resource type="BoxShape3D" id="BoxShape3D_floor"]
size = Vector3(10, 0.2, 10)
# 圆柱体
[sub_resource type="CylinderShape3D" id="CylinderShape3D_001"]
height = 2.0
radius = 0.5
# 2D 形状
[sub_resource type="RectangleShape2D" id="RectangleShape2D_001"]
size = Vector2(32, 32)
[sub_resource type="CircleShape2D" id="CircleShape2D_001"]
radius = 16.0
```
### 4.3 常用网格
```
# 盒子网格
[sub_resource type="BoxMesh" id="BoxMesh_001"]
size = Vector3(1, 1, 1)
# 球体网格
[sub_resource type="SphereMesh" id="SphereMesh_001"]
radius = 0.5
height = 1.0
# 胶囊网格
[sub_resource type="CapsuleMesh" id="CapsuleMesh_001"]
radius = 0.5
height = 2.0
# 圆柱网格
[sub_resource type="CylinderMesh" id="CylinderMesh_001"]
top_radius = 0.5
bottom_radius = 0.5
height = 2.0
# 平面网格
[sub_resource type="PlaneMesh" id="PlaneMesh_001"]
size = Vector2(10, 10)
```
### 4.4 材质(内嵌)
```
[sub_resource type="StandardMaterial3D" id="Material_red"]
albedo_color = Color(1, 0, 0, 1)
roughness = 0.8
metallic = 0.2
# 发光材质
[sub_resource type="StandardMaterial3D" id="Material_glow"]
emission_enabled = true
emission = Color(1, 0.8, 0, 1)
emission_energy_multiplier = 2.0
```
---
## 五、节点声明 (node)
### 5.1 根节点
```
[node name="Player" type="CharacterBody3D"]
script = ExtResource("1_player_script")
```
### 5.2 子节点
```
[node name="ChildName" type="NodeType" parent="."]
property = value
```
| parent 值 | 含义 |
|-----------|------|
| `.` | 直接子节点(父节点是根) |
| `ParentName` | 指定父节点名 |
| `Parent/Child` | 嵌套路径 |
### 5.3 引用资源
```
# 引用外部资源
script = ExtResource("1_player_script")
mesh = ExtResource("2_mesh")
# 引用内嵌资源
shape = SubResource("CapsuleShape3D_player")
mesh = SubResource("BoxMesh_001")
```
### 5.4 实例化场景
```
[node name="Enemy1" parent="Enemies" instance=ExtResource("4_enemy_scene")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, -10)
```
---
## 六、Transform 变换
### 6.1 Transform3D 格式
```
transform = Transform3D(bx.x, bx.y, bx.z, by.x, by.y, by.z, bz.x, bz.y, bz.z, ox, oy, oz)
```
| 参数 | 含义 |
|------|------|
| bx (1-3) | X 轴基向量 |
| by (4-6) | Y 轴基向量 |
| bz (7-9) | Z 轴基向量 |
| o (10-12) | 位置 (origin) |
### 6.2 常用变换
```
# 单位变换(默认位置)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
# 仅位置
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 2, -10)
# 位置 + 缩放 0.5
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 5, 2, -10)
# 绕 Y 轴旋转 90°(sin90=1, cos90=0)
transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
```
### 6.3 Transform2D 格式
```
transform = Transform2D(cos, sin, -sin, cos, x, y)
# 单位变换
transform = Transform2D(1, 0, 0, 1, 100, 200)
# 旋转 45° 位于 (100, 200)
transform = Transform2D(0.707, 0.707, -0.707, 0.707, 100, 200)
```
---
## 七、常用属性值格式
### 7.1 基础类型
```
# 布尔
visible = true
enabled = false
# 整数
health = 100
# 浮点
speed = 10.5
# 字符串
name = "Player"
```
### 7.2 向量
```
# Vector2
position = Vector2(100, 200)
size = Vector2(32, 32)
# Vector3
position = Vector3(0, 1.5, 0)
target_position = Vector3(0, 0, -100)
# Vector4
custom_data = Vector4(1, 2, 3, 4)
```
### 7.3 颜色
```
# Color(R, G, B, A) 范围 0.0-1.0
light_color = Color(1, 0.85, 0.3, 1)
albedo_color = Color(0.25, 0.25, 0.3, 1)
# 半透明
modulate = Color(1, 1, 1, 0.5)
```
### 7.4 数组
```
# PackedStringArray
config/features = PackedStringArray("4.6", "Forward Plus")
# PackedVector2Array
polygon = PackedVector2Array(0, 0, 100, 0, 100, 100, 0, 100)
# 普通数组
groups = ["enemy", "damageable"]
```
---
## 八、信号连接 (connection)
### 8.1 格式
```
[connection signal="signal_name" from="NodePath" to="TargetPath" method="method_name"]
```
### 8.2 示例
```
# 同级节点连接
[connection signal="timeout" from="ShootCooldown" to="." method="_on_shoot_cooldown_timeout"]
# 子节点连接到根
[connection signal="body_entered" from="HitArea" to="." method="_on_hit_area_body_entered"]
# 带 flags
[connection signal="pressed" from="Button" to="." method="_on_button_pressed" flags=1]
```
---
## 九、完整示例模板
### 9.1 3D 角色场景
```
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/player.gd" id="1_script"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_001"]
radius = 0.35
height = 1.8
[node name="Player" type="CharacterBody3D"]
script = ExtResource("1_script")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
shape = SubResource("CapsuleShape3D_001")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0)
fov = 75.0
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
```
### 9.2 2D 角色场景
```
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/player_2d.gd" id="1_script"]
[ext_resource type="Texture2D" path="res://sprites/player.png" id="2_texture"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_001"]
size = Vector2(32, 48)
[node name="Player" type="CharacterBody2D"]
script = ExtResource("1_script")
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("2_texture")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_001")
```
### 9.3 UI 场景
```
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://scripts/hud.gd" id="1_script"]
[node name="HUD" type="CanvasLayer"]
script = ExtResource("1_script")
[node name="MarginContainer" type="MarginContainer" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 20.0
offset_top = 20.0
offset_right = -20.0
offset_bottom = -20.0
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
layout_mode = 2
[node name="ScoreLabel" type="Label" parent="MarginContainer/VBoxContainer"]
layout_mode = 2
text = "Score: 0"
[node name="TimeLabel" type="Label" parent="MarginContainer/VBoxContainer"]
layout_mode = 2
text = "Time: 60"
```
---
## 十、AI 操作指南
### 10.1 创建新场景
```python
# AI 直接使用 write_to_file
write_to_file("res://scenes/new_scene.tscn", """
[gd_scene load_steps=1 format=3]
[node name="Root" type="Node3D"]
""")
```
### 10.2 修改现有场景
```python
# 使用 replace_in_file 修改属性
replace_in_file("res://scenes/player.tscn",
old_str='fov = 75.0',
new_str='fov = 90.0'
)
```
### 10.3 添加节点
```python
# 在场景末尾添加节点(信号连接之前)
replace_in_file("res://scenes/player.tscn",
old_str='[connection signal=',
new_str='''[node name="NewChild" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
[connection signal='''
)
```
### 10.4 常见错误排查
| 错误 | 原因 | 修复 |
|------|------|------|
| `load_steps` 不匹配 | 资源数计算错误 | 重新计算 ext + sub + 1 |
| `id not found` | 引用了不存在的资源 ID | 检查 ExtResource/SubResource ID |
| 场景无法加载 | parent 路径错误 | 检查节点层级关系 |
| 属性无效 | 类型拼写错误 | 查阅 Godot 文档确认属性名 |
---
## 十一、快速参考
### 常用节点类型
| 类别 | 3D | 2D |
|------|-----|-----|
| 基础 | Node3D | Node2D |
| 物理角色 | CharacterBody3D | CharacterBody2D |
| 刚体 | RigidBody3D | RigidBody2D |
| 静态体 | StaticBody3D | StaticBody2D |
| 碰撞形状 | CollisionShape3D | CollisionShape2D |
| 网格 | MeshInstance3D | - |
| 精灵 | - | Sprite2D |
| 相机 | Camera3D | Camera2D |
| 灯光 | DirectionalLight3D, OmniLight3D, SpotLight3D | PointLight2D, DirectionalLight2D |
### 常用 UI 节点
| 节点 | 用途 |
|------|------|
| Control | UI 基类 |
| CanvasLayer | UI 层 |
| Label | 文本 |
| Button | 按钮 |
| TextureRect | 图片 |
| ProgressBar | 进度条 |
| VBoxContainer / HBoxContainer | 布局容器 |
| MarginContainer | 边距容器 |
Files in this skill
- SKILL.md
- godot-tscn-format/SKILL.md
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.