Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

TSCN 파일 형식

TSCN(텍스트 씬) 파일 형식은 Godot 내부의 단일 씬 트리를 나타냅니다. 바이너리 SCN 파일과 달리 TSCN 파일은 대부분 사람이 읽을 수 있고 버전 제어 시스템에서 관리하기 쉽다는 장점이 있습니다.

ESCN(내보낸 씬) 파일 형식은 TSCN 파일 형식과 동일하지만, 파일이 다른 프로그램에서 내보낸 파일이고 Godot 내에서 사용자가 편집해서는 안 된다는 것을 Godot에 나타내는 데 사용됩니다. SCN 및 TSCN 파일과 달리 가져오는 동안 ESCN 파일은 .godot/imported/ 폴더 내에 저장된 이진 SCN 파일로 컴파일됩니다. 바이너리 형식은 텍스트 기반 형식에 비해 로드 속도가 빠르기 때문에 데이터 크기가 줄어들고 로드 속도가 빨라집니다.

파일을 더 압축하기 위해 기본값과 동일한 속성은 씬/resource 파일에 저장되지 않습니다. 수동으로 작성할 수도 있지만 파일을 저장할 때 삭제됩니다.

완전한 설명을 찾는 사람들을 위해 구문 분석은 ResourceFormatLoaderText 클래스의 resource_format_text.cpp 파일에서 처리됩니다.

참고

씬 및 리소스 파일 형식은 증분 정수 ID를 대체하기 위해 문자열 기반 UID가 도입되면서 Godot 4에서 크게 변경되었습니다.

메시, 스켈레톤 및 애니메이션 데이터도 Godot 3와 다르게 저장됩니다. 이 문서에서 일부 변경 사항에 대해 읽을 수 있습니다: `4.0 <https://godotengine.org/article/animation-data-redesign-40/>`__에 대한 애니메이션 데이터 재작업

Godot 4.x로 저장된 장면과 리소스에는 헤더에 ``format=3``가 포함되어 있는 반면, Godot 3.x는 대신 ``format=2``를 사용합니다.

파일 구조

TSCN 파일에는 5개의 주요 섹션이 있습니다.

  1. 필터 스크립트

  2. 외부 리소스

  3. 내부 자원

  4. 노드

  5. 연결(Connections)

The file descriptor looks like [gd_scene format=3 uid="uid://cecaux1sm7mo0"] and should be the first entry in the file. Note that scenes saved before Godot 4.6 will also have a load_steps=<int> attribute in the file descriptor. This attribute is now deprecated and should be ignored if present.

uid``는 씬을 나타내는 고유한 문자열 기반 식별자입니다. 이는 편집기가 닫혀 있는 동안에도 엔진에서 이동되는 파일을 추적하는 사용됩니다. 스크립트는 파일 시스템 경로에 의존하지 않도록 ``uid:// 경로 접두사를 사용하여 UID 기반 리소스를 로드할 수도 있습니다. 이를 통해 프로젝트에서 파일 주위를 이동할 수 있지만 스크립트를 수정하지 않고도 스크립트에서 해당 파일을 계속 로드할 수 있습니다. Godot는 ID를 추적하기 위해 외부 파일을 사용하지 않습니다. 이는 프로젝트 내에서 중앙 메타데이터 저장 위치가 필요하지 않음을 의미합니다. 자세한 내용은 `이 끌어오기 요청 <https://github.com/godotengine/godot/pull/50786>`__을 참조하세요.

이러한 섹션은 순서대로 나타나야 하지만 구별하기 어려울 수 있습니다. 이들 간의 유일한 차이점은 섹션의 모든 항목에 대한 제목의 첫 번째 요소입니다. 예를 들어 모든 외부 리소스의 제목은 ``[ext_resource ...]``로 시작해야 합니다.

TSCN 파일에는 세미콜론(;)으로 시작하는 한 줄 주석이 포함될 수 있습니다. 그러나 Godot 편집기를 사용하여 파일을 저장할 때 주석은 삭제됩니다. TSCN 파일 내의 공백은 중요하지 않지만(문자열 내 제외) 파일을 저장할 때 불필요한 공백은 삭제됩니다.

파일 내부 항목

제목은 ``[<resource_type> key1=value1 key2=value2 key3=value3 ...]``와 유사하며 여기서 resources_type은 다음 중 하나입니다.

  • ext_resource

  • sub_resource

  • 그룹 노드

  • 연결(Connections)

모든 제목 아래에는 0개 이상의 key = value 쌍이 옵니다. 값은 배열, 변환, 색상 등과 같은 복잡한 데이터 유형일 수 있습니다. 예를 들어 Node3D는 다음과 같습니다.

[node name="Cube" type="Node3D" unique_id=224283918]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 2, 3)

씬 트리

The scene tree is made up of… nodes! The heading of each node consists of its name, parent, a unique ID (used to track nodes even if they are moved or renamed), and most of the time, a type. For example: [node name="PlayerCamera" type="Camera" parent="Player/Head" unique_id=1697057368]

Note that unique_id is only present in scenes saved with Godot 4.6 or later. Therefore, it is not guaranteed to be present.

기타 유효한 키워드는 다음과 같습니다.

  • inst2dict

  • is_instance_valid(obj)

  • Center

  • ``index``(트리에 나타나는 순서를 설정합니다. 없는 경우 상속된 노드가 일반 항목보다 우선합니다.)

  • 그룹 노드

  • node_paths (lists names of properties exported as a Node type, but referenced as a NodePath in the file)

파일의 첫 번째 노드(또한 씬 루트이기도 함)의 머리글에 parent="Path/To/Node" 항목이 있어서는 안 됩니다. 모든 씬 파일에는 정확히 *하나*의 씬 루트가 있어야 합니다. 그렇지 않으면 Godot는 파일을 가져오는 데 실패합니다. 다른 노드의 상위 경로는 절대 경로여야 하지만 씬 루트 이름을 포함해서는 안 됩니다. 노드가 씬 루트의 직계 하위인 경우 경로는 ``"."``여야 합니다. 다음은 씬 트리의 예입니다(그러나 노드 콘텐츠는 없음).

[node name="Player" type="Node3D" unique_id=1155673912]                    ; The scene root
[node name="Arm" type="Node3D" parent="." unique_id=1010797352]            ; Parented to the scene root
[node name="Hand" type="Node3D" parent="Arm" unique_id=536436825]          ; Child of "Arm"
[node name="Finger" type="Node3D" parent="Arm/Hand" unique_id=1732647084]  ; Child of "Hand"

파일 구조를 더 쉽게 파악하려면 특정 노드 또는 리소스를 사용하여 파일을 저장한 다음 외부 편집기에서 직접 검사할 수 있습니다. 또한 Godot 편집기에서 점진적인 변경을 수행할 수 있으며, 자동 다시 로드가 활성화된 .tscn 또는 .tres 파일에서 외부 텍스트 편집기를 열어두어 변경 사항을 확인할 수도 있습니다.

다음은 충돌이 있는 RigidBody3D 기반 공, 시각적 개체(메시 + 조명) 및 RigidBody3D의 상위 카메라를 포함하는 씬의 예입니다.

[gd_scene format=3 uid="uid://cecaux1sm7mo0"]

[sub_resource type="SphereShape3D" id="SphereShape3D_tj6p1"]

[sub_resource type="SphereMesh" id="SphereMesh_4w3ye"]

[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_k54se"]
albedo_color = Color(1, 0.639216, 0.309804, 1)

[node name="Ball" type="RigidBody3D" unique_id=1358867382]

[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1279975976]
shape = SubResource("SphereShape3D_tj6p1")

[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=558852834]
mesh = SubResource("SphereMesh_4w3ye")
surface_material_override/0 = SubResource("StandardMaterial3D_k54se")

[node name="OmniLight3D" type="OmniLight3D" parent="." unique_id=1581292810 node_paths=PackedStringArray("follow_node")]
light_color = Color(1, 0.698039, 0.321569, 1)
omni_range = 10.0
follow_node = NodePath("..")

[node name="Camera3D" type="Camera3D" parent="." unique_id=795715540]
transform = Transform3D(1, 0, 0, 0, 0.939693, 0.34202, 0, -0.34202, 0.939693, 0, 1, 3)

노드 경로

씬 전체를 표현하기에는 트리 구조만으로는 충분하지 않습니다. Godot는 NodePath(Path/To/Node) 구조를 사용하여 다른 노드 또는 씬 트리의 노드 속성을 참조합니다. 경로는 현재 노드를 기준으로 하며, ``NodePath(".")``는 현재 노드를 가리키고 ``NodePath("")``는 노드를 전혀 가리키지 않습니다.

예를 들어 MeshInstance3D는 ``NodePath()``를 사용하여 골격을 가리킵니다. 마찬가지로 애니메이션 트랙은 ``NodePath()``를 사용하여 애니메이션할 노드 속성을 가리킵니다.

NodePath는 :property_name 접미사를 사용하여 속성을 가리킬 수도 있고 벡터, 변환 및 색상 유형에 대한 특정 구성 요소를 가리킬 수도 있습니다. 이는 애니메이션 리소스에서 애니메이션할 특정 속성을 가리키는 데 사용됩니다. 예를 들어, NodePath("MeshInstance3D:scale.x")``는 MeshInstance3D에 있는 ``scale Vector3 속성의 x 구성 요소를 가리킵니다.

예를 들어 mesh``라는 MeshInstance3D 노드의 ``skeleton 속성은 상위 ``Armature01``를 가리킵니다.

[node name="mesh" type="MeshInstance3D" parent="Armature01" unique_id=1638249225]
skeleton = NodePath("..")

스켈레톤

Skeleton3D 노드는 Node3D 노드를 상속하지만 bones/<id>/<attribute> = value 형식의 키-값 쌍으로 설명된 뼈대 목록을 가질 수도 있습니다. 뼈대 속성은 다음과 같이 구성됩니다.

  • position: 벡터3

  • Rotation

  • scale: 벡터3

이러한 속성은 모두 선택 사항입니다. 예를 들어 뼈대는 다른 속성을 정의하지 않고 position 또는 ``rotation``만 정의할 수 있습니다.

어떻게 작동하는 지의 예제입니다:

[node name="Skeleton3D" type="Skeleton3D" parent="PlayerModel/Robot_Skeleton" index="0" unique_id=542985694]
bones/1/position = Vector3(0.114471, 2.19771, -0.197845)
bones/1/rotation = Quaternion(0.191422, -0.0471201, -0.00831942, 0.980341)
bones/2/position = Vector3(-2.59096e-05, 0.236002, 0.000347473)
bones/2/rotation = Quaternion(-0.0580488, 0.0310587, -0.0085914, 0.997794)
bones/2/scale = Vector3(0.9276, 0.9276, 0.9276)

BoneAttachment3D

BoneAttachment3D 노드는 일부 노드가 스켈레톤 노드의 단일 뼈의 부모가 되는 것을 설명하기 위한 중간 노드입니다. BoneAttachment에는 bone_name = "name of bone" 속성과 일치하는 뼈대 인덱스에 대한 속성이 있습니다.

스켈레톤의 뼈대를 부모로 하는 Marker3D 노드의 예:

[node name="GunBone" type="BoneAttachment3D" parent="PlayerModel/Robot_Skeleton/Skeleton3D" index="5" unique_id=63481392]
transform = Transform3D(0.333531, 0.128981, -0.933896, 0.567174, 0.763886, 0.308015, 0.753209, -0.632331, 0.181604, -0.323915, 1.07098, 0.0497144)
bone_name = "hand.R"
bone_idx = 55

[node name="ShootFrom" type="Marker3D" parent="PlayerModel/Robot_Skeleton/Skeleton3D/GunBone" unique_id=679926736]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4, 0)

AnimationPlayer

AnimationPlayer 노드는 AnimationLibrary 리소스에 저장된 하나 이상의 애니메이션 라이브러리와 함께 작동합니다. 애니메이션 라이브러리는 here <doc_tscn_animation>`에 문서화된 구조를 지닌 개별 :ref:`class_Animation 리소스의 모음입니다.

애니메이션 자체와 애니메이션 라이브러리 간의 이러한 분할은 Godot 4에서 수행되었으므로 3D 애니메이션 소프트웨어의 일반적인 작업 흐름인 3D 메시와 별도로 애니메이션을 가져올 수 있습니다. 자세한 내용은 `원본 풀 요청 <https://github.com/godotengine/godot/pull/59980>`__을 참조하세요.

라이브러리 이름이 비어 있으면 이 AnimationPlayer에 대한 고유한 애니메이션 소스 역할을 합니다. 이를 통해 ``<animation_name>``를 직접 사용하여 스크립트에서 애니메이션을 재생할 수 있습니다. 라이브러리 이름을 지정하면 ``<library_name>/<animation_name>``로 재생해야 합니다. 이렇게 하면 이전 버전과의 호환성이 보장되고 여러 애니메이션 라이브러리를 사용하지 않으려는 경우 기존 작업 흐름이 유지됩니다.

리소스

리소스는 노드를 구성하는 구성 요소입니다. 예를 들어 MeshInstance3D 노드에는 함께 제공되는 ArrayMesh 리소스가 있습니다. ArrayMesh 리소스는 TSCN 파일의 내부 또는 외부에 있을 수 있습니다.

리소스에 대한 참조는 리소스 제목의 고유한 문자열 기반 ID로 처리됩니다. 이는 각 외부 리소스에도 있지만 하위 리소스에는 없는 uid 속성과 다릅니다.

External resources and internal resources are referred to with ExtResource("id") and SubResource("id"), respectively. Because there are different methods to refer to internal and external resources, you can have the same ID for both an internal and external resource.

예를 들어 [ext_resource type="Material" uid="uid://c4cp0al3ljsjv" path="res://material.tres" id="1_7bt6s"] 리소스를 참조하려면 ``ExtResource("1_7bt6s")``를 사용합니다.

외부 리소스

외부 리소스는 TSCN 파일 자체에 포함되지 않은 리소스에 대한 링크입니다. 외부 리소스는 경로, 유형, UID(파일 시스템 위치를 고유 식별자에 매핑하는 데 사용됨) 및 ID(씬 파일에서 리소스를 참조하는 데 사용됨)로 구성됩니다.

Godot는 항상 리소스 디렉토리에 상대적인 절대 경로를 생성하므로 ``res://``라는 접두사가 붙지만, TSCN 파일 위치에 상대적인 경로도 유효합니다.

외부 리소스의 예는 다음과 같습니다.

[ext_resource type="Texture2D" uid="uid://ccbm14ebjmpy1" path="res://gradient.tres" id="2_eorut"]
[ext_resource type="Material" uid="uid://c4cp0al3ljsjv" path="material.tres" id="1_7bt6s"]

TSCN 파일과 마찬가지로 TRES 파일에는 세미콜론(;)으로 시작하는 한 줄 주석이 포함될 수 있습니다. 그러나 Godot 편집기를 사용하여 리소스를 저장할 때 댓글은 삭제됩니다. TRES 파일 내의 공백은 중요하지 않지만(문자열 내 제외) 파일을 저장할 때 불필요한 공백은 삭제됩니다.

내부 자원

TSCN 파일에는 메쉬, 재료 및 기타 데이터가 포함될 수 있습니다. 이는 파일의 내부 리소스 섹션에 포함되어 있습니다. 내부 리소스의 제목은 경로가 없다는 점을 제외하면 외부 리소스의 제목과 유사합니다. 내부 리소스에도 각 제목 아래에 key=value 쌍이 있습니다. 예를 들어, 캡슐 충돌 모양은 다음과 같습니다:

[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_fdxgg"]
radius = 1.0
height = 3.0

일부 내부 리소스에는 다른 내부 리소스(예: 재질이 있는 메시)에 대한 링크가 포함되어 있습니다. 이 경우 참조 리소스는 참조 리소스 *앞*에 나타나야 합니다. 이는 파일의 내부 리소스 섹션에서 순서가 중요하다는 것을 의미합니다.

ArrayMesh

ArrayMesh는 _surfaces 배열에 포함된 여러 표면으로 구성됩니다(앞에 밑줄이 있음). 각 표면의 데이터는 다음 키를 사용하여 사전에 저장됩니다.

  • aabb: 가시성을 위해 계산된 축 정렬 경계 상자입니다.

  • attribute_data: 법선, 접선, 정점 색상, UV1, UV2 및 사용자 정의 정점 데이터와 같은 정점 속성 데이터입니다.

  • bone_aabbs: 가시성을 위해 각 뼈의 축 정렬 경계 상자입니다.

  • format: 표면의 버퍼 형식.

  • index_count: 표면의 인덱스 수입니다. 이는 ``index_data``의 크기와 일치해야 합니다.

  • index_data: ``vertex_data``에서 어떤 정점이 그려지는지 결정하는 인덱스 데이터입니다.

  • lods: 배열로 저장된 세부 수준 변형입니다. 각 LOD 레벨은 배열의 두 값을 나타냅니다. 첫 번째 값은 LOD 레벨이 가장 적합한 화면 공간의 비율(가장자리 길이)입니다. 두 번째 값은 지정된 LOD 레벨에 대해 그려야 하는 인덱스 목록입니다.

  • material: 표면을 그릴 때 사용되는 재료입니다.

  • name: 표면의 이름입니다. 이는 스크립트에서 사용할 수 있으며 3D DCC에서 가져옵니다.

  • primitive: Mesh.PrimitiveType Godot 열거형과 일치하는 표면의 기본 유형입니다. 0 = 점, 1 = 선, 2 = 선 스트립, 3 = 삼각형(가장 일반적), 4 = 삼각형 스트립.

  • skin_data: 뼈 무게 데이터.

  • vertex_count: 표면의 정점 수. 이는 ``vertex_data``의 크기와 일치해야 합니다.

  • vertex_data: 정점 위치 데이터입니다.

다음은 자체 .tres 파일에 저장된 ArrayMesh의 예입니다. 일부 필드는 간결성을 위해 ``...``로 단축되었습니다.

[gd_resource type="ArrayMesh" format=3 uid="uid://dww8o7hsqrhx5"]

[ext_resource type="Material" path="res://player/model/playerobot.tres" id="1_r3bjq"]

[resource]
resource_name = "player_Sphere_016"
_surfaces = [{
"aabb": AABB(-0.207928, 1.21409, -0.14545, 0.415856, 0.226569, 0.223374),
"attribute_data": PackedByteArray(63, 121, ..., 117, 63),
"bone_aabbs": [AABB(0, 0, 0, -1, -1, -1), ..., AABB(-0.207928, 1.21409, -0.14545, 0.134291, 0.226569, 0.223374)],
"format": 7191,
"index_count": 1224,
"index_data": PackedByteArray(30, 0, ..., 150, 4),
"lods": [0.0382013, PackedByteArray(33, 1, ..., 150, 4)],
"material": ExtResource("1_r3bjq"),
"name": "playerobot",
"primitive": 3,
"skin_data": PackedByteArray(15, 0, ..., 0, 0),
"vertex_count": 1250,
"vertex_data": PackedByteArray(196, 169, ..., 11, 38)
}]
blend_shape_mode = 0

애니메이션

HUD는 다음의 정보들을 보여줍니다:

  • length: 애니메이션의 길이(초)입니다. 키프레임은 [0; length] 간격 외부에 배치될 수 있지만 선택한 보간 모드에 따라 아무런 효과가 없을 수도 있습니다.

  • loop_mode: 0 = 루핑 없음, 1 = 랩 어라운드 루핑, 2 = 고정 루핑.

  • step: 편집기에서 이 애니메이션을 편집할 때 사용할 단계 크기입니다. 이는 편집기에서만 사용됩니다. 어떤 식으로든 애니메이션 재생에 영향을 주지 않습니다.

각 트랙은 tracks/<id>/<attribute> 형식의 키-값 쌍 목록으로 설명됩니다. 각 트랙에는 다음이 포함됩니다.

  • type: 트랙 유형입니다. 이는 이 트랙에 의해 애니메이션될 수 있는 속성의 종류와 편집기에서 사용자에게 표시되는 방법을 정의합니다. 유효한 유형은 value``(일반 속성 트랙), ``position_3d, rotation_3d, scale_3d, ``blend_shape``(최적화된 3D 애니메이션 트랙), ``method``(메서드 호출 트랙), ``bezier``(베지어 곡선 트랙)입니다. ``audio``(오디오 재생 트랙), ``animation``(다른 애니메이션을 재생하는 트랙).

  • imported: 트랙이 가져온 3D 씬에서 생성된 경우 true, Godot 편집기에서 사용자가 수동으로 생성했거나 스크립트를 사용하여 생성한 경우 ``false``입니다.

  • enabled: 트랙이 유효한 경우 true, 편집기에서 비활성화된 경우 ``false``입니다.

  • path: 트랙의 영향을 받는 노드 속성의 경로입니다. 속성은 : 구분 기호를 사용하여 노드 경로 뒤에 기록됩니다.

  • interp: 사용할 보간 모드입니다. 0 = 가장 가까운 각도, 1 = 선형, 2 = 3차 각도, 3 = 선형 각도, 4 = 3차 각도입니다.

  • loop_wrap: 애니메이션이 반복될 때 트랙이 순환하도록 설계된 경우 true, 트랙이 첫 번째/마지막 키프레임에 고정되는 경우 ``false``입니다.

  • keys: 애니메이션 트랙의 값. 이 속성의 구조는 ``type``에 따라 다릅니다.

다음은 일반 속성 트랙을 사용하여 시간이 지남에 따라 큐브를 축소하는 AnimationPlayer가 포함된 씬입니다. AnimationLibrary 작업 흐름이 사용되지 않았으므로 애니메이션 라이브러리의 이름이 비어 있습니다(그러나 애니메이션에는 여전히 scale_down 이름이 지정됩니다). 간결성을 위해 이 AnimationPlayer에서는 RESET 트랙이 생성되지 않았습니다.

[gd_scene format=3 uid="uid://cdyt3nktp6y6"]

[sub_resource type="Animation" id="Animation_r2qdp"]
resource_name = "scale_down"
length = 1.5
loop_mode = 2
step = 0.05
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Box:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(0, 0, 0)]
}

[sub_resource type="AnimationLibrary" id="AnimationLibrary_4qx36"]
_data = {
"scale_down": SubResource("Animation_r2qdp")
}

[sub_resource type="BoxMesh" id="BoxMesh_u688r"]

[node name="Node3D" type="Node3D" unique_id=2076735200]

[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=2139773137]
autoplay = "scale_down"
libraries = {
"": SubResource("AnimationLibrary_4qx36")
}

[node name="Box" type="MeshInstance3D" parent="." unique_id=711004519]
mesh = SubResource("BoxMesh_u688r")

일반 속성 value 트랙의 경우 keys``는 ``times``(PackedFloat32Array)에 위치가 있고 ``transitions``(PackedFloat32Array)에 값이 있고 ``values``(Array)에 값이 있는 3개의 배열이 포함된 사전입니다. ``0 = 연속, 1 = 이산, 2 = 캡처 값을 갖는 정수인 추가 update 속성이 있습니다.

다음은 3D 위치 및 3D 회전 트랙을 활용하는 두 번째 애니메이션 리소스입니다. 이 트랙(3D 스케일 트랙에 추가)은 Godot 3의 변환 트랙을 대체합니다. 빠른 재생에 최적화되어 있으며 선택적으로 압축할 수 있습니다.

이러한 최적화된 트랙 유형의 단점은 맞춤 여유 값을 사용할 수 없다는 것입니다. 대신 모든 키프레임은 선형 보간을 사용합니다. 즉, 트랙의 보간 모드를 변경하여 특정 트랙의 모든 키프레임에 대해 가장 가까운 보간 또는 3차 보간을 사용하도록 선택할 수 있습니다.

[sub_resource type="Animation" id="Animation_r2qdp"]
resource_name = "move_and_rotate"
length = 1.5
loop_mode = 2
step = 0.05
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Box")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1.5, 1, 1.5, 1, 0)
tracks/1/type = "rotation_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Box")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.211, -0.047, 0.211, 0.953, 1.5, 1, 0.005, 0.976, -0.216, 0.022)

3D 위치, 회전 및 배율 트랙의 경우 ``keys``는 모든 값이 시퀀스에 저장된 PackedFloat32Array입니다.

아래 시각적 가이드에서 T``는 애니메이션 시작 이후의 키프레임 시간(초)이고, ``E``는 키프레임의 전환입니다(현재는 항상 ``1). 3D 위치 및 배율 트랙의 경우 X, Y, Z``는 Vector3의 좌표입니다. 3D 회전 트랙의 경우 ``X, Y, Z``W``는 쿼터니언의 좌표입니다.

# For 3D position and scale, which use Vector3:
tracks/<id>/keys = PackedFloat32Array(T, E,   X, Y, Z,      T, E,   X, Y, Z, ...)

# For 3D rotation, which use Quaternion:
tracks/<id>/keys = PackedFloat32Array(T, E,   X, Y, Z, W,      T, E,   X, Y, Z, W, ...)