This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
コンポーネント(component)は、ゲームオブジェクト(game object)に特定の表現や機能を与えるために使用します。コンポーネントはゲームオブジェクト内に含まれている必要があり、コンポーネントを含むゲームオブジェクトの位置、回転、スケールの影響を受けます:

多くのコンポーネントには、操作できる種類固有のプロパティがあります。また、実行時にコンポーネントを操作するための、種類ごとの関数が用意されています:
-- disable the can "body" sprite
msg.post("can#body", "disable")
-- play "hoohoo" sound on "bean" in 1 second
sound.play("bean#hoohoo", { delay = 1, gain = 0.5 } )
コンポーネントは、ゲームオブジェクト内にその場で追加(in-place)するか、コンポーネントファイルへの参照としてゲームオブジェクトに追加します:
Outline ビューでゲームオブジェクトを 右クリック し、Add Component(その場で追加)または Add Component File(ファイルへの参照として追加)を選択します。
ほとんどの場合、コンポーネントはその場で作成するのが最も適しています。ただし、次の種類のコンポーネントは、ゲームオブジェクトに参照として追加する前に、別のリソースファイルで作成する必要があります:
Defold は、以下の種類のコンポーネント(component)をサポートしています。
拡張機能を使用して、さらにコンポーネントを追加できます。
ゲームオブジェクトのコンポーネントは、そのゲームオブジェクトの作成時に有効になります。コンポーネントを無効にするには、そのコンポーネントに disable メッセージを送信します。
-- disable the component with id 'weapon' on the same game object as this script
msg.post("#weapon", "disable")
-- disable the component with id 'shield' on the 'enemy' game object
msg.post("enemy#shield", "disable")
-- disable all components on the current game object
msg.post(".", "disable")
-- disable all components on the 'enemy' game object
msg.post("enemy", "disable")
コンポーネントを再び有効にするには、そのコンポーネントに enable メッセージを送信します。
-- enable the component with id 'weapon'
msg.post("#weapon", "enable")
Defold のコンポーネントは、種類ごとに異なるプロパティを持っています。エディターの Properties ペイン には、Outline ペイン で現在選択しているコンポーネントのプロパティが表示されます。使用できるコンポーネントのプロパティについて詳しくは、各種類のコンポーネントのマニュアルを参照してください。
表示用のコンポーネントには、通常、位置と回転のプロパティがあり、多くの場合はスケールのプロパティもあります。これらのプロパティはエディターから変更できますが、ほとんどの場合、実行時には変更できません(唯一の例外はスプライトとラベルのコンポーネントのスケールで、実行時に変更できます)。
コンポーネントの位置、回転、スケールを実行時に変更する必要がある場合は、そのコンポーネントが属するゲームオブジェクトの位置、回転、スケールを変更します。その結果、ゲームオブジェクト上のすべてのコンポーネントに影響が及びます。ゲームオブジェクトにアタッチされている複数のコンポーネントのうち、1つだけを操作したい場合は、対象のコンポーネントを別のゲームオブジェクトに移動し、そのゲームオブジェクトを、コンポーネントが元々属していたゲームオブジェクトの子として追加することをお勧めします。
表示用のコンポーネントの描画順序は、次の2つによって決まります。
各コンポーネントにはマテリアル(material)が割り当てられ、各マテリアルには1つ以上のタグがあります。一方、レンダースクリプト(render script)では、1つ以上のマテリアルタグにそれぞれ一致する、いくつかのレンダー述語(render predicate)を定義します。レンダースクリプトの update() 関数では、述語を1つずつ描画し、各述語で定義されているタグに一致するコンポーネントを描画します。デフォルトのレンダースクリプトは、まず1つのパスでスプライトとタイルマップを描画し、次に別のパスでパーティクルエフェクトを描画します。どちらもワールド空間で描画されます。その後、レンダースクリプトは別のパスで GUI コンポーネントをスクリーン空間に描画します。
すべてのゲームオブジェクトとコンポーネントは3D 空間に配置され、その位置は vector3 オブジェクトで表されます。ゲームのグラフィックスを2D で表示する場合、X 値と Y 値は「幅」と「高さ」の軸に沿ったオブジェクトの位置を決め、Z 位置は「奥行き」の軸に沿った位置を決めます。Z 位置を使うと、重なり合うオブジェクトの見え方を制御できます。Z 値が1のスプライトは、Z 位置が0のスプライトより手前に表示されます。デフォルトでは、Defold は Z 値に -1 から1までを使用できる座標系を使います。

レンダー述語に一致するコンポーネントはまとめて描画され、描画される順序はコンポーネントの最終的な Z 値によって決まります。コンポーネントの最終的な Z 値は、コンポーネント自身の Z 値、それが属するゲームオブジェクトの Z 値、すべての親ゲームオブジェクトの Z 値を合計したものです。
複数の GUI コンポーネントの描画順序は、GUI コンポーネントの Z 値では 決まりません。GUI コンポーネントの描画順序は、gui.set_render_order() 関数で制御します。
例: A と B の2つのゲームオブジェクトがあります。B は A の子です。B にはスプライトコンポーネントがあります。
| 対象 | Z 値 |
|---|---|
| A | 2 |
| B | 1 |
| B#sprite | 0.5 |

上記の階層では、B 上のスプライトコンポーネントの最終的な Z 値は 2 + 1 + 0.5 = 3.5 です。
2つのコンポーネントの Z 値が完全に同じ場合、順序は未定義です。コンポーネントの前後関係が交互に切り替わってちらついたり、プラットフォームによって描画順序が異なったりする可能性があります。
レンダースクリプトでは、Z 値に対するニアクリップ面とファークリップ面を定義します。Z 値がこの範囲外にあるコンポーネントは描画されません。デフォルトの範囲は -1 から1ですが、簡単に変更できます。ニアとファーの限界値が -1 と1の場合、Z 値の数値精度は非常に高くなります。3D アセットを扱う際には、カスタムレンダースクリプトでデフォルトの投影のニアとファーの限界値を変更する必要がある場合があります。詳しくは、レンダリングのマニュアルを参照してください。
game.project 設定ファイルには、特定のリソース(resource)が同時に存在できる最大数を指定する値が数多くあります。この数は、読み込まれたコレクション(collection、ワールドとも呼ばれます)ごとに数えられることがよくあります。Defold エンジンはこれらの最大値を使用して、その数に応じたメモリを事前に割り当て、ゲームの実行中に動的な割り当てやメモリの断片化が起きるのを防ぎます。
Defold でコンポーネント(component)やその他のリソースを表すデータ構造は、メモリ使用量をできるだけ少なくするように最適化されています。それでも、実際に必要な量を超えるメモリを割り当てないように、値を設定する際には注意が必要です。
メモリ使用量をさらに最適化するため、Defold のビルド処理ではゲームの内容を解析し、正確な数を確実に把握できる場合は最大数を上書きします。