投稿

6月, 2025の投稿を表示しています

ノードをまとめて選択、一度でインスペクターの設定変更ができる

イメージ
 ドット絵を使うため、スプライトシートを登録するsprite2Dノードの、インスペクター >texture > filter、を、初期値のinheritから、nearestに変更する、ということを良くやっています。 複数のsprite2Dノードについて、1個ずつ設定変更するのが面倒でした。 しかし、以下のように、shiftキーを押しながらクリックすると、範囲選択できます。 (離れた場所にある場合、ctrlキーを押しながらクリックすると、追加選択) この状態でインスペクターでnearestに設定変更をすると、選択した全ノードについて、まとめて設定を変更する事ができます。

CollisionPolygon2D)ポリゴンポイントが同じフレーム内で変化する時、侵入を検知できなくなる

イメージ
 以下のように、放射状のポリゴンの衝突エリア(赤色部分)を、CollisionPolygon2Dで用意、AnimationPlayerで、左に扇風機のように回すものを用意しようとしていました。 このエリアにプレイヤーがぶつかると、ダメージをもらうようにしていました。 しかし、衝突を判定できないのか、ダメージが発生しません。 数フレームおきにポリゴンの角の位置を設定、その間を以下のように継続で埋めていたのですが、それがまずいようでした。 プレイングに影響しそうですが、以下右下のプルダウンで、継続を離散、に変更すると、判定できるようになり、ダメージが入るようになりました。 エンジン側の問題と思われ、はっきりとした原因はわかりませんが、おそらく、ポリゴンの定義が変わる度に衝突を再判定しようとして、判定できなくなるのでしょうか・・・ 以下サイトに記載がありました。 https://www.reddit.com/r/godot/comments/1gchqyx/collisionpolygon2d_wont_detect_anything/ このケースであれば、ポリゴンを変えずに、rotationなどで角度だけずらせれば良いのかもしれません。

複数のシーンが、1個のシーンに影響する際の注意

イメージ
 NPCにあるボタンで話しかけたら、以下のように、画面下部の会話欄(ユーザインタフェイス(UI)のシーンの一部)に会話を表示する、という機能を作りました。 同じボタンを押すと会話欄が閉じる・NPCからプレイヤーが離れていても会話欄が閉じる、という仕組みにしました。 ↓UIの会話欄に会話を表示 (左側に表示予定の顔画像はまだ作っておらず、適当な画像になっています) しかし、NPCを2体配置したところ、会話すると、一瞬欄が開きましたが、すぐ閉じてしまう状況に。 これは当たり前といえば当たり前ですが、まだ会話していないNPCのプログラム側で、プレイヤーが離れている、と判断され、欄が閉じられてしまっていました。しかし、しばらく気づかず、迷うはめに・・・。常時プレイヤーが離れているかチェック、会話欄を非表示にするようになってしまっていたので(これ自体今回の問題がなくても負荷が高く良くないです)、そうではなく、離れた瞬間のみ非表示にするよう直しました。 各NPCに吹き出しのように会話を表示する場合、その吹き出しは各々のNPCの部品なので、別々の挙動で問題ないのですが、UIの会話欄は1個のシーンで、異なるNPCが同じ会話欄を制御しようとします。 プログラムの所属するシーン以外のシーン、しかもそれが1個しかなく、他と共有して制御する場合は、注意が必要でした。

remove_childだけだと、子ノードが消えていない

イメージ
今、ゲーム中に、 2人のキャラクターを切り替えれるようなゲームを作っています。 それで、親にMPCという切替用のシーンを用意、add_child()で、一人目のシーンplayerを出す。切り替えボタンを押すと、2人目のシーンplayer2を出す。さらに切り替えボタンを押すと、1里目のplayerを出す、後同様にいくらでも切り替え可能・・・といった仕組みを作っていました。 切り替えの際、切り替え前のplayerのシーンは消さないと、2重にplayerが出てしまいます。 それで、remove_child()、を使って、以前のplayerを消していました。 1見するとできているのですが、ゲームオーバー時の処理(ここではstop_all、ゲームオーバーのトリガーが飛んで、player、player2各々のシーンで行われる )が一部おかしい。調べてみると、ゲームオーバー時、1度だけ行われる処理が、何度も行われていました。プレイ中のキャラ切替回数が多いほど、ゲームオーバーの処理が増えていました。 ↓処理の箇所にprintを入れてコンソールに出したもの。 2回プレイ中にキャラを切り替えると、ゲームオーバー時、1回のはずの停止処理(stop_all)が、2回増えてしまっていた・・・ 結局、消したと思っていたplayerシーンが残っていて、切り替えるとその分playerシーンが何人も増えてしまい、その全てのシーンの中で、ゲームオーバーの処理が行われてたのでした。 調べてみると、add_childで追加したシーンを消すには、remove_childだけでなく、queue_freeも必要なようです・・・ ↓2行目が追加した、queue_freeの行 ↓queue_freeを追加すると、1回の処理のみになりました。 以下のサイトを見つけて、わかりました。 https://scrapbox.io/kidaaam-92022284/Godot:_%E5%AD%90%E8%A6%81%E7%B4%A0%E3%82%92%E6%B6%88%E3%81%99%E6%99%82%E3%81%AF%E3%80%81remove_child()_%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89_queue_free() remove_child、なのだから、子のノード(child)...