シーンとシーンノード
シーン
シーンはゲーム内の何か — ステージ、メニュー、キャラクター、UI 画面 — を表すノードのツリーです。シーンは Assets/ 内の任意の場所に .prefab ファイルとして保存されます:
Assets/
scene-01.prefab ← 新規プロジェクトのスタートシーン
Levels/
forest.prefab
Enemies/
grunt.prefab
スタートアップシーンはゲーム開始時に最初に読み込まれるシーンです。プロジェクトの Player Settings で設定します。
シーンは Assets パネルで作成します:フォルダーを右クリック → New → Scene。シーンをダブルクリックすると開き、開いたシーンにはそれぞれウィンドウ上部にタブができます。
ノード
ノードはシーンの 1 つの要素です。ノードはツリーを構成します。各ノードには親が 1 つと任意の数の子があり、親を変換すると子も変換されます。
Main Scene
├── Camera
├── Sun
├── Ground
│ ├── Tree (Ground と一緒に動く)
│ └── Rock
└── Player
└── Weapon
すべてのノードは Transform — 位置、回転(度単位のオイラー角、内部ではクォータニオン)、スケール — を持ちます。空のノードも、出現位置、回転の中心、他のノードをまとめる親として役立ちます。
Studio でのノード操作
Scene Tree パネルでは:
- ノードをクリックして選択します。Inspector に Transform とコンポーネントが表示されます。
- 右クリックで New Node、New Child Node、Rename、Delete、Copy、Paste。
- F2 で名前変更、Delete で削除、D で選択ノードを複製します。
- Assets パネルからスクリプトをノードにドラッグすると、そのコンポーネントが追加されます。
Scene ビューでは、ノードを選んで Move (W)、Rotate (E)、Scale (R) ツールを使います。F で選択対象にフレーミングします。ギズモ を参照してください。
Ctrl+S で保存します(開いているすべてのドキュメントを保存するには Ctrl+Shift+S)。
コードでのノード
public override void OnStart()
{
var node = Node!; // このコンポーネントのノード
node.Name = "Player";
node.Transform.Position = new Vector3(0, 1, 0);
foreach (var child in node.Children) // 直接の子
child.IsActive = true;
var light = node.GetComponent<LightComponent>(); // なければ null
foreach (var mesh in node.GetComponentsInChildren<ModelComponent>())
mesh.IsActive = false;
}
実行時に新しいオブジェクトを生成するには、プレハブをインスタンス化します — シーンのインスタンス化 を参照してください。
ディスク上のシーンファイル
.prefab ファイルはノードツリー全体を読みやすく差分を取りやすい JSON で保存します。各オブジェクトには C# の型の安定した id である __TypeId があり、クラス名や名前空間を変えてもシーンは壊れません:
{
"__TypeId": "a3000000-0000-4000-8000-000000000002",
"IsActive": true,
"Name": "Main Scene",
"Children": [
{
"__TypeId": "a3000000-0000-4000-8000-000000000002",
"IsActive": true,
"Name": "Camera",
"Children": [],
"Components": [
{ "__TypeId": "a3000001-0000-4000-8000-000000000001", "FieldOfViewDegrees": 60, "NearPlane": 0.01, "FarPlane": 100 }
],
"Transform": {
"Position": { "X": 0, "Y": 2, "Z": -6 },
"Orientation": { "X": 0, "Y": 0, "Z": 0, "W": 1 },
"Scale": { "X": 1, "Y": 1, "Z": 1 }
},
"Id": "e0224d28-0849-45fc-a09c-ba8645113a9e"
}
],
"Components": [],
"Id": "7d1f4c2a-…"
}
シーンファイルを手で編集する必要はほとんどありませんが、この形式なら Git での変更確認やマージの競合解決が簡単です。