Godot エンジン 4.0 ドキュメント - マニュアル - 2D

この記事は Google 翻訳による英語翻訳の結果であり、これに DrGraph がいくつかの修正を加えたものです。英語のオリジナルページ:

2D — Godot Engine (安定版) 英語ドキュメント

キャンバスレイヤー¶

ビューポートとキャンバスのアイテム¶

CanvasItem は、 Node2DControlなどの通常の 2D ノードにかかわらず、すべての 2D ノードの基礎ですどちらもCanvasItemを継承しますキャンバスアイテムをツリー状に配置できます。各項目は親の変換を継承します。親が移動すると、その子も移動します。

CanvasItem ノードおよびそれらを継承するノードは、それらを表示するビューポートの直接的または間接的な子です。

ビューポートのプロパティ Viewport.canvas_transform を 使用すると、それに含まれる CanvasItem 階層にカスタムTransform2D変換を適用できます。Camera2Dのようなノードは、その変換を変更することで機能します。

スクロールなどの効果を実現するには、ルート キャンバス アイテムとシーン全体を移動するよりも、キャンバス変換プロパティを操作する方が効率的です。

しかし通常、ゲームやアプリケーション内のすべてがキャンバス変換の対象となることは望ましくありません。例えば:

  • パララックス背景: ステージの他の部分よりもゆっくりと動く背景。

  • UI : ゲームの世界観にユーザー インターフェイス (UI) またはヘッドアップ ディスプレイ (HUD) が重ね合わされたものを想像してください。ゲーム世界の見方が変わっても、ライフ カウンター、スコア表示、その他の要素が画面上の位置を維持できるようにしたいと考えています。

  • トランジション: トランジションの視覚効果 (フェード、ブレンド) を画面の固定位置に留めたい場合があります。

単一のシーン ツリーでこれらの問題を解決するにはどうすればよいでしょうか?

キャンバスレイヤー¶

答えはCanvasLayerです。これは、すべての子と孫に個別の 2D レンダリング レイヤーを追加するノードです。デフォルトでは、ビューポートの子はレイヤー「0」に描画されますが、CanvasLayer は任意の番号のレイヤーに描画されます。大きい番号のレイヤーは、小さい番号のレイヤーの上に描画されます。CanvasLayers には、他のレイヤーの変換に依存しない独自の変換もあります。これにより、ゲームの世界観が変化しても、UI は画面空間に固定されたままになります。

この例としては、視差のある背景の作成が挙げられます。これは、「-1」レイヤーの CanvasLayer で実行できます。スコア、ライフカウンター、一時停止ボタンを備えた画面も「1」レベルで作成できます。

以下にその様子を示します。

CanvasLayers はツリーの順序とは独立しており、レイヤー番号のみに依存するため、必要に応じてインスタンス化できます。

ノート

CanvasLayers は、ノードが描画される順序を制御する必要はありません。ノードが「前」または「後ろ」に正しく描画されることを確認する標準的な方法は、シーン パネル内のノードの順序を操作することです。おそらく直観に反するかもしれませんが、シーン ペインの最上位のノードは、ビューポート内で下位のノードの背後に描画されます。2D ノードには、描画順序を制御する CanvasItem.z_index プロパティもあります

ビューポートとキャンバスの変換¶

はじめに¶ _

これは、ノードがローカルで描画したものから画面に描画したものまでの 2D 変換の概要です。この概要では、エンジンの非常に低レベルの詳細について説明します。

キャンバス変換¶

前のチュートリアルCanvas レイヤーで説明したように、各 CanvasItem ノード (Node2D および Control ベースのノードは共通のルートとして CanvasItem を使用することを思い出してください) はCanvas Layerに存在します。各キャンバス レイヤーには、Transform2Dとしてアクセスできる変換 (移動、回転、スケーリングなど) があります。

前のチュートリアルでも紹介したように、ノードはデフォルトで組み込みキャンバスのレイヤー 0 に描画されます。ノードを異なるレイヤーに配置するには、 CanvasLayer ノードを使用できます。

グローバルキャンバス変換¶

ビューポートには Global Canvas 変換 (これも Transform2D ) があります。これはマスター変換であり、すべての個々のキャンバス レイヤ変換に影響します。一般に、この変換はあまり役に立ちませんが、Godot のエディタの CanvasItem Editor でのみ使用されます。

ストレッチ変換¶

最後に、ビューポートには、画面のサイズ変更またはストレッチ時に使用されるストレッチ変換があります。この変換は内部で使用されます ( 「 マルチ解像度」で説明されているように) が、ビューポートごとに手動で設定することもできます。

入力イベントはこの遷移を増幅しますが、上記の遷移はありません。InputEvent 座標をローカルの CanvasItem 座標に変換するために、 CanvasItem.make_input_local() 関数が便宜上追加されています。

変換順序¶

CanvasItem ローカル プロパティの座標を実際の画面座標にするには、次の一連の変換を適用する必要があります。

変換関数¶

各変換の取得は、次の関数で実現できます。

タイプ

変換

キャンバスプロジェクト

CanvasItem.get_global_transform()

キャンバスレイヤー

CanvasItem.get_canvas_transform()

CanvasLayer+GlobalCanvas+Stretch

CanvasItem.get_viewport_transform()

最後に、CanvasItem のローカル座標を画面座標に変換するには、次の順序で単純に乗算します。

GD スクリプト C#
var screen_coord = get_viewport_transform() * (get_global_transform() * local_pos)

ただし、通常は画面座標を使用したくないことに注意してください。推奨されるアプローチは、単純に Canvas 座標 ( ) を操作してCanvasItem.get_global_transform()、自動画面解像度調整が適切に機能するようにすることです。

カスタム入力イベントの提供¶

多くの場合、カスタム入力イベントをシーン ツリーにフィードすることが必要になります。上記の知識を備えた上で、これを正しく行うには、次のように進める必要があります。

GD スクリプト C#
var local_pos = Vector2(10, 20) # Control/Node2D に対してローカル
var ie = InputEventMouseButton.new() 
ie.button_index = MOUSE_BUTTON_LEFT 
ie.position = get_viewport_transform() * (get_global_transform() * local_pos) 
get_tree().input_event(ie )

2D ライトとシャドウ¶

はじめに¶ _

デフォルトでは、Godot の 2D シーンはシェーディングされておらず、目に見える光や影はありません。レンダリングは高速ですが、シェーディングされていないシーンは平坦に見えることがあります。Godot は、リアルタイム 2D ライティングとシャドウを使用する機能を提供し、プロジェクトの奥行き感を大幅に向上させることができます。

2D ライトもシャドウもありません。シーンには影がありません¶

2D ライトを有効にする (影なし)

2D ライトとシャドウを有効にする¶

ノード¶ _

完全な 2D ライティング セットアップには、いくつかのノードが含まれます。

  • CanvasModulate (シーンの残りの部分を暗くするため)

  • PointLight2D (全方向性またはスポット ライト用)

  • DirectionalLight2D (太陽光または月明かり用)

  • LightOccluder2D (光と影のキャスター用)

  • Sprite2D や TileMap など、ライティングを受け取るその他の 2D ノード。

CanvasModulate は、ベースの「アンビエント」カラーとして機能する色を指定することでシーンを暗くするために使用されます。これは、 2D ライトが到達できない領域の最終的な照明色です。CanvasModulate ノードがないと、2D ライトが既存のシェーディングされていない外観を照らすだけ (完全に照らされているように見える) ため、最終シーンは明るすぎるように見えます。

フレア、背景、シャドウキャスターのテクスチャ表示にはSprite2Dを使用します。

PointLight2D はシーンを照明するために使用されます。ライトの通常の動作方法は、選択したテクスチャをシーンの残りの部分に追加して照明をシミュレートすることです。

LightOccluder2D は、シーンのどの部分が影を落とすかをシェーダーに伝えるために使用されます。これらのオクルーダーは、スタンドアロン ノードとして、または TileMap ノードの一部として配置できます。

シャドウは PointLight2D によってカバーされる領域にのみ表示され、その方向はLightの中心に基づきます 。

ノート

背景色には照明が当たりません。光線を背景に当てたい場合は、Sprite2D などの背景の視覚的表現を追加する必要があります。

Sprite2D の領域プロパティは、繰り返しの背景テクスチャをすばやく作成するのに役立ちますが、 Sprite2D のプロパティで[テクスチャ] > [繰り返し]を [有効] に設定する ことも忘れないでください

ポイントライト¶

ポイント ライト (ポジション ライトとも呼ばれる) は、2D ライティングで最も一般的な要素です。ポイント ライトは、たいまつ、火、発射物などからの光を表現するために使用できます。

PointLight2D には、インスペクターで調整できる次のプロパティが用意されています。

  • テクスチャ:光源として使用されるテクスチャ。テクスチャのサイズによってライトのサイズが決まります。テクスチャにはアルファ チャネルがある場合があります。これは、 Light2D のミックス ブレンド モードを使用する場合に便利ですが、追加(デフォルト) または減算ブレンド モードを使用する場合には必要ありません。

  • オフセット:ライト テクスチャのオフセット。ライト ノードの移動とは異なり、オフセットを変更してもシャドウは移動しません。

  • Texture Scale:ライトのサイズの乗数。値を大きくすると、光がより遠くまで広がります。ライトが大きいほど、画面上のより多くのピクセルに影響を与えるため、パフォーマンス コストが高くなります。そのため、ライトのサイズを増やす前にこの点を考慮してください。

  • 高さ:法線マップに対するライトの仮想高さ。デフォルトでは、光線は光線を受けるサーフェスの非常に近くに配置されます。これにより、法線マップを使用する場合、照明がほとんど見えなくなるため、この値を増やすことを検討してください。ライトの高さを調整すると、法線マップを使用したサーフェスにのみ顕著な違いが生じます。

ライトで使用する事前に作成されたテクスチャがない場合は、この「ニュートラル」ポイント ライト テクスチャを使用できます (右クリック > 名前を付けて画像を保存... )。

ニュートラルライトテクスチャ¶

別のフォールオフが必要な場合は、ライトの Texture プロパティにNew GradientTexture2D を割り当てることで、手順的にテクスチャを作成できます。リソースを作成した後、その[塗りつぶし]セクションを展開し、塗りつぶしモードを[放射状]に設定します。次に、不透明な白から透明な白に向かってグラデーション自体を調整し、開始位置を中心に移動する必要があります。

指向性ライト¶

Godot 4.0 の新機能は、2D で指向性ライティングを行う機能です。指向性照明は、太陽光や月明かりを表現するために使用されます。光線は、あたかも太陽や月が光線を受ける表面から無限に遠く離れているかのように、互いに平行に投影されます。

DirectionalLight2D は次のプロパティを提供します。

  • 高さ:法線マップに対するライトの仮想高さ ( 0.0 = サーフェスに平行、1.0= サーフェスに垂直)。デフォルトでは、光線は光線を受けるサーフェスと正確に平行になります。これにより、法線マップを使用する場合、照明がほとんど見えなくなるため、この値を増やすことを検討してください。ライトの高さを調整すると、法線マップを使用してサーフェスに視覚的な違いが生じるだけです。高さは影の外観には影響しません。

  • 最大距離:シャドウをカリングする前の、オブジェクトとカメラの中心にあるオブジェクト間の最大距離 (ピクセル単位)。この値を減らすと、カメラの外側のオブジェクトが影を落とすのを防ぎます (同時にパフォーマンスも向上します)。Max Distanceでは Camera2D スケーリングが考慮されていません。つまり、ズーム値が高くなると、特定の点にズームしたときに影がより早くフェードアウトするように見えます。

ノート

指向性シャドウは、 Heightプロパティの値に関係なく、常に無限に長く表示されます。これは、Godot で 2D ライトに使用されるシャドウ レンダリング方法の制限です。

無限に長くない指向性シャドウを取得するには、DirectionalLight2D でシャドウを無効にし、代わりに 2D 符号付き距離フィールドから読み取るカスタム シェーダーを使用する必要があります。この距離フィールドは、シーン内に存在する LightOccluder2D ノードから自動的に生成されます。

一般的なライトのプロパティ¶

PointLight2D と DirectionalLight2D は両方とも、Light2D 基本クラスの一部であるパブリック プロパティを提供します。

  • 有効:ライトの可視性を切り替えることができます。ライト ノードを非表示にする場合とは異なり、このプロパティを無効にしてもライトの子ノードは非表示になりません。

  • エディターのみ:有効にすると、ライトはエディター内でのみ表示されます。実行中のプロジェクトでは自動的に無効になります。

  • 色:光の色。

  • エネルギー:光の強度乗数。値が大きいほど明るい光が生成されます。

  • ブレンド モード:ライトの計算に使用されるブレンド式。デフォルトの 追加は、ほとんどのユースケースに適しています。減算は負の光に使用でき、物理的に正確ではありませんが、特殊効果に役立ちます。ミックス ブレンド モードでは、ライト テクスチャに対応するピクセル値とその下のピクセル値が線形補間によって混合されます

  • 範囲 > Z 最小:光の影響を受ける最も低い Z インデックス。

  • Range > Z Max:光の影響を受ける最高の Z インデックス。

  • Range > Layer Min:光の影響を受ける最下位の視覚レイヤー。

  • Range > Layer Max:光の影響を受ける最も高い視覚レイヤー。

  • [範囲] > [アイテム カリング マスク]:可視レイヤーのオクルーダー ライト マスクが有効になっている他のノードに応じて、どのノードがこのノードからライトを受け取るかを制御しますこれは、特定のオブジェクトが光を受けないようにするために使用できます。

影の設定¶

PointLight2D ノードまたは DirectionalLight2D ノードでShadow > Enabledプロパティを有効にすると、最初は視覚的な違いは見られません。これは、シーン内のノードにシャドウ キャストの基礎として使用されるオクルーダーがまだないためです。

シーンに影を表示するには、LightOccluder2D ノードをシーンに追加する必要があります。これらのノードには、スプライトの輪郭に一致するように設計されたオクルージョン ポリゴンも必要です。

ポリゴン リソース (視覚効果を持たせるように設定する必要がある) に加えて、LightOccluder2D ノードには 2 つのプロパティがあります。

  • SDF Collision:有効にすると、オクルーダーはリアルタイムで生成される符号付き距離フィールドの一部となり、カスタム シェーダーで使用できます。この SDF から読み取るカスタム シェーダを使用しない場合、これを有効にしても視覚的な違いはなく、パフォーマンスのコストもかからないため、便宜上デフォルトで有効になっています。

  • Occluder Light Mask: これは、 PointLight2D および DirectionalLight2D のShadow > Items Cull Maskプロパティと組み合わせて使用​​され、ライトごとにどのオブジェクトがシャドウを投影するかを制御します。これは、特定のオブジェクトが影を落とすのを防ぐために使用できます。

シェーダを作成するには 2 つの方法があります。

シェーダを自動生成する¶

オクルーダーは、ノードを選択し、2D エディターの上部にある Sprite2D メニューをクリックし [Create LightOccluder2D Sibling]を選択することで、Sprite2D ノードから自動的に作成できます。

表示されるダイアログでは、スプライトの端がアウトラインで囲まれます。アウトラインがスプライトのエッジにぴったり一致する場合は、「OK」をクリックします。アウトラインがスプライトのエッジから遠すぎる(または「侵食」されている)場合は、 [拡大 (ピクセル)][縮小 (ピクセル)]を調整して、[プレビューの更新]をクリックします。満足のいく結果が得られるまでこれを繰り返します。

シェーダを手動で描画する¶

LightOccluder2D ノードを作成し、それを選択して 2D エディターの上部にある「+」ボタンをクリックします。ポリゴン リソースを作成するように求められたら、  「はい」と答えます。その後、クリックして新しい点を作成し、オクルージョン ポリゴンの描画を開始できます。既存の点を右クリックして削除することも、既存の線をクリックしてドラッグすることで新しい点を作成することもできます。

シャドウが有効になっている 2D ライトでは、次のプロパティを調整できます。

  • 色:影付きの領域の色。デフォルトでは、影の領域は完全に黒ですが、これは芸術的な目的で変更できます。カラーのアルファ チャネルは、指定したカラーによって影がどの程度着色されるかを制御します。

  • フィルター:影のフィルター モード。デフォルトのNoneはレンダリングが最も速く、(「ブロック状の」ビジュアルのため) ピクセル アートの美学を持つゲームに最適です。ソフト シャドウが必要な場合は、代わりにPCF5を使用してください 。PCF13はよりソフトですが、レンダリングに最も要求が厳しいです。レンダリング コストが高いため、PCF13 は一度に数個のライトにしか使用できません。

  • Filter Smooth: Filter がPCF5またはPCF13に設定されている場合に、シャドウに適用されるソフト化の程度を制御します。値を高くするとソフトなシャドウが生成されますが、目に見えるバンディングアーティファクトが発生する可能性があります(特にPCF5を使用する場合)。

  • アイテム カル マスク:それぞれのオクルーダー ライト マスクプロパティに応じて、どの LightOccluder2D ノードがシャドウをキャストするかを制御します。

ハードシャドウ¶

ソフトシャドウ (PCF13、フィルタースムーズ 1.5)

フィルター スムーズが高すぎることが原因で縞模様のアーティファクトが発生するソフト シャドウ (PCF5、フィルター スムーズ 4)

オクルーダーの描画順序¶

LightOccluder2D は通常の 2D 描画順序に従います。これは、オクルーダーがスプライト自体を遮るかどうかを制御する方法であるため、2D ライティングにとって重要です。

LightOccluder2D ノードがスプライトの兄弟である場合、オクルーダーは、シーン ツリーのスプライトの下に配置されたときにスプライト自体をオクルードします。

LightOccluder2D ノードがスプライトのの場合、 LightOccluder2D ノードで「親の後ろに表示」 (デフォルト) が無効になって いると、オクルーダーはスプライト自体を隠します。

ノーマルマップとスペキュラーマップ¶

法線マップと鏡面反射マップは、2D 照明における奥行きの知覚を大幅に向上させることができます。これらが 3D レンダリングでどのように機能するかと同様に、法線マップは、サーフェスが光を受け取る方向 (ピクセルごと) に基づいて強度を変更することにより、照明の平坦度を下げるのに役立ちます。鏡面反射光マップは、光の一部を観察者に反射することで、視覚効果をさらに向上させるのに役立ちます。

PointLight2D と DirectionalLight2D はどちらも法線マップと鏡面反射光マップをサポートしています。Godot 4.0 以降では、法線マップと鏡面反射光マップを、Node2D または Control から継承するノードを含む任意の 2D 要素に割り当てることができます。

法線マップは、各ピクセルが「指している」方向を表します。次に、エンジンはこの情報を使用して、物理的に妥当な方法で 2D サーフェスに照明を正しく適用します。法線マップは通常、手描きの高さマップから作成されますが、他のテクスチャから自動的に生成することもできます。

鏡面反射光マップは、ピクセルごとにどれだけの光が反射されるべきか (鏡面反射光マップに色が含まれている場合はどの色で反射されるか) を定義します。値を明るくすると、テクスチャ上の特定の点で明るい反射が生成されます。スペキュラー マップは通常、拡散テクスチャをベースとして使用し、手動編集によって作成されます。

ヒント

スプライトに法線マップまたは鏡面反射光マップがない場合は、無料のオープンソースLaigter ツールを使用してそれらを生成できます。

2D ノードに法線マップや鏡面反射光マップを設定するには、ノードのテクスチャをペイントするプロパティ用の新しい CanvasTexture リソースを作成します。たとえば、Sprite2D では次のようになります。

Sprite2Dノード用のCanvasTextureリソースの作成¶

新しく作成したリソースを展開します。調整するプロパティがいくつかあります。

  • 拡散 > テクスチャ:ベースカラーのテクスチャ。このプロパティでは、スプライト自体に使用しているテクスチャを読み込みます。

  • 法線マップ > テクスチャ:法線マップのテクスチャです。このプロパティでは、ハイトマップから生成した法線マップ テクスチャを読み込みます (上記のヒントを参照)。

  • Specular > Texture: Specular マップ テクスチャ。拡散テクスチャ上の各ピクセルのスペキュラ強度を制御します。鏡面反射マップは通常グレースケールですが、それに応じて反射色を増やすための色を含めることもできます。このプロパティで、作成したスペキュラー マップ テクスチャをロードします (上記のヒントを参照)。

  • Specular > Color:鏡面反射のカラー乗数。

  • Specular > Shininess:反射に使用される鏡面性指数。値を低くすると反射の明るさが増し、より拡散しますが、値を高くすると反射がより局所的になります。高い値は、濡れたような表面に適しています。

  • Texture > Filter:ノードのプロパティの設定 (またはRendering > Textures > Canvas Textures > Default Texture Filter項目設定)に関係なく、テクスチャ フィルタリング モードをオーバーライドするように設定できます 。

  • [テクスチャ] > [繰り返し]:ノードのプロパティの設定(または[レンダリング] > [テクスチャ] > [キャンバス テクスチャ] > [デフォルト テクスチャの繰り返し]項目の設定)に関係なく、テクスチャ フィルタリング モードをオーバーライドするように設定できます 。

法線マップを有効にすると、ライトが薄くなったように見える場合があります。これを修正するには、PointLight2D ノードと DirectionalLight2D ノードの Height プロパティを増やします。法線マップを有効にする前に、ライトのエネルギープロパティをわずかに増やして、ライトの強度に近づけることもできます 。

2D ライトのより高速な代替手段として追加のスプライトを使用する¶

2D ライトのパフォーマンスに問題がある場合は、それらの一部を加算ブレンドを使用する Sprite2D ノードに置き換える価値があるかもしれません。これは、銃弾や爆発などの短時間のダイナミック エフェクトに特に役立ちます。

追加のスプライトは、別のレンダリング パイプラインを通過する必要がないため、レンダリングが大幅に高速になります。さらに、このメソッドは AnimatedSprite2D (または Sprite2D + AnimePlayer) とともに使用でき、アニメーション化された 2D「ライト」を作成できます。

ただし、スプライトのアタッチには、2D ライトと比較していくつかの欠点があります。

  • ブレンド式は、「実際の」2D ライティングと比較すると不正確です。これは通常、明るい領域では問題になりませんが、追加のスプライトが完全に暗い領域を適切に照らすことができなくなります。

  • アタッチされたスプライトはライトではないため、影を落とすことができません。

  • スプライトを追加すると、他のスプライトで使用されている法線マップと鏡面反射光マップが無視されます。

追加のブレンディングを使用してスプライトを表示するには、Sprite2D ノードを作成し、それにテクスチャを割り当てます。インスペクターで、「CanvasItem」 > 「マテリアル」セクションまで下にスクロールし、それを展開して、「マテリアル」プロパティの横にあるドロップダウンをクリックします。New CanvasItemMaterialを選択し、新しく作成した編集するマテリアルをクリックして、Blend ModeをAddに設定します

2Dグリッド¶

はじめに¶ _

3D では、世界を表示するためにメッシュが使用されます。2D では画像がより頻繁に使用されるため、これらはまれです。Godot の 2D エンジンは純粋な 2D エンジンであるため、3D メッシュを直接表示することはできません (ただし、Viewportと を使用すると表示できますViewportTexture)。

こちらも参照

2D ビューポート上に 3D メッシュを表示することに興味がある場合は、「ビューポートをテクスチャとして使用する」チュートリアルを参照してください。

2D メッシュは、3D ではなく 2 次元のジオメトリ (Z は省略または無視できます) を含むメッシュです。SurfaceToolコードで自分で作成し、MeshInstance2Dノードに表示してみることもできます。

現在、エディタで 2D メッシュを生成する唯一の方法は、OBJ ファイルをメッシュとしてインポートするか、Sprite2D から変換することです。

描画ピクセルの最適化¶

場合によっては、このワークフローは 2D 図面の最適化に役立ちます。透明度のある大きなイメージを描画する場合、Godot はクワッド全体を画面に描画します。大きな透明領域は引き続き描画されます。

これは、特にモバイル デバイスで、非常に大きな画像 (多くの場合、画面のサイズ) を描画する場合、または大きな透明領域を持つ複数の画像をスタックする場合 (たとえば、ParallaxBackground.

メッシュに変換すると、不透明な部分のみが描画され、残りは無視されます。

Sprite2D を 2Dメッシュに変換¶

Sprite2Dを に変換することで、この最適化を利用できますMeshInstance2Dこの木のような、エッジの周りに多くの透明度を含む画像から始めます。

それを a に置きSprite2D、メニューから「2D メッシュに変換」を選択します。

ダイアログが表示され、2D メッシュの作成方法のプレビューが表示されます。

多くの場合、デフォルトで十分ですが、必要に応じて拡張と単純化を変更できます。

最後に、ボタンを押すと、Sprite2D が置き換えられます。Convert 2D Mesh

2Dスプライトアニメーション¶

はじめに¶ _

このチュートリアルでは、AnimatedSprite2D クラスとAnimationPlayer を使用して 2D アニメーション キャラクターを作成する方法を学習します。通常、アニメーション キャラクターを作成またはダウンロードすると、別の画像として表示されるか、すべてのアニメーション フレームを含む単一のスプライト シートとして表示されます。どちらも、AnimatedSprite2D クラスを使用して Godot でアニメーション化できます。

まず、 AnimatedSprite2Dを使用して、個々の画像のコレクションをアニメーション化します。次に、このクラスを使用してスプライト シートをアニメーション化します。最後に、AnimationPlayerとSprite2D のアニメーションプロパティを使用して、スプライト シートをアニメーション化する別の方法を学びます。

ノート

以下の例のアートはansimuz | OpenGameArt.orgおよび tgfcoder からのものです。

AnimatedSprite2D を使用した単一の画像¶

このシーンには一連のイメージがあり、各イメージにはキャラクターのアニメーションのフレームが含まれています。この例では、次のアニメーションを使用します。

画像はここからダウンロードできます:  2d_sprite_animation_assets.zip

画像を解凍し、プロジェクト フォルダーに配置します。次のノードを使用してシーン ツリーをセットアップします。

ノート

ルート ノードはArea2Dまたは RigidBody2Dにすることもできます。アニメーションは引き続き同じ方法で行われます。アニメーションが完了したら、そのシェイプを CollisionShape2D に割り当てることができます。詳細については、「物理学入門」を参照してください 

次に、SpriteFramesAnimatedSprite2Dプロパティで「New SpriteFrames」を選択します

新しい SpriteFrames アセットをクリックすると、エディタ ウィンドウの下部に新しいパネルが表示されます。

左側のファイル システム ドックから、8 つの個別の画像を SpriteFrames パネルの中央セクションにドラッグします。左側で、アニメーションの名前を「デフォルト」から「実行」に変更します。

[フィルター アニメーション]入力の右上隅にある [再生] ボタンを使用して、アニメーションをプレビューします。これで、ビューポートでアニメーションが再生されるのが確認できるはずです。ただし、少し遅いです。これを修正するには、SpriteFrames パネルの速度 (FPS) 設定を 10 に変更します。

「アニメーションを追加」ボタンをクリックして画像を追加すると、アニメーションを追加できます。

アニメーションの制御¶

アニメーションが完了したら、play()およびstop()メソッドを使用してコードを通じてアニメーションを制御できます。以下は、右矢印キーを押している間アニメーションを再生し、キーを放すとアニメーションを停止する短い例です。

GD スクリプト C#
CharacterBody2Dを拡張@onready var _animated_sprite = $AnimatedSprite2D func _process(_delta):
     if Input.is_action_pressed("ui_right"): 
        _animated_sprite.play("run") else : 
        _animated_sprite.stop()

 


    

AnimatedSprite2D を使用したスプライトシート¶

クラスを使用して、スプライト シートから簡単にアニメーション化することもできますAnimatedSprite2Dこのパブリック ドメインのスプライト シートを使用します。

画像を右クリックし、「名前を付けて画像を保存」を選択してダウンロードし、プロジェクトフォルダーに画像をコピーします。

単一の画像を使用して、前と同じ方法でシーン ツリーをセットアップします。SpriteFramesAnimatedSprite2Dプロパティで「New SpriteFrames」を選択します

新しい SpriteFrames リソースをクリックします。今度は下のパネルが表示されたら「スプライトシートからフレームを追加」を選択します。

ファイルを開くように求められます。スプライト シートを選択します。

新しいウィンドウが開き、スプライト シートが表示されます。最初に行う必要があるのは、スプライト シート内の縦横の画像の数を変更することです。このスプライト シートには、4 つの水平画像と 2 つの垂直画像があります。

次に、スプ​​ライトシートからアニメーションに含めるフレームを選択します。最初の 4 つを選択し、[4 フレームの追加] をクリックしてアニメーションを作成します。

下部パネルのアニメーションのリストにアニメーションが表示されます。デフォルトをダブルクリックし、ジャンプするアニメーションの名前を変更します。

最後に、SpriteFrames エディターの再生ボタンをチェックして、カエルがジャンプするのを確認してください。

アニメーションプレーヤーを使用したスプライトシート¶

スプライト シートを使用するときにアニメーション化できるもう 1 つの方法は、標準の Sprite2Dノードを使用してテクスチャを表示し、AnimationPlayer を使用してテクスチャ間の変更をアニメーション化することです。

アニメーションの 6 フレームを含むこのスプライト シートについて考えてみましょう。

画像を右クリックし、「名前を付けて画像を保存」を選択してダウンロードし、画像をプロジェクトフォルダーにコピーします。

私たちの目標は、これらの画像を循環させることです。まず、シーン ツリーをセットアップします。

ノート

ルート ノードはArea2Dまたは RigidBody2Dにすることもできます。アニメーションは引き続き同じ方法で行われます。アニメーションが完了したら、そのシェイプを CollisionShape2D に割り当てることができます。詳細については、「物理学入門」を参照してください 

スプライトシートをスプライトのTextureプロパティにドラッグすると、シート全体が画面に表示されることがわかります。個々のフレームに分割するには、インスペクターの「アニメーション」セクションを展開し、「Hframes」を に設定します6。 HframeVframe は、スプライト シート内の水平フレームと垂直フレームの数です。

次に、 Frame プロパティの値を変更してみます。0範囲がから までであり5、それに応じて Sprite2D によって表示される画像が変化することがわかります。これはアニメーション化したいプロパティです。

「アニメーション」ボタンを選択しAnimationPlayerてクリックし、「新規」をクリックします。新しいアニメーションに「Walk」という名前を付けます。アニメーションの長さを に設定し0.6、[ループ] ボタンをクリックすると、アニメーションが繰り返されます。

次に、Sprite2Dノードを選択し、鍵アイコンをクリックして新しいトラックを追加します。

0.10 から 5 までのすべてのフレームが揃うまで、タイムラインの各ポイント (デフォルトでは秒) にフレームを追加し続けます。フレームが実際にアニメーション トラックに表示されることがわかります。

アニメーション上で「再生」を押して、どのように見えるかを確認します。

AnimationPlayerアニメーションの制御¶

play()AnimatedSprite2D と同様に、 および メソッドを使用してコードを通じてアニメーションを制御できますstop()ここでも、右矢印キーを押し続けるとアニメーションを再生し、キーを放すとアニメーションを停止する例を示します。

GD スクリプト C#
CharacterBody2Dを拡張@onready var _animation_player = $AnimationPlayer func _process(_delta):
     if Input.is_action_pressed("ui_right"): 
        _animation_player.play("walk") else : 
        _animation_player.stop()

 


    

ノート

アニメーションと個々のプロパティの両方を同時に更新する場合 (たとえば、プラットフォーマーは「ターン」アニメーションの開始時にキャラクターが回転するときにスプライトのh_flip/プロパティを更新する場合があります)、すぐには適用されないことv_flip に注意することが重要です。play()代わりに、次回AnimationPlayerが破棄されるときに適用されます。これは次のフレームで発生し、プロパティの変更は適用されるがアニメーションが適用されない「グリッチ」フレームが発生する可能性があります。これが問題であることが判明した場合は、 呼び出し直後にアニメーションの更新を呼び出すplay()ことができます。advance(0)

一般¶ _

これらの例は、Godot の 2D アニメーションに使用できる 2 つのクラスを示しています。 AnimationPlayerよりも少し複雑ですAnimatedSprite2Dが、位置やスケールなどの他のプロパティもアニメーション化できるため、追加の機能が提供されます。このクラスはAnimationPlayerと一緒に使用することもできますAnimatedSprite2D。ニーズに最も適したものを試してみてください。

2D パーティクルシステム¶

はじめに¶ _

パーティクル システムは、火花、炎、魔法の粒子、煙、霧などの複雑な物理的効果をシミュレートするために使用されます。

この考え方は、「粒子」が一定の間隔と一定の寿命で放出されるというものです。その存続期間中、各パーティクルは同じ基本的な動作をします。各パーティクルをユニークにし、より有機的な外観を与えるのは、各パラメータに関連付けられた「ランダム性」です。基本的に、パーティクル システムを作成するということは、基礎となる物理パラメータを設定し、それらにランダム性を追加することを意味します。

パーティクルノード¶

Godot は、2D パーティクル用に 2 つの異なるノード、GPUParticles2D とCPUParticles2Dを提供します。GPUParticles2D はより高度で、GPU を使用してパーティクル エフェクトを処理します。CPUParticles2D は、GPUParticles2D と同様の機能を備えた CPU 駆動のオプションですが、多数のパーティクルを使用するとパフォーマンスが低下します。一方、CPUParticles2D は、ローエンド システムや GPU ボトルネックではパフォーマンスが向上する可能性があります。

GPUParticles2D はParticleProcessmaterialを介して 設定されますが (オプションでカスタム シェーダを使用します)、一致するオプションは CPUParticles2D のノード プロパティを介して提供されます (トラック設定を除く)。

GPUParticles2D ノードを CPUParticles2D ノードに変換するには、インスペクターでノードをクリックし、 3D エディター ビューポートの上部にあるツールバーから [パーティクル] > [CPUParticles2D に変換]を選択します。

このチュートリアルの残りの部分では、GPUParticles2D ノードを使用します。まず、GPUParticles2D ノードをシーンに追加します。ノードを作成すると、白色点のみが作成され、シーン ドックの GPUParticles2D ノードの横に警告アイコンが表示されることがわかります。これは、Node が機能するには ParticleProcessmaterial が必要であるためです。

パーティクルハンドリングマテリアル¶

処理マテリアルをパーティクル ノードに追加するには、インスペクター パネルに移動します。その横にあるボックスをクリックし、ドロップダウン メニューから選択します。Process MaterialMaterialNew ParticleProcessMaterial

GPUParticles2D ノードが下向きに白い点を放出するはずです。

テクスチャ¶ _

パーティクル システムは単一のテクスチャを使用します (将来的にはスプライトシートを介してアニメーション テクスチャに拡張される可能性があります)。テクスチャは、関連するテクスチャ プロパティを通じて設定されます。

時間パラメータ¶

寿命¶ _

各パーティクルの存続期間 (秒単位)。寿命が終了すると、それを置き換えるために新しいパーティクルが作成されます。

寿命: 0.5

寿命: 4.0

ワンショット¶

有効にすると、GPUParticles2D ノードはすべてのパーティクルを 1 回放出し、その後は放出しません。

前処理¶ _

パーティクル システムは、ゼロのパーティクルを放出することから始まり、その後放出を開始します。これは、トーチやフォグなどのシーンやシステムをロードするときに不便になる可能性があります。入った瞬間から輝きが始まります。前処理は、最初の実際の描画の前にシステムに指定した秒数を処理させるために使用されます。

速度スケール¶

速度スケールのデフォルト値は、1パーティクル システムの速度を調整するために使用されます。値を低くするとパーティクルの速度が遅くなり、値を大きくするとパーティクルの速度が速くなります。

爆発性¶ _

ライフタイムが で、1パーティクルが 10 個ある場合、0.1 秒ごとに 1 個のパーティクルが放出されることを意味します。爆発性パラメータはこれを変更し、パーティクルが一緒に放出されるように強制します。範囲は次のとおりです。

  • 0: パーティクルを定期的に放出します (デフォルト)。

  • 1: すべてのパーティクルを同時に放出します。

中間の値も許可されます。この機能は、爆発やパーティクルの突然のバーストを作成する場合に役立ちます。

ランダム性¶ _

すべての物理パラメータはランダム化できます。ランダム値の範囲は から です0。 1パラメータをランダム化するための式は次のとおりです。

初期値 = パラメータ値 + パラメータ値 * ランダム性

固定フレームレート¶

この設定を使用して、固定 FPS でレンダリングするようにパーティクル システムを設定できます。たとえば、値を に変更すると、2パーティクルは 2 フレーム/秒でレンダリングされます。これによってパーティクル システム自体の速度が低下するわけではないことに注意してください。

部分デルタ¶

これを使用して、Fract Delta をオンまたはオフにできます。

描画パラメータ¶

可視性長方形¶

可視性長方形は、画面上のパーティクルの可視性を制御します。この四角形がビューポートの外側にある場合、エンジンはパーティクルを画面上にレンダリングしません。

長方形のWHプロパティは、それぞれその幅と高さを制御します。プロパティは、パーティクル エミッタを基準とした長方形の左上隅の位置を制御しますXY

2D ビューの上にあるツールバーを使用して、Godot に可視四角形を自動的に生成させることができます。これを行うには、GPUParticles2D ノードを選択してクリックします。Godot はパーティクルを放出する Particles2D ノードを数秒間シミュレートし、パーティクルが採用するサーフェスに合わせて長方形を設定します。Particles > Generate Visibility Rect

このオプションを使用して、放出期間を制御できます。最大値は 25 秒です。パーティクルが動き回るのにさらに時間が必要な場合は、Particles2D ノードで継続時間を一時的に変更できます。Generation Time (sec)preprocess

ローカル座標¶

デフォルトでは、このオプションはオンになっています。これは、パーティクルが放出される空間がノードを基準にしていることを意味します。ノードを移動すると、すべてのパーティクルも一緒に移動します。

無効にすると、パーティクルはグローバル空間に放出されます。つまり、ノードが移動されても、すでに放出されているパーティクルは影響を受けません。

描画順序¶

これは、個々のパーティクルが描画される順序を制御します。Index パーティクルが放出順序に従って描画されることを示します(デフォルト)。 Lifetime残存寿命順にプロットされていることを示します。

パーティクルプロセスマテリアルの設定¶

方向¶ _

これは、パーティクルが放出される基本方向です。デフォルトでは、パーティクルは右側に放出されます。ただし、デフォルトの重力設定では、パーティクルはまっすぐ下に移動します。Vector3(1, 0, 0)

この特性を顕著にするには、初速度が 0 より大きい必要があります。ここでは初速度を 40 に設定します。パーティクルが右側に放出され、重力によって下に落ちることがわかります

伝播¶ _

このパラメータは、いずれかの方向のベースにランダムに追加される角度 (度単位) です Direction180スプレッドは全方向 (+/- 180) に放射されます。伝播で何かを行うには、「初速度」パラメータが 0 より大きくなければなりません。

平坦度¶ _

このプロパティは 3D パーティクルにのみ役立ちます。

重力¶ _

各パーティクルに適用される重力。

速度¶

初期速度は、パーティクルが放出される速度 (ピクセル/秒) です。速度は、重力またはその他の加速度 (後述) により後で変化する場合があります。

角速度

角速度は、パーティクルに適用される初期角速度です。

スピン速度¶

スピン速度は、粒子がその中心の周りを回転する速度 (度/秒) です。

軌道速度¶

軌道速度は、粒子を中心の周りで回転させるために使用されます。

線形加速度¶

各パーティクルに適用される線形加速度。

ラジアル加速度¶

この加速度が正の場合、パーティクルは中心から離れる方向に加速されます。負の場合、それらはそれに吸収されます。

接線加速度

この加速には中心への接線ベクトルが使用されます。ラジアル加速と組み合わせるとうまく機能します。

ショック軽減¶

ダンピングはパーティクルに摩擦を加え、パーティクルを強制的に停止させます。これは、通常、高い線速度で始まり、その後収まるにつれて停止する火花や爆発に特に役立ちます。

角度¶ _

パーティクルの初期角度を度単位で決定します。このパラメータはランダム化に最も役立ちます。

スケール¶ _

パーティクルの初期スケールを決定します。

色¶ _

放出されるパーティクルの色を変更するために使用されます。

色相の変化¶

このVariation値は、各パーティクルに適用される初期の色相の変更を設定します。この値は、色合いの変化のランダム性の比率を制御します。Variation Random

発光形状¶

ParticleProcess Materials を使用すると、パーティクルが放出される領域と方向を決定する放出マスクを設定できます。これらはプロジェクト内のテクスチャから生成できます。

ParticleProcessmaterial が設定され、GPUParticles2D ノードが選択されていることを確認します。[パーティクル] メニューがツールバーに表示されます。

それを開いて、「Load Emission Mask」を選択します。

次に、マスクとして使用するテクスチャを選択します。

いくつかの設定を含むダイアログが表示されます。

エミッションマスク¶

テクスチャから 3 種類の放出マスクを生成できます。

  • ソリッド ピクセル: パーティクルは、透明な領域を除く、テクスチャの任意の領域から生成されます。

  • 境界ピクセル: パーティクルはテクスチャの外側の端から生成されます。

  • Directed Border Pixels: ボーダー ピクセルに似ていますが、マスクに追加情報を追加して、ボーダーからパーティクルを放出できるようにします。使用するには遺言書を作成する必要があるので注意してください。Initial Velocity

発光色¶

Capture from Pixelパーティクルがスポーン ポイントでのマスクのカラーを継承します。

[OK] をクリックすると、マスクが生成され、次のセクションの ParticleProcessmaterial に設定されます。Emission Shape

このセクションのすべての値は [Load Emission Mask] メニューによって自動生成されるため、通常はそのままにしておく必要があります。

ノート

画像を追加したり、直接追加したりしないでください。「起動マスクのロード」メニューを常に使用する必要があります。Point TextureColor Texture

2Dアンチエイリアス¶

こちらも参照

Godot は 3D レンダリングでのアンチエイリアスもサポートしています。これについては3D アンチエイリアスページで説明されています。

はじめに¶ _

2D でレンダリングされたシーンは、解像度が限られているため、エイリアスが発生して見える場合があります。これらのアーティファクトは通常、ジオメトリのエッジに「階段」効果の形で表示され、 Line2D 、  Polygon2DTextureProgressBarなどのノードを使用するときに最も目立ちます。2D のカスタム図面は、アンチエイリアスをサポートしていないメソッドでもエイリアス化される場合があります。

以下の例では、エッジがブロック状になっていることがわかります。

エイリアシングをより見やすくするために、最近傍フィルタリングによってイメージが 2 倍に拡大縮小されます。

これに対処するために、Godot は 2D レンダリングでアンチエイリアスを有効にするいくつかの方法をサポートしています。

Line2D およびカスタム プロットのアンチエイリアス プロパティ

ほとんどの場合、パフォーマンスへの影響が少ないため、これをお勧めします。

Line2D には、インスペクターで有効にできるアンチエイリアスプロパティがあります。さらに、2D でカスタム プロットするためのいくつかのメソッドは、関数の呼び出し時に設定できるオプションのパラメーターをサポートしていますantialiasedtrue

これらの方法では MSAA を有効にする必要がないため、ベースライン パフォーマンスにコストがかかります。言い換えれば、ある時点でアンチエイリアスされたジオメトリを描画しなくても、コストが永続的に増加することはありません。

これらのアンチエイリアシング方法の欠点は、余分なジオメトリを生成することによって機能することです。フレームごとに更新される複雑な 2D ジオメトリを生成している場合、これがボトルネックになる可能性があります。また、Polygon2D、TextureProgressBar、および一部のカスタム描画メソッドにはアンチエイリアス プロパティがありません。これらのノードの場合は、代わりに 2D マルチサンプル アンチエイリアスを使用できます。

マルチサンプルアンチエイリアス (MSAA)

2D で MSAA を有効にする前に、MSAA が何で実行されるかを理解することが重要です。2D の MSAA は、3D と同様の制約に従います。ぼやけは発生しませんが、適用範囲は限られています。2D MSAA の主な用途は次のとおりです。

  • 線や多角形の描画などの幾何学的なエッジ。

  • スプライト エッジは、テクスチャ エッジの 1 つに接触するピクセルにのみ適用されますこれは、線形フィルタリングと最近傍フィルタリングの両方で機能します。画像の透明度を使用して作成されたスプライトのエッジは MSAA の影響を受けません。

MSAA の欠点は、エッジでのみ機能することです。これは、MSAA によってカバレッジ サンプルの数は増加しますが、カラーサンプルの数は増加しないためです。ただし、カラー サンプルの数は増加していないため、フラグメント シェーダーはピクセルごとに 1 回だけ実行されます。したがって、MSAA は次の種類のエイリアスにはまったく影響しません。

  • 最近傍フィルタリングされたテクスチャ (ピクセル アート)エイリアシング。

  • カスタム 2D シェーダによって発生するエイリアシング。

  • Light2D 使用時の鏡面エイリアシング。

  • フォントレンダリングにおけるエイリアス。

MSAA は、プロジェクト設定で [レンダリング] > [アンチエイリアス] > [品質] > [MSAA 2D] 設定の値を変更することで有効にできます。MSAA 3Dではなく MSAA 2D 設定の値を変更することが重要です。これらは完全に別の設定であるためです。

アンチエイリアスなし (左) とさまざまな MSAA レベル (右) の比較。左上隅には Line2D ノードが含まれ、右上隅には 2 つの TextureProgressBar ノードが含まれます。下部には 8 つのピクセル アート スプライトが含まれており、そのうちの 4 つはエッジに触れています (緑の背景)、残りの 4 つは触れていません (Godot のロゴ)。

  

カスタム 2Dプロット¶

はじめに¶ _

Godot には、スプライト、ポリゴン、パーティクル、その他あらゆる種類のものを描画するためのノードがあります。ほとんどの場合、これで十分です。必要な特定のものを描画できるノードがない場合は、任意の 2D ノード ( Controlまたは Node2Dベースなど) にカスタム コマンドを描画させることができます。

2D ノードでのカスタム描画役立ちます。以下にいくつかの使用例を示します。

  • 軌跡のある画像やアニメーション化された特殊なポリゴンなど、既存のノードでは実行できない形状やロジックを描画します。

  • Node と互換性のないビジュアライゼーション (テトリス ボードなど)。(テトリスの例では、カスタム描画関数を使用してブロックを描画します。)

  • 単純なオブジェクトをたくさん描きます。カスタム描画により、多数のノードを使用するオーバーヘッドが回避され、メモリ使用量が削減され、パフォーマンスが向上する可能性があります。

  • カスタム UI コントロールを作成します。使用できるコントロールは多数ありますが、通常とは異なるニーズがある場合は、コントロールをカスタマイズする必要がある場合があります。

描画¶ _

Controlや Node2DなどのCanvasItem 派生ノードにスクリプトを追加します次に、その関数をオーバーライドします。_draw()

GD スクリプト C#
extends Node2D func _draw():
     # ここに描画コマンドを渡します


    

描画コマンドについては、 「CanvasItemクラス リファレンス」 で説明されています。沢山あります。

更新¶ _

この_draw()関数は 1 回だけ呼び出され、その後、描画コマンドがキャッシュされて記憶されるため、それ以上の呼び出しは必要ありません。

状態またはその他の変更により再描画が必要な場合は、同じノードでCanvasItem.queue_redraw()_draw()を呼び出して、新しい呼び出しを行います。

以下は少し複雑な例で、変更された場合に再描画されるテクスチャ変数です。

GD スクリプト C#
extends Node2D 

export (Texture) var texture setget _set_texture func _set_texture(value):
     # テクスチャ変数が外部で変更された場合、# このコールバックが呼び出されます。
    texture = value   # テクスチャが変更されました。
    queue_redraw()   # ノードの再描画をトリガーします。func _draw(): 
    draw_texture(テクスチャ, Vector2())


    


場合によっては、すべてのフレームを描画する必要があるかもしれません。これを行うには、次のようにコールバックqueue_redraw()から呼び出します。_process()

GD スクリプト C#
extends Node2D func _draw():
     # ここでの描画コマンドはfunc _process(delta): 
    queue_redraw()を渡します


    


座標¶ _

描画 API は、必ずしもピクセル座標ではなく、CanvasItem の座標系を使用します。これは、CanvasItem の変換を適用した後に作成された座標空間を使用することを意味します。さらに、 draw_set_transformまたは draw_set_transform_matrixを使用してカスタム変換を適用できます。

使用する場合はdraw_line線の太さを考慮する必要があります。0.5奇数サイズの幅を使用する場合は、以下に示すように、線を中央に保つために位置を移動する必要があります。

GD スクリプト C#
func _draw(): 
    draw_line(Vector2(1.5, 1.0), Vector2(1.5, 4.0), Color.GREEN, 1.0)draw_line(Vector2(4.0, 1.0), 
    Vector2(4.0, 4.0), Color.GREEN, 2.0) 
    draw_line (Vector2(7.5, 1.0)、Vector2(7.5, 4.0)、Color.GREEN、3.0)

draw_rectを使った方法でも同様です。filled = false

GD スクリプト C#
func _draw(): 
    draw_rect(Rect2(1.0, 1.0, 3.0, 3.0), Color.GREEN) 
    draw_rect(Rect2(5.5, 1.5, 2.0, 2.0), Color.GREEN, false, 1.0) 
    draw_rect(Rect2(9.0, 1.0) 、5.0、5.0)、Color.GREEN) 
    draw_rect(Rect2(16.0、2.0、3.0、3.0)、Color.GREEN、false、2.0)

例:円弧の描画¶

次に、Godot エンジンのカスタム描画機能を使用して、Godot が提供しない機能を描画します。たとえば、Godot はdraw_circle()円全体を描画する機能を提供します。しかし、円の一部を描く場合はどうでしょうか? これを行う関数を作成し、自分で描画する必要があります。

円弧関数¶

円弧は、そのサポート円パラメータ、つまり中心位置と半径によって定義されます。円弧自体は、開始角度と停止角度によって定義されます。これらは、プロット関数に提供する必要がある 4 つのパラメーターです。色の値も提供するので、必要に応じて異なる色で円弧を描くことができます。

基本的に、画面上に形状を描画するには、ある点から別の点に接続する特定の数の点に形状を分割する必要があります。ご想像のとおり、シェイプがより多くのポイントで構成されているほど、見た目は滑らかになりますが、処理コストの点で重くなります。一般に、形状が大きい場合 (または 3D でカメラに近い場合)、角度のあるポイントよりも多くのポイントを描画する必要があります。逆に、形状が小さい場合 (または 3D でカメラから遠い場合)、ポイント数を減らして処理コストを節約できます。これは詳細レベル (LOD)と呼ばれます。この例では、半径に関係なく、単純に固定数のポイントを使用します。

GD スクリプト C#
funcdraw_circle_arc (center, radius, angle_from, angle_to, color):
     var nb_points = 32
     var Points_arc = PackedVector2Array() for i in range(nb_points + 1):
         var angle_point = deg_to_rad(angle_from + i * (angle_to-angle_from) / nb_points - 90) 
        Points_arc.push_back(center + Vector2(cos(angle_point), sin(angle_point)) * radius)範囲(nb_points)Index_point : 
        draw_line(points_arc[index_point], Points_arc[index_point + 1], color)

    

    

形状を分割する必要があったポイントの数を覚えていますか? nb_pointsこの数値を変数の値として固定します32PackedVector2Array次に、単なる s の配列である空の one を初期化します Vector2

次のステップでは、円弧を構成する 32 個の点の実際の位置を計算します。これは最初の for ループで行われます。位置が計算されるポイントの数と最後のポイントを加えて反復処理します。まず、開始角度と終了角度の間の各点の角度を決定します。

各角度が 90° ずつ減少する理由は、三角法 (コサインとサインなど) を使用して各角度の 2D 位置を計算するためです。ただし、 度ではなくラジアンcos()が使用されますsin()12 時から数えたいのですが、角度 0° (0 ラジアン) は 3 時から始まります。したがって、12 時から数えるために各角度を 90° ずつ減らします。

円上にある角度で横たわる点の実際の位置 (ラジアン単位) は、angleによって与えられます。合計値と戻り値は-1から1の間なので、位置は半径1の円上になります。位置を半径 のサポート円上に置くには、単に位置に を乗算します。最後に、その場所にサポートの輪を配置する必要があります。これは、それを当社の価値に追加することで実現します。最後に、前に定義したポイントを挿入します。Vector2(cos(angle), sin(angle))cos()sin()radiusradiuscenterVector2PackedVector2Array

さて、実際に自分の主張を述べる必要があります。ご想像のとおり、単純に 32 個の点を描画するのではなく、各点の間にあるすべてのものを描画する必要があります。前の方法を使用して各点を自分で計算し、それらを 1 つずつ描画することができます。しかし、それはあまりにも複雑で非効率的であるため (明示的に必要でない限り)、各点のペアの間に線を引くだけです。支持円の半径が非常に大きい場合を除き、2 つの点間の各線がそれらを確認できるほど長くなることはありません。こうなったら得点を増やすだけです。

画面上に円弧を描く¶

画面上に何かを描画する関数ができました。_draw()関数内でそれを呼び出します。

GD スクリプト C#
func _draw():
     var center = Vector2(200, 200)
     var radius = 80
     var angle_from = 75
     var angle_to = 195
     var color = Color(1.0, 0.0, 0.0) 
    draw_circle_arc(center, radius, angle_from, angle_to, color)

結果:

円弧ポリゴン関数¶

さらに一歩進んで、円弧によって定義される円板の平面部分だけでなく、その形状も描画する関数を作成できます。この方法は、線の代わりに多角形を描画することを除いて、前とまったく同じです。

GD スクリプト C#
funcdraw_circle_arc_poly (center, radius, angle_from, angle_to, color):
     var nb_points = 32
     var Points_arc = PackedVector2Array() 
    Points_arc.push_back(center) var Colors = PackedColorArray([color]) for i in range(nb_points + 1):
         var angle_point = deg_to_rad(angle_from + i * (angle_to - angle_from) / nb_points - 90) 
        Points_arc.push_back(center + Vector2(cos(angle_point), sin(angle_point)) * radius) 
    draw_polygon(points_arc, Colors)
    

    

動的カスタムプロット¶

これで、画面上にカスタム コンテンツを描画できるようになりました。ただし、これは静的なものなので、中心を中心に形状を回転させてみましょう。これに対する解決策は、angle_from と angle_to の値を時間の経過とともに変更することです。この例では、単純に 50 ずつ増やします。このデルタ値は一定のままでなければなりません。そうでないと、回転速度がそれに応じて変化します。

まず、スクリプトの先頭で angle_from 変数と angle_to 変数をグローバルにする必要があります。また、それらを他のノードに保存して使用できることにも注意してくださいget_node()

GD スクリプト C#
Node2D拡張しますvarrotation_angle = 50
 var angle_from = 75
 var angle_to = 195


これらの値は _process(delta) 関数で変更します。

ここでは、angle_from と angle_to の値も増やします。ただし、0 ~ 360° の間の結果の値を忘れてはなりませんwrap()つまり、角度が 361° の場合、実際には 1° になります。値をラップしない場合、スクリプトは正常に動作しますが、角度の値は時間の経過とともにどんどん大きくなり、Godot が管理できる最大整数値 ( ) に達します。これが発生すると、Godot がクラッシュしたり、予期しない動作を示したりする可能性があります。2^31 - 1

最後に、関数を呼び出すことを忘れないでくださいqueue_redraw()。この関数は自動的に呼び出されます_draw()。これにより、フレームが更新されるタイミングを制御できます。

GD スクリプト C#
func _process(delta): 
    angle_from += 回転角度
    angle_to += 回転角度# 両方の角度が 360 より大きい場合にのみ、角度をラップします。 angle_from > 360およびangle_to > 360の場合: 
        angle_from = Wrapf(angle_from, 0, 360) 
        angle_to = Wrapf (angle_to, 0, 360) 
    queue_redraw()

    
    

また、これらの変数を使用するように関数を変更することを忘れないでください_draw()

GD スクリプト C#
func _draw():
    var center = Vector2(200, 200)
    var radius = 80
    var color = Color(1.0, 0.0, 0.0) 

   draw_circle_arc( center, radius, angle_from, angle_to, color )

走ろう!それは機能しますが、アークの回転が驚くほど速くなります。どうしたの?

その理由は、GPU が実際に可能な限り高速にフレームを表示しているためです。この速度でプロットを「正規化」する必要があり、そのためには関数deltaの引数を使用する必要があります_process()delta最後にレンダリングされた 2 つのフレーム間の経過時間が含まれます。通常は小さいため (約 0.0003 秒ですが、ハードウェアによって異なります)、 を使用してdelta描画を制御します。

rotation_angle私たちの場合は、関数内で変数を乗算するだけです。このようにして、2 つの角度ははるかに小さい値だけ増加しますが、これはレンダリング速度に直接依存します。delta_process()

GD スクリプト C#
func _process(delta): 
    angle_from +=回転角度 * デルタ
    angle_to += 回転角度 * デルタ# 両方の角度が 360 より大きい場合にのみ、角度をラップします。 angle_from > 360およびangle_to > 360の場合: 
        angle_from = Wrapf(angle_from, 0, 360 ) 
        angle_to = Wrapf(angle_to, 0, 360) 
    queue_redraw()

    
    

また走ろう!今度は回転も良くなったみたいです!

アンチエイリアス描画¶

Godot は、アンチエイリアシングを有効にするために、draw_line でメソッド パラメータを提供しますantialiasedが、すべてのカスタム描画メソッドがこの パラメータを提供するわけではありません。

antialiasedパラメータを提供しないカスタム描画メソッドの場合は、代わりに 2D MSAA を有効にすることができます。これはビューポート全体のレンダリングに影響します。これにより、高品質のアンチエイリアスが提供されますが、パフォーマンス コストが高く、特定の要素のみに適用されます。詳細については、「2D アンチエイリアス」を参照してください

ツール¶ _

エディターでノードを実行するときに、独自のノードを描画する必要がある場合もあります。これは、特定の機能や動作のプレビューまたは視覚化として使用できます。詳細については、「エディターでのコードの実行」を参照してください。

2D モーションの概要¶

はじめに¶ _

すべての初心者が遭遇するのは、「キャラクターをどうやって動かすか?」ということです。作成しているゲームのスタイルによっては、特別な要件がある場合がありますが、一般に、ほとんどの 2D ゲームの動きは、少量のデザインに基づいています。

これらの例ではCharacterBody2Dを使用しますが、原則は他のノード タイプ (Area2D、RigidBody2D) にも適用されます。

設定¶ _

以下の各例では、同じシーン設定を使用しています。2 つの子 と を持つ a からCharacterBody2D始めSprite2DますCollisionShape2DSprite2D のテクスチャとして Godot アイコン (「icon.png」) を使用することも、手持ちの他の 2D 画像を使用することもできます。

「入力マップ」タブを開いて選択します。次の入力アクションを追加します (詳細については「InputEvent」を参照)。Project -> Project Settings

8方向の動き¶

この場合、ユーザーに 4 つの方向キー (上/左/下/右または W/A/S/D) を押して、選択した方向に移動してもらいます。「8方向移動」という名前は、2つのキーを同時に押すと斜めに移動できることに由来しています。

キャラクターにスクリプトを追加し、次のコードを追加します。

GD スクリプト C#
CharacterBody2Dを拡張@export var Speed = 400 func get_input():
     var input_direction = Input.get_vector("left", "right", "up", "down")
    速度 = input_direction * 速度func _physics_process(delta): 
    get_input() 
    move_and_slide()

 




get_input()この関数では、 Input get_vector()を使用して4 つの主要なイベントをチェックし、合計して方向ベクトルを返します。

1次に、この長さの方向ベクトルに希望の速度を乗算することで速度を設定できます。

ヒント

これまでにベクトル計算を使用したことがない場合、または復習が必要な場合は、「 Vector math」で Godot でのベクトルの使用方法の説明を確認してください。

ノート

キーを押しても上記のコードが何も実行しない場合は、このチュートリアルのセットアップセクションで説明されているように、入力アクションが正しく設定されていることを再確認してください。

回転+移動¶

このタイプの動きは、古典的なアーケード ゲームの動作方法に似ているため、「小惑星スタイル」と呼ばれることもあります。左/右を押すとキャラクターが回転し、上/下を押すと任意の方向に前後に移動します。

GD スクリプト C#
CharacterBody2Dを拡張@export var速度 = 400
 @export var回転速度 = 1.5 var回転方向 = 0 func get_input():
    回転方向 = Input.get_axis("left", "right")
    速度 =transform.x * Input.get_axis("down" , "up") * 速度関数_physics_process(delta): 
    get_input()
    回転 += 回転方向 * 回転速度 * デルタ
    move_and_slide()

  






ここでは、回転方向と速度を追跡するために 2 つの変数を追加しました。回転はボディのrotationプロパティに直接適用されます。

速度を設定するには、ボディの「前方」方向を指すベクトルであるボディの を取得し transform.x、それに速度を掛けます。

回転+移動 (マウス)

このスポーティなスタイルは、以前のスタイルのバリエーションです。今回は、キーボードではなくマウスの位置によって向きが設定されます。キャラクターは常にマウス ポインタを「見ます」。ただし、前方/後方入力は同じままです。

GD スクリプト C#
CharacterBody2Dを拡張@export var速度 = 400 func get_input(): 
    look_at(get_global_mouse_position())
    速度 =transform.x * Input.get_axis("down", "up") * 速度func _physics_process(delta): 
    get_input() 
    move_and_slide( )

 




ここでは、 Node2D メソッドを使用してlook_at()プレーヤーをマウスの位置にポイントします。この機能を使用しない場合は、次のように角度を設定することで同じ効果が得られます。

GD スクリプト C#
回転 = get_global_mouse_position().angle_to_point(position)

クリックして移動¶

最後の例では、マウスのみを使用してキャラクターを制御します。画面をクリックすると、プレーヤーが目的の場所に移動します。

GD スクリプト C#
CharacterBody2Dを拡張@export varspeed = 400 var target = location func _input(event):
     ifevent.is_action_pressed ("click"): 
        target = get_global_mouse_position() func _physics_process(delta):
    速度 = Position.direction_to(target) * 速度# look_at(ターゲット)位置.距離_to(ターゲット) > 10の場合: 
        move_and_slide()

 






    
    

distance_to()移動前に行うチェックに注意してください。このテストを行わないと、目標位置に到達したときにボディが「ぐらつき」、その位置をわずかに通り過ぎて戻ろうとしますが、行き過ぎてしまい、それが繰り返されます。

必要に応じて、そのlook_at()行のコメントを解除すると、ボディが動きの方向を向くようになります。

ヒント

このテクニックは、「フォロー」キャラクターの基礎としても使用できます。このtarget場所には、移動先の任意のオブジェクトの場所を指定できます。

一般¶ _

これらのコード サンプルは、独自のプロジェクトの開始点として役立つ場合があります。自由に使用して、何ができるかを試してみてください。

このサンプル プロジェクトは、 2d_movement_starter.zipからダウンロードできます。 

タイルセットの使用¶

はじめに¶ _

タイル マップは、ゲーム レイアウトの作成に使用されるタイルのグリッドです。TileMap ノードを使用してレベルを設計することには、いくつかの利点があります。まず、タイルをグリッド上に「描画」することでレイアウトを描画できます。これは、個々の Sprite2D ノードを順番に配置するよりもはるかに高速です第 2 に、多数のタイルを描画するために最適化されているため、より大きなレベルが可能になります。最後に、コリジョン、オクルージョン、ナビゲーション シェイプを使用して、タイルにさらに多くの機能を追加できるようになります。

タイルマップを使用するには、まず TileSet を作成する必要があります。TileSet は、TileMap ノードに配置できるタイルのコレクションです。TileSet を作成した後、 TileMap エディターを使用して配置できるようになります

このガイドに従うには、各タイルが同じサイズであるタイルを含む画像が必要です (大きなオブジェクトは複数のタイルに分割できます)。この画像はタイルシートと呼ばれます。タイルは正方形である必要はありません。長方形、六角形、または等角投影法 (疑似 3D 遠近法) にすることができます。

新しいタイルセットを作成する¶

タイルテーブルの使用¶

このデモでは、Kenney の Abstract Platformer パックから取得した次のタイルを使用します。コレクションからこの特定のタイルテーブルを使用します。

64×64 のタイルが入ったタイルシート。クレジット: Kenny¶

新しいTileMapノードを作成し、それを選択して、インスペクターで新しい TileSet リソースを作成します。

TileMap ノードに新しい TileSetリソースを作成する¶

TileSet リソースを作成した後、値をクリックしてインスペクターで展開します。デフォルトのコラージュ形状は正方形ですが、(コラージュ画像の形状に応じて)等距離、半オフセット正方形、または六角形を選択することもできます。正方形以外のタイル形状を使用する場合は、「タイル レイアウト」プロパティ「タイル オフセット軸」プロパティも調整する必要がある場合があります。最後に、タイル座標によってタイルをクリップしたい場合は、Render > UV Clipping プロパティを有効にすると便利です。これにより、タイル シート上の割り当てられた領域の外にタイルを描画できなくなります。

タイルテーブルの例と一致するように、インスペクターでタイルのサイズを 64x64 に設定します。

タイルテーブルの例と一致するようにタイルサイズを 64×64 に設定します¶

(ここで行うように) 自動タイル作成に依存する場合は、アトラスを作成する前にタイル サイズを設定する必要があります。アトラスは、タイルシートのどのタイルを TileMap ノードに追加できるかを決定します (画像のすべての部分が有効なタイルであるとは限らないため)。

エディターの下部にあるTileSetパネルを開き、左下隅にある「+」アイコンをクリックして新しいアトラスを追加します。

下部パネルを使用して、TileSet リソースに新しいアトラスを作成する¶

アトラスを作成した後、それにタイルシート テクスチャを割り当てる必要があります。これを行うには、下部パネルの左列でテクスチャを選択し、次にTexture プロパティの値をクリックして、[Quick Load] (または[Load ]) を選択します。表示されるファイル ダイアログを使用して、イメージ ファイルへのパスを指定します。

新しく作成したTileSetアトラスにタイルシート画像をロード¶

有効な画像を指定した後、タイルを自動的に作成するかどうかを尋ねられます。答えは次のとおりです

タイルシート画像コンテンツに基づいてタイルを自動的に作成¶

これにより、TileSet リソースで前に指定したタイル サイズに基づいてタイルが自動的に作成されます。これにより、タイルの初期セットアップが大幅に高速化されます。

ノート

画像コンテンツに基づいた自動タイル生成を使用する場合、完全に透明なスライス テーブル セクションはタイルを生成しません。

アトラスに表示したくないタイルがタイル テーブルにある場合は、タイル セット プレビューの上部にある消しゴム ツールを選択し、削除するタイルをクリックします。

消しゴムツールを使用して、TileSet アトラスから不要なタイルを削除します¶

消しゴム ツールの代わりに、タイルを右クリックして削除を選択することもできます。

ヒント

2D エディタやタイルマップ エディタと同様に、マウスの中ボタンまたは右ボタンを使用して TileSet パネルをパンしたり、マウス ホイールまたは左上のボタンを使用してズームしたりできます。

単一の TileSet 内の複数のタイルシート イメージからタイルを取得する場合は、続行する前に追加のアトラスを作成し、それぞれにテクスチャを割り当てます。この方法でタイルごとに 1 つの画像を使用することもできます (ただし、使いやすさを高めるためにタイル テーブルを使用することをお勧めします)。

中央の列でアトラスのプロパティを調整できます。

専用インスペクター (TileSet パネルの一部) で TileSet アトラス プロパティを調整する

アトラスでは次のプロパティを調整できます。

  • ID:並べ替えに使用される識別子 (この TileSet 内で一意)。

  • 名前:人間が読めるアトラスの名前。整理のため、ここではわかりやすい名前が使用されています (「地形」、「装飾」など)。

  • マージン:タイルとして選択しない画像の端のマージン (ピクセル単位)。この値を増やすと、端の周りに余白のあるタイル画像をダウンロードする場合に便利です (帰属表示など)。

  • 間隔:アトラス上の各タイル間のピクセル単位の間隔。各タイル間のアウトラインなどのガイドを含むタイルシート イメージを使用している場合、この値を増やすと便利です。

  • テクスチャ領域サイズ:アトラス上の各タイルのサイズ (ピクセル単位)。ほとんどの場合、これは TileMap プロパティで定義されたタイル サイズと一致する必要があります (ただし、これは厳密に必要なわけではありません)。

  • テクスチャ塗りつぶしを使用:チェックすると、フィルタリングが有効になっているときにテクスチャのにじみを防ぐために、各タイルの周囲に 1 ピクセルの透明な境界線が追加されます。テクスチャの塗りつぶしによるレンダリングの問題が発生しない限り、このオプションを有効にすることをお勧めします。

テクスチャのマージン、セパレーション、および領域サイズを変更すると、タイルが失われる可能性があることに注意してください (タイルの一部はアトラス イメージの座標の外側になるため)。タイル テーブルからタイルを自動的に再生成するには、TileSet エディターの上部にある 3 つの垂直ドット メニュー ボタンを使用し、 [ 非透明テクスチャ領域にタイルを作成]を選択します。

アトラスのプロパティを変更した後にタイルを自動的に再作成する¶

シーンコレクションの操作¶

Godot 4.0 以降、実際のシーンをタイルとして配置できるようになりました。これにより、任意のノードのコレクションをタイルとして使用できるようになります。たとえば、シーン タイルを使用して、プレイヤーが操作できるショップなどのゲーム要素を配置できます。シーン タイルを使用して、AudioStreamPlayer2D (環境音用)、パーティクル エフェクトなどを配置することもできます。

警告する

シーン タイルは、配置されたタイルごとに各シーンが個別にインスタンス化されるため、アトラスよりもパフォーマンスのオーバーヘッドが大きくなります。

必要な場合にのみシーン タイルを使用することをお勧めします。高度な操作を行わずにタイル内にスプライトを描画するには、 代わりにアトラスを使用します

この例では、CPUParticles2D ルート ノードを使用してシーンを作成します。シーンをシーン ファイル (TileMap を含むシーンとは別) に保存し、TileMap ノードを含むシーンに切り替えます。TileSet エディターを開き、左側の列で新しいシーン コレクションを作成します。

TileSet Editorでの SceneAssembly の作成¶

シーン アセンブリを作成した後、必要に応じて、中央の列にシーン アセンブリのわかりやすい名前を入力できます。このシーン コレクションを選択し、新しいシーン スロットを作成します。

タイルセットエディターでシーンセットを選択した後にシーンタイルを作成する¶

右側の列でこのシーン スロットを選択し、fastload (または load )を使用してパーティクルを含むシーン ファイルをロードします。

シーン スロットを作成し、TileSetエディターでシーン ファイルをそこにロードする¶

これで、TileSet にシーン タイルが作成されました。TileMap エディタに切り替えると、シーン コレクションからシーン コレクションを選択し、他のタイルと同様にペイントできるようになります。

複数のアトラスを 1 つのアトラスに結合する¶

単一の TileSet リソースで複数のアトラスを使用すると便利な場合もありますが、場合によっては面倒になることもあります (特にタイルごとに 1 つの画像を使用する場合)。Godot を使用すると、複数のアトラスを 1 つに結合して整理しやすくなります。

これを行うには、TileSet リソース内に複数のアトラスを作成する必要があります。マップセット リストの下部にある「縦に 3 つの点」メニュー ボタンを使用し、 [マップセット マージ ツールを開く]を選択します。

複数のアトラスを作成した後にアトラス結合ツールを開く¶

これによりダイアログが開き、Shift キーまたは Ctrl キーを押しながら複数の要素をクリックして複数のアトラスを選択できます。

アトラスマージツールダイアログの使用¶

[結合]を選択して、選択したアトラスを 1 つのアトラス イメージに結合します (TileSet 内の 1 つのアトラスに変換されます)。マージされていないアトラスは TileSet 内で削除されますが、元のアトラス イメージはファイル システム上に残りますマージされていないアトラスを TileSet リソースから削除したくない場合は、代わりに[マージ (元のアトラスを保持)]を選択します。

ヒント

TileSet にはタイル プロキシシステムがあります。タイル プロキシは、特定のタイル識別子のセットを別のセットに置き換える必要があることを、特定の TileSet を使用して TileMap に通知できるようにするマッピング テーブルです。

タイル プロキシは、異なるアトラスを結合するときに自動的に設定されますが、上記の「縦に 3 つの点」メニューを使用してアクセスする [タイル プロキシの管理] ダイアログを使用して手動で設定することもできます。

タイル プロキシの手動作成は、アトラス ID を変更する場合や、あるアトラス内のすべてのタイルを別のアトラスのタイルに置き換える場合に便利です。タイルマップを編集するときは、すべてのセルを対応するマップされた値に置き換えることができることに注意してください。

コリジョン、ナビゲーション、オクルージョンをTileSetに追加する¶

これで、基本的な TileSet が正常に作成されました。これで TileMap ノードの使用を開始できますが、現時点では衝突検出の形式がありません。これは、プレイヤーや他のオブジェクトが床や壁をまっすぐ突き抜けることができることを意味します。

2D ナビゲーションを使用している場合は、タイルのナビゲーション ポリゴンを定義して、エージェントが道を見つけるために使用できるナビメッシュを生成する必要もあります。

最後に、 2D ライトとシャドウ、または GPUParticles2D を使用している場合は、TileSet がシャドウを投影し、パーティクルと衝突できるようにすることも必要になるでしょう。これには、TileSet 上の「ソリッド」タイルのオクルージョン ポリゴンを定義する必要があります。

各タイルのコリジョン、ナビゲーション、オクルージョン シェイプを定義できるようにするには、まず、TileSet アセットの物理レイヤー、ナビゲーション レイヤー、またはオクルージョン レイヤーを作成する必要があります。これを行うには、TileMap ノードを選択し、インスペクターで TileSet プロパティ値をクリックして編集し、物理レイヤーを展開して[要素の追加]を選択します 

TileSet Resource Inspectorで物理レイヤー (TileMap ノード内) を作成する¶

ナビゲーション サポートも必要な場合は、今がナビゲーション レイヤーを作成する良い機会です。

TileSet リソースインスペクターでナビゲーションレイヤー(TileMap ノード内) を作成する¶

ライト ポリゴン オクルーダーのサポートが必要な場合は、今がオクルージョン レイヤーを作成する良い機会です。

TileSet アセット インスペクター (TileMap ノード内) でオクルージョン レイヤーを作成する

ノート

このチュートリアルの次のステップは衝突ポリゴンの作成に特化していますが、ナビゲーションとオクルージョンのプロセスは非常に似ています。それぞれのポリゴン エディタは同じように動作するため、簡潔にするためにこれらの手順は繰り返しません。

唯一の注意点は、タイルの Occlusion Polygon プロパティがAtlas Inspector の Render サブセクションの一部であることです。ポリゴンを編集できるように、必ずこのセクションを展開してください。

物理レイヤーを作成した後、TileSet Atlas Inspector の [Physical Layers] セクションにアクセスできます

衝突エディタを選択モードで開きます¶

TileSet エディターにフォーカスがあるときに F キーを押すと、長方形の衝突シェイプをすばやく作成できます。キーボード ショートカットが機能しない場合は、ポリゴン エディタの周囲の空きスペースをクリックしてフォーカスを合わせてみてください。

Fを押して、デフォルトの長方形の衝突形状を使用します¶

このタイル衝突エディタでは、すべての 2D ポリゴン編集ツールを使用できます。

  • ポリゴンの上にあるツールバーを使用して、新しいポリゴンの作成、既存のポリゴンの編集、ポリゴン上のポイントの削除を切り替えます。「3 つの垂直点」メニュー ボタンには、ポリゴンの回転や反転などの追加オプションが用意されています。

  • 2 点間の線をクリックしてドラッグし、新しい点を作成します。

  • 点を右クリックして (または前述の削除ツールを使用して左クリックして)、点を削除します。

  • 中クリックまたは右クリックして、エディタ内を移動します。(右クリックによるパンは、近くにポイントがない領域でのみ機能します。)

デフォルトの長方形形状を使用して、点の 1 つを削除することで三角形の衝突形状をすばやく作成できます。

角の 1 つを右クリックして削除し、三角形の衝突シェイプを作成します¶

さらに点を追加することで、より複雑な形状の基礎として長方形を使用することもできます。

複雑なタイル形状のカスタム衝突を描画する¶

ヒント

タイルセットが大きい場合、各タイルの衝突を個別に指定すると、時間がかかることがあります。TileMap には一般的な衝突パターン (固体ブロックや 45 度の傾斜など) を持つタイルが多数含まれる傾向があるため、これは特に当てはまります。同様の衝突形状を複数のタイルにすばやく適用するには、 プロパティを複数のタイルに一度に割り当てる機能を使用します。

TileSet のタイルにカスタム メタデータを割り当てる¶

カスタム データ レイヤーを使用して、タイルごとにカスタム データを割り当てることができます。これは、プレイヤーがタイルに触れたときにタイルが与えるダメージの量や、タイルが武器で破壊できるかどうかなど、ゲームに固有の情報を保存するのに役立ちます。

データは TileSet 内のタイルに関連付けられます。配置されたタイルのすべてのインスタンスは同じカスタム データを使用します。異なるカスタム データを使用してタイル バリエーションを作成する必要がある場合は、代替タイルを作成し、代替タイルのカスタム データのみを変更することで実行できます。

TileSet リソースインスペクターでカスタムデータレイヤー (TileMap ノード内) を作成する¶

ゲーム固有のプロパティを使用して構成されたカスタム データ レイヤーの例¶

既存のメタデータを壊さずにカスタム データを並べ替えることができます。カスタム データ プロパティを並べ替えると、TileSet エディターが自動的に更新されます。

エディターでは、プロパティ名は表示されないことに注意してください (定義された順序と一致するインデックスのみが表示されます)。damage_per_secondたとえば、上記のカスタム データ レイヤーの例では、メタデータ25設定するタイルを割り当てています destructiblefalse

選択モードでのTileSetエディターでのカスタムデータの編集¶

タイル プロパティ ペイントは カスタム データにも使用できます。

タイル属性描画を使用してTileSetエディターでカスタムデータを割り当てる¶

地形セットの作成 (自動ステッチ)

ノート

この機能は、 Godot 3.x の自動タイリングとは異なる形式で実装されています。地形は本質的に、オートタイルのより強力な代替品です。オートタイルとは異なり、単一のタイルで複数の地形を同時に定義できるため、地形はある地形から別の地形への移行をサポートできます。

以前とは異なり、オートタイルは特定のタイプのタイルであり、地形はアトラス タイルに割り当てられた単なるプロパティのセットです。これらの属性は、地形データを含むタイルをインテリジェントに選択する専用の TileMap ペイント モードで使用されます。これは、任意の地形タイルを、他のタイルと同様に、地形として、または単一のタイルとして描画できることを意味します。

「磨かれた」タイルセットには、多くの場合、プラットフォームや床などの角や端に使用する必要があるバリアントがあります。これらを手動で配置することも可能ですが、すぐに面倒になってしまう可能性があります。手続き的に生成されたレベルでこの状況に対処することも難しく、大量のコードが必要になります。

Godot は、このタイル結合を自動化するための地形を提供します。これにより、「正しい」タイル バリアントを自動的に使用できるようになります。

地形は TerrainSet にグループ化されます。各地形セットには、「コーナーとサイドの一致」「コーナーの一致」、「サイドの一致」からモードが割り当てられます これらは、テレインセット内のテレインが互いにどのように一致するかを定義します。

ノート

上記のモードは、Godot 3.x で使用されていた以前のビットマスク モード オートタイル (最小 2×2、3×3、または 3×3) に対応します。これは、 Tiledエディターが行うことと同様です

TileMap ノードを選択した状態で、インスペクターに移動し、 TileSetリソースに新しい地形セットを作成します。

TileSet アセットインスペクターで TerrainSet (TileMap ノード内) を作成する¶

地形セットを作成した後、その地形セット内に1 つ以上の地形を作成する必要があります。

地形セットでの地形の作成¶

TileSet エディターで、選択モードに切り替えてタイルをクリックします。中央の列で、[Terrains]セクションを展開し、タイルに Terrainset ID と Terrain ID を指定します。これは、「地形セットなし」または「地形なし」を意味します。これは、地形を 1 以上に設定する前に、まず地形セットを 1 つ以上に設定する必要があることを意味-1ます 00

ノート

地形セット ID と地形 ID は互いに独立しています。0また、 の代わりに で始まります1

TileSetエディターの選択モードでの個々のタイルの地形の構成¶

これを実行すると、中央の列に表示される Terrain Peering Bits セクションを設定できるようになりますアライメント ビットは、隣接するタイルに基づいてどのタイルが配置されるかを決定します。-1空のスペースを参照する特別な値。

たとえば、タイルのすべてのビットが 1 以上に設定されている場合、隣接する 8 つのタイルすべてが同じテレイン ID を持つタイルを使用している0場合にのみ表示されます。角や側面に存在します。タイルのビットがまたはそれ以上に設定されているが、左上、上、および右上のビットが に設定されている場合、その上に空きスペース (対角線を含む) がある場合にのみ表示されます。0-1

TileSet エディターの選択モードで個々のタイルに地形の等価性を設定する¶

完全なタイル テーブルの構成例は次のようになります。

横スクロール ゲームの完全なタイル テーブルの例¶

目に見える地形の等価性を備えた横スクロール ゲームの完全なタイル テーブルの例¶

複数のタイルにプロパティを一度に割り当てる¶

複数のタイルにプロパティを一度に割り当てる方法は 2 つあります。ユースケースによっては、一方の方法が他方の方法より高速になる場合があります。

複数のタイル選択の使用¶

複数のプロパティを一度に設定したい場合は、TileSet エディターの上部で選択モードを選択します。

Shift キーを押しながらこれを行うと、タイルを押したままクリックすることで、右側の列で複数のタイルを選択できます。マウスの左ボタンを押したままマウスをドラッグして、長方形の選択を実行することもできます。Shift 最後に、選択したタイルを押したままクリックすると、既に選択されているタイルの選択を解除できます (残りの選択には影響しません)。

その後、TileSet エディターの中央の列にあるインスペクターを使用してプロパティを割り当てることができます。ここで変更したプロパティのみが、選択したすべてのタイルに適用されます。エディターのインスペクターと同様に、選択したタイルのさまざまなプロパティは、編集するまで異なるままになります。

数値属性と色の属性を使用すると、属性を編集した後にアトラス内のすべてのタイルで属性値のプレビューも表示されます。

選択モードを使用して複数のタイルを選択し、属性を適用します¶

タイル属性によるペイント¶

一度に複数のタイルに属性を適用したい場合は、属性ペイント モードを使用できます。

中央の列でペイントする属性を構成し、右の列のタイルをクリック (またはマウスの左ボタンを押したまま) して、属性をタイルに「ペイント」します。

タイルセットエディターを使用したタイルプロパティの描画¶

タイル属性ペイントは、衝突形状などの時間のかかる属性を手動で設定する場合に特に便利です。

衝突ポリゴンを描画し、タイルを左クリックして適用します

代替タイルの作成¶

場合によっては、単一のタイル イメージ (アトラス内で 1 回だけ見つかる) を使用したい場合がありますが、それを別の方法で構成します。たとえば、同じタイル イメージを使用し、回転、反転、または別の色で調整したい場合があります。これは、代替タイルを使用して行うことができます。

代替タイルを作成するには、TileSet エディターに表示されているアトラスのベース タイルを右クリックし、 [代替タイルの作成]を選択します。

TileSet エディターでベース タイルを右クリックして、代替タイルを作成します¶

現在選択モードにある場合は、代替タイルが編集用にすでに選択されています。現在選択モードでない場合でも代替タイルを作成できますが、選択モードに切り替えて編集する代替タイルを選択する必要があります。

代替タイルが表示されない場合は、アトラス画像の右側にパンします。これは、代替タイルが常に、特定のアトラスのベース タイルの右側の TileSet エディターに表示されるためです。

TileSetエディターをクリックした後に代替タイルを構成する¶

代替タイルを選択した後、基本タイルの場合と同様に、中央の列を使用してプロパティを変更できます。ただし、公開されるプロパティのリストはベース タイルとは異なります。

  • 代替 ID:この代替タイルの一意の数値識別子。変更すると既存の TileMap が壊れるので注意してください。この ID は、エディターに表示される代替タイルのリストの順序も制御します。

  • レンダリング > 水平方向に反転:の場合true、タイルは水平方向に反転されます。

  • [レンダリング] > [V を反転]:の場合true、タイルは垂直方向に反転されます。

  • レンダリング > トランスポーズ:の場合true、タイルは反時計回りに 90 度回転します。Flip Hおよび/またはFlip Vと組み合わせて使用​​すると、180 度または 270 度の回転を実行できます。

  • レンダリング > テクスチャ原点:タイルの描画に使用される原点。これを使用して、ベース タイルと比較してタイルを視覚的にオフセットすることができます。

  • Render > Modulation:タイルをレンダリングするときに使用するカラー乗数。

  • レンダリング > マテリアル:このタイルに使用するマテリアル。これを使用して、さまざまなブレンド モードまたはカスタム シェーダを個々のタイルに適用できます。

  • Z インデックス:このタイルの並べ替え順序。値を大きくすると、タイルが同じレイヤー上の他のタイルの前にレンダリングされます。

  • Y ソート原点:ピクセル単位の Y 座標に基づいてタイルをソートするための垂直オフセット。これにより、トップダウン ゲームの場合、レイヤーを異なる高さにあるかのように使用できます。これを調整すると、特定のタイルの並べ替えに関する問題を軽減できます。Y ソートを有効にしてタイルを TileMap レイヤーに配置する場合にのみtrue機能します。

alt タイルの横にある大きな「+」アイコンをクリックすると、他の alt タイルのバリエーションを作成できます。これは、ベース タイルを選択し、それを右クリックして[置換タイルの作成]を再度選択することと同じです。

ノート

置換タイルが作成されるとき、基本タイルのプロパティはどれも継承されません。ベース タイルと置換タイルのプロパティを同じにしたい場合は、置換タイルでプロパティを再度設定する必要があります。

タイルマップの使用¶

こちらも参照

このページは、TileSet がすでに作成またはダウンロードされていることを前提としています。そうでない場合は、TileMap を作成するには TileSet が必要になるため、最初に「TileSet の使用」をお読みください。

はじめに¶ _

タイル マップは、ゲーム レイアウトの作成に使用されるタイルのグリッドです。TileMap ノードを使用してレベルを設計することには、いくつかの利点があります。まず、グリッド上にタイルを「描画」することでレイアウトを描画できます。これは、個々の Sprite2D ノードを順番に配置するよりもはるかに高速です。第 2 に、多数のタイルを描画するために最適化されているため、より大きなレベルが可能になります。最後に、コリジョン、オクルージョン、およびナビゲーション シェイプをタイルに追加して、TileMap の機能をさらに強化できます。

ノート

Godot 4.0 では、いくつかのタイルごとのプロパティ (タイルの回転など) が TileMap から TileSet に移動されました。TileMap エディターで個々のタイルを回転することはできなくなりました。代わりに、TileSet エディタを使用して、代替の回転タイルを作成する必要があります。

この変更により、TileSet 内ですべてのタイルを回転または反転する必要がないため、デザインの一貫性が向上します。

TileMapでのTileSetの指定¶

TileSet の使用に関する前のページに従った場合は、TileMap ノードに TileSet リソースが組み込まれているはずです。これはプロトタイピングには適していますが、実際のプロジェクトでは、複数のレベルで同じタイルセットを再利用することがよくあります。

複数の TileMap ノードで同じ TileSet を再利用する推奨方法は、TileSet を外部リソースに保存することです。これを行うには、TileSet リソースの横にあるドロップダウン メニューをクリックし、[保存]を選択します。

組み込みの TileSet リソースを外部リソースファイルに保存¶

タイルマップレイヤーの作成¶

Godot 4.0 以降では、複数のレイヤーを 1 つの TileMap ノードに配置できるようになりましたたとえば、これにより前景タイルと背景タイルを区別して整理しやすくなります。特定の場所の階層ごとに 1 つのタイルを配置でき、複数の階層がある場合は、複数のタイルを互いに重ねることができます。

デフォルトでは、TileMap ノードには自動的にプレハブ レイヤーが含まれます。必要なレイヤーが 1 つだけの場合は、追加のレイヤーを作成する必要はありませんが、今すぐ作成したい場合は、TileMap ノードを選択し、インスペクターで[レイヤー] セクションを展開します。

TileMap ノードにレイヤーを作成する (「背景」と「前景」の例)

各レイヤーには、調整できるいくつかのプロパティがあります。

  • 名前: TileMap エディターに表示される人間が判読できる名前。これは、「背景」、「建物」、「植生」などです。

  • 有効:の場合true、レイヤーはエディターおよびプロジェクトの実行時に表示されます。

  • 変調:レイヤー上のすべてのタイルの乗数として使用される色。これは、各タイルのModulateプロパティと TileMap ノードのModulateプロパティによって乗算されます。たとえば、これを使用して背景のタイルを暗くし、前景のタイルをより目立たせることができます。

  • Y ソートが有効:の場合true、タイルは TileMap 上の Y 位置に従ってソートされます。これを使用すると、特定のタイルセット、特にアイソメトリック タイルでの順序の問題を防ぐことができます。

  • Y ソートの原点:各タイルを Y ソートするために使用される垂直オフセット (ピクセル単位)。Y ソートの有効化が場合にのみ有効ですtrue

  • Z Index:このレイヤーを他の TileMap レイヤーの前に描画するか後ろに描画するかを制御します。この値は正または負の値にすることができ、Z インデックスが最も高いレイヤーが他のレイヤーの上に描画されます。複数のレイヤーが同じ Z インデックス プロパティを持つ場合、レイヤー リストの最後のレイヤー (リストの一番下に表示されるレイヤー) が一番上に描画されます。

「レイヤー」セクションのエントリの左側にある「3 本の水平バー」アイコンをドラッグ アンド ドロップすると、レイヤーの順序を変更できます。

ノート

将来、既存のタイルに影響を与えることなく、レイヤーを作成、名前変更、または並べ替えることができます。ただし、レイヤーを削除すると、そのレイヤーに配置されているタイルも削除されるので注意してください。

タイルマップエディタを開く¶

TileMap ノードを選択し、エディターの下部にある TileMap パネルを開きます。

エディターの下部にある [TileMap] パネルを開きます。最初に TileMap ノードを選択する必要があります。

ペイントするタイルの選択¶

まず、その上に他のレイヤーを作成した場合は、ペイントするレイヤーが選択されていることを確認してください。

TileMap エディターでペイントするレイヤーを選択¶

ヒント

2D エディターでは、同じ TileMap ノードから現在編集していないレイヤーは、TileMap エディターでグレー表示されます。この動作を無効にするには、レイヤー選択メニューの横にあるアイコンをクリックします (選択した TileMap レイヤーのツールチップが強調表示されます)。

他のレイヤーを作成していない場合は、TileMap エディターに入るときに最初のレイヤーが自動的に選択されるため、上記の手順をスキップできます。

2D エディターにタイルを配置する前に、エディターの下部にあるタイルマップ パネルで 1 つ以上のタイルを選択する必要があります。これを行うには、TileMap パネルでタイルをクリックするか、マウス ボタンを押したまま複数のタイルを選択します。

TileMap エディターでタイルをクリックして選択¶

ヒント

2D および TileSet エディタと同様に、マウスの中ボタンまたは右ボタンを使用してタイルマップ パネルをパンし、マウス ホイールまたは左上のボタンを使用してズームできます。

Shift キーを押したままにして、現在の選択内容に追加することもできます。マルチブロックを選択すると、ペイント操作が実行されるたびにマルチブロックが配置されます。これを使用すると、複数のタイルで構成される構造 (大きなプラットフォームや木など) を 1 回のクリックで描画できます。

最終的な選択は連続している必要はありません。選択したタイル間にギャップがある場合、2D エディターで描画されたパターンでは空白のままになります。

マウスの左ボタンを押したままにして、TileMap エディターで複数のタイルを選択します¶

TileSet で代替タイルを作成した場合は、それらを選択して基本タイルの右側に描画できます。

TileMap Editorで代替タイルを選択¶

最後に、TileSet でシーン コレクションを作成した場合は、シーン タイルを TileMap に配置できます。

TileMap エディターを使用してパーティクルを含むシーン タイルを配置する¶

描画モードとツール¶

TileMap エディターの上部にあるツールバーを使用すると、さまざまなペイント モードとツールから選択できます。これらのモードは、 TileMap パネル自体ではなく、2D エディターでのクリック動作に影響します。

左から右に、選択できるペイント モードとツールは次のとおりです。

選択¶ _

単一のタイルをクリックしてタイルを選択するか、マウスの左ボタンを押したまま 2D エディターで四角形を使用して複数のタイルを選択します。空の領域は選択できないことに注意してください。長方形の選択範囲を作成すると、空ではないタイルのみが選択されます。

現在の選択内容に追加するには、Shift キーを押しながらタイルを選択します。現在の選択から削除するには、Ctrl キーを押しながらタイルを選択します。

この選択内容を他のペイント モードで使用して、配置されたパターンのコピーをすばやく作成できます。

選択モードでは、新しいタイルを配置することはできませんが、選択した後に右クリックすることでタイルを消去できます。選択範囲内のどこをクリックしても、選択範囲全体が削除されます。

ペイント モードでは、Ctrl キーを押したまま選択を実行することで、このモードを一時的に切り替えることができます。

ヒント

選択を実行して を押すと、配置されたタイルをコピーして貼り付けることができます。左クリック後に選択範囲を貼り付けます。もう一度押すと、この方法でさらにコピーを実行できます。右クリックするか、「貼り付けのキャンセル」を押します。Ctrl + CCtrl + VCtrl + VEscape

描画¶ _

標準のペイント モードでは、マウスの左ボタンをクリックするか押したままにすることでタイルを配置できます。

右クリックすると、現在選択されているタイルがタイル マップから削除されます。つまり、空白に置き換えられます。

TileMap で複数のタイルを選択するか、選択ツールを使用する場合、マウスの左ボタンを押したままマウスをクリックまたはドラッグするたびにタイルが配置されます。

ヒント

描画モードでは、 Shift を押す前にマウスの左ボタンを押したまま、マウスを線の終点までドラッグすることで線を描画できます 。これは、後述する線ツールを使用する場合と同じです。

Ctrl と Shift を押す前にマウスの左ボタンを押したまま、マウスを長方形の端点までドラッグすることによって、長方形を描画することもできます 。これは、後述する長方形ツールを使用する場合と同じです。

Ctrl 最後に、タイルを押したままクリックする (またはマウスを押したままドラッグする) ことで、2D エディターで既存のタイルを選択できます。これにより、現在描画されているタイルが、今クリックしたタイルに切り替わります。これは、後述する選択ツールを使用する場合と同じです。

行¶ _

線描画モードを選択すると、(方向に関係なく) 常に 1 タイルの太さの線を描画できます。

線画モードで右クリックすると線を消去します。

タイルマップまたは選択ツールで複数のタイルを選択した場合は、それらを直線上の繰り返しパターンに配置できます。

ペイント モードまたは消しゴム モード中に、Shift キーを押したまま描画すると、このモードを一時的に切り替えることができます。

2つのタイルを選択後、ラインツールでプラットフォームを斜めに描画¶

長方形¶ _

長方形描画モードを選択すると、軸に沿った長方形を描画できます。

長方形ペイント モードで右クリックすると、軸に合わせた長方形が消去されます。

タイルマップまたは選択ツールで複数のタイルを選択した場合、それらのタイルを長方形内の繰り返しパターンに配置できます。

ペイント モードまたは消しゴム モードでは、Ctrl キーを押しながら Shift キーを押しながら描画すると、このモードを一時的に切り替えることができます。

バケットがいっぱい¶

バケット フィル モードが選択されている場合、ツールバーの右側に表示される連続チェックボックスを切り替えることで、ペイントを連続領域に限定するかどうかを選択できます。

「連続」がオン(デフォルト)の場合、現在の選択範囲に接触する一致するタイルのみが置き換えられます。この継続的なチェックは水平方向と垂直方向に実行されますが、斜め方向には実行されません

Contiguousが無効の場合、TileMap 全体内の同じ ID を持つすべてのタイルが、現在選択されているタイルに置き換えられます。Contiguous がチェックされていない空のタイルが選択されている場合、TileMap の有効領域を含む四角形内のすべてのタイルが置き換えられます。

バケット フィル モードで右クリックすると、一致するタイルが空のタイルに置き換えられます。

タイルマップまたは選択ツールで複数のタイルを選択した場合、それらのタイルを塗りつぶし領域内に繰り返しパターンで配置できます。

バケットフィルツールの使用¶

セレクター¶ _

ピッカー モードを選択すると、Ctrl キーを押しながらタイルをクリックすることで、2D エディターで既存のタイルを選択できます。これにより、現在描画されているタイルが、今クリックしたタイルに切り替わります。マウスの左ボタンを押したまま長方形の選択範囲を形成することで、複数のタイルを一度に選択することもできます。空でないタイルのみを選択できます。

ペイント モードでは、Ctrl キーを押しながらマウスをクリックまたはドラッグすることで、このモードを一時的に切り替えることができます。

消しゴム¶ _

このモードは、他のペイント モード(ペイント、ライン、長方形、バケット塗りつぶし)と組み合わせて使用​​できます。消しゴム モードを有効にすると、左クリックすると、新しい線を描画する代わりにタイルが空のタイルに置き換えられます。

他のモードでは左クリックする代わりに右クリックすることで、このモードを一時的に切り替えることができます。

スキャッタによるランダムペイント¶

ペイントするときに、ランダム化を有効にすることを選択できます有効にすると、ペイントは現在選択されているすべてのタイルの中からランダムにタイルを選択します。これは、ペイント、線、四角形、およびバケット塗りつぶしツールによってサポートされています。効果的にランダムに描画するには、TileMap エディターで複数のタイルを選択するか、Scatter を使用する必要があります (両方の方法を組み合わせることができます)。

Scattering が0 より大きい値に設定されている場合、描画時にタイルが配置されない可能性があります。これは、大きな領域に繰り返しのない詳細を時折追加する場合に便利です (大きなトップダウン タイルマップに草やパンくずリストを追加するなど)。

ペイント モードを使用する場合の例:

ランダムに複数選択し、マウスの左ボタンを押したままにして描画¶

バケットフィルモードを使用する場合の例:

単一タイルに対してバケットフィルツールを使用しますが、ランダム化と散布は有効になっています¶

ノート

消しゴム モードでは、ランダム化と散乱は考慮されません。選択範囲内のすべてのタイルが常に削除されます。

パターンを使用したプレハブ タイル配置の保存とロード¶

選択モードではタイルをコピーして貼り付けることができますが、事前に作成したタイルのパターンを保存しておき、いつでも組み合わせることができます。これは、 TileMap エディターの[Patterns]タブを選択することで、TileMap ごとに行うことができます。

新しいパターンを作成するには、選択モードに切り替えて選択し、 を押します。[パターン] タブの空の領域をクリックし (空の領域の周囲に青いフォーカス四角形が表示されます)、Ctrl + CCtrl + V を押します。

TileMap エディターの選択内容から新しいスキーマを作成する¶

既存のパターンを使用するには、「パターン」タブでその画像をクリックし、任意のペイント モードに切り替えて、2D エディターの任意の場所を左クリックします。

タイルマップエディターを使用して既存のパターンを配置する¶

マルチタイル選択の場合と同様、ライン、長方形、またはバケツ塗りつぶしペイント モードで使用すると、パターンが繰り返されます。

ノート

TileMap エディターで編集しても、パターンは引き続き TileSet リソースに保存されます。これにより、外部ファイルに保存された TileSet リソースをロードした後、さまざまな TileMap ノードでパターンを再利用できます。

Terrainを使用したタイル結合の自動処理¶

テレインを使用するには、TileMap ノードに少なくとも 1 つのテレイン セットと、そのテレイン セット内の 1 つのテレインが必要です。TileSet の地形セットを作成していない場合は、「地形セットの作成 (自動タイル)」を参照してください。

地形接続には 3 つの描画モードがあります。

  • Connect : タイルが同じ TileMap レイヤー上の周囲のタイルに接続されます。

  • タイルが同じストロークで描画されたタイルに接続されるパス(マウス ボタンを放すまで)。

  • タイル固有のオーバーライドにより、競合を解決したり、地形システムでカバーされない状況を処理したりできます。

Connect モードの方が使いやすいですが、Path の方がアーティストがペイント プロセスをより詳細に制御できるため、より柔軟です。たとえば、Path では道路を接続せずに直接隣接させることができますが、Connect では 2 つの道路を強制的に接続します。

TileMapエディターの Terrain タブで結合モードを選択¶

TileMapエディターの Terrain タブでパスモードを選択する¶

最後に、地形から特定のタイルを選択して、特定の状況での競合を解決できます。

TileMapエディターの Terrain タブで特定のタイルを使用した描画¶

少なくとも 1 つのビットが対応する地形 ID の値に設定されているタイルは、選択用のタイル リストに表示されます。

不足しているタイルの処理¶

TileMap で参照されている TileSet 内のタイルを削除すると、TileMap には無効なタイル ID が配置されたことを示すプレースホルダーが表示されます。

TileSet 参照が壊れているため、TileMap エディターにタイルが表示されない¶

これらのプレースホルダーは実行中のプロジェクトには表示されませんが、タイル データはディスクに保存されます。これにより、そのようなシーンを安全に閉じたり再度開いたりすることができます。一致する ID を持つタイルを再度追加すると、それらは新しいタイルとして表示されます。

ノート

欠落しているタイル プレースホルダーは、TileMap ノードを選択して TileMap エディターを開くまで表示されない場合があります。

おすすめ

転載: blog.csdn.net/drgraph/article/details/130815479