Godot4 ビッグカツブロック崩し5 複製で共有されたリソースをユニーク化

※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。

昔から人気の駄菓子「ビッグカツ」フリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。

「ビッグカツブロック崩し」作成の第5回では、前回作った左側の壁のノード群を複製して、残りの上側と右側の壁を作成する手順と、その複製で発生した、当たり判定領域を設定するRectangleShape2D リソース共有による問題と、その問題を解決するユニーク化について紹介します。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

前回の記事

前回は、左側の壁の表示サイズや向きを調整して、その後、それに合わせて当たり判定領域を設定しました。

作った左側の壁を複製して、上側右側の壁を作る

前回作成した左側の壁は、以下のようなノード構成です。

  • StaticBody2D (動かない剛体を表現するノード)
    • TextureRect絵をタイル状に並べたりして表示するノード)
    • CollisionShape2D衝突する領域を図形で定義するノード)

この中で一番上位の StaticBody2D (WallLeft) ノードを右クリックして表示されるメニュー「複製」でノード群の構成や各設定を複製することで、簡単にもう2つの壁を作ることができます。

各壁は、位置やサイズは異なるので、画像をタイル状に表示する、それぞれの TextureRect ノード選択して、2D ワークスペースで位置や向きやサイズを変更して、上側の壁と右側の壁として調整します。

Godot4 ビッグカツブロック崩し 壁を上右左に配置したステージのシーンの作成16

ノードの複製による問題

続いて、当たり判定領域を設定する CollisionShape2D ノードの四角形の領域も、壁の画像に合わせて調整します。
しかし、ここで問題が発生しました。
当たり判定の領域を調整すると、他の壁の当たり判定領域も変化してしまいます。

Godot4 ビッグカツブロック崩し 壁を上右左に配置したステージのシーンの作成 複製したノード内のリソースをユニーク化して連動を防ぐ

これは、ノードの複製・コピーをした際に、CollisionShape2D ノードの shpae プロパティに割り当ててある四角形の情報を持つ RectangleShape2D リソースが、複製した3つの壁で共有されていることが原因でした。
C++ の浅いコピー・深いコピー (Shallow copy / Deep copy) と似た感じかもしれません。

Resources are passed by reference (as any object in Godot).

When you “duplicate” an object (a node for example), all properties are copied to the new instance, but resources are “shared” between those two instances, so, if you modify the resource from Object A, you’ll see the same changes on the resource of Object B, because they share the same resource.

Make unique ensures that the selected resource is unique, this means that is not longer shared with the other instances and modifying it will not affect the other objects.

リソースは (Godot 内のオブジェクトとして) 参照によって渡されます。

オブジェクト (ノードなど) を「複製」すると、すべてのプロパティが新しいインスタンスにコピーされますが、リソースはこれら 2 つのインスタンス間で「共有」されるため、オブジェクト A からリソースを変更すると、オブジェクト B のリソースは同じリソースを共有しているため、同じ変更が行われます。

[一意にする] は、選択したリソースが一意であることを保証します。これは、そのリソースが他のインスタンスと共有されなくなり、リソースを変更しても他のオブジェクトに影響を与えないことを意味します。
What does “make unique” do? – Godot Forums と Google 翻訳

複製で共有された当たり判定領域のリソースをユニーク化

複製された複数の CollisionShape2D ノードで、 shape プロパティの RectangleShape2D リソースが共有されていては、当たり判定領域を個別に設定することができません

このリソースの共有を解除するために、複製した上側の壁CollisionShape2D ノードをシーンドックで選択して、インスペクタードックの Shape プロパティのリストを開いて「ユニーク化」を選択します。

Godot4 ビッグカツブロック崩し 壁を上右左に配置したステージのシーンの作成 複製したノード内のリソースをユニーク化して連動を防ぐ2

以上で、コピー・複製した CollisionShape2D ノードの Shape に設定してあるリソースの共有が解除され、それぞれ個別に設定することが可能になりました。

右側の壁でも同様にリソースのユニーク化を行うことで、3つの壁の当たり判定領域をそれぞれ個別設定できるようになりました。

Godot4 ビッグカツブロック崩し 壁を上右左に配置したステージのシーンの作成 複製したノード内のリソースをユニーク化して連動を防ぐ3

リソースのユニーク化の確認

それぞれの当たり判定領域のリソースをユニーク化した後に、壁ごとに当たり判定領域を調整すると、他の壁の当たり判定領域が影響を受けず、個別に設定できるようになりました。

まとめ

「ビッグカツブロック崩し」作成の第5回では、前回作った左側の壁のノード群を複製して、残りの上側と右側の壁を作成する手順と、その複製で発生した、当たり判定領域を設定するRectangleShape2D リソース共有による問題と、その問題を解決するユニーク化について紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました