Я пытаюсь вызвать печать, когда CharacterBody2D сталкивается со StaticBody2D. Я очень новичок в Годо, пожалуйста, потерпите меня
У меня получилось 3 сцены game_level, CharacterBody2D (игрок), StaticBody2D (предмет). В game_level я создал дочерний Player и Item.
В настоящее время я прикрепил этот скрипт к StaticBody2D (элемент):
extends StaticBody2D
func _ready():
print("ready")
func _on_StaticBody2D_body_entered(body):
print("Static body collided with: ", body.name)
Я попытался изменить Collision Layer & Mask для CharacterBody2D и StaticBody2D следующим образом:
Просто наткнулся, но без отпечатков
CharacterBody2D || StaticBody2D
Collision>Layer = 1 || Collision>Layer = 1
Collision>Mask = 1 || Collision>Mask = 1
Только что прошел, а отпечатков нет.
CharacterBody2D || StaticBody2D
Collision>Layer = 1 || Collision>Layer = 2
Collision>Mask = 1 || Collision>Mask = 2
Просто наткнулся, но без отпечатков
CharacterBody2D || StaticBody2D
Collision>Layer = 1 || Collision>Layer = 2
Collision>Mask = 1 & 2 || Collision>Mask = 1 & 2
Версия Годо: Godot_v4.0.1-stable_win64
В Godot Node
есть сигналы, которые вы можете подключить из редактора или из кода. Для их работы необходимо подключить сигнал.
Я знаю, что ты не подключил сигнал body_entered
своего StaticBody2D
.
Создание метода с именем, совпадающим с именем, которое сгенерировал бы Godot — в данном случае _on_StaticBody2D_body_entered
— не работает.
Вы можете увидеть, распознал ли Godot, что метод имеет подключенный сигнал, потому что он показывает зеленый значок слева от объявления метода в редакторе кода.
Пожалуйста, обратитесь к Использование сигналов
Я знаю, что ты не подключил сигнал body_entered
своего StaticBody2D
... Потому что у StaticBody2D
нет сигнала body_entered
.
Это можно обойти. Некоторые подходы я изложил в другом месте. И я не буду повторять их здесь.
С учетом сказанного, я рекомендую вместо этого использовать не StaticBody2D
, а Area2D
.
Если вам нужно, чтобы это был StaticBody2D
, то я предлагаю добавить дочерний элемент Area2D
к StaticBody2D
и использовать его для обнаружения столкновений (это один из вариантов, который я упоминаю в другом месте).
Для полноты картины я также упомяну, что вы можете определить, с чем столкнулся CharacterBody2D
. Так:
for index in get_slide_collision_count():
var collision := get_slide_collision(index)
prints(collision.get_collider())
Этого должно быть достаточно для случая CharacterBody2D
и StaticBody2D
, которые не двигаются※, потому что, если StaticBody2D
не движется, он не столкнется с CharacterBody2D
(другими словами, столкновение будет результатом движения CharacterBody2D
).
※: Рекомендуемый способ перемещения платформ в Godot 4 — это AnimatableBody2D
, которые являются StaticBody2D
.
@FurtiveStranger Во-первых, знайте, что CharacterBody2D
не обнаружит столкновение с чем-то, что с ним сталкивается (например, ``RigidBody2D). So for the case of a bullet or an enemy attack. Second, similarly to adding a
Area2D` с StaticBody2D
, вы можете добавить Area2D
к CharacterBody2D
. Оттуда это вопрос архитектуры. Если вы справитесь со всем на CharacterBody2D
код может стать большим и с ним будет трудно работать, также, когда вы меняете другую сцену, вам, возможно, придется обновить код и на CharacterBody2D
Так что часто лучше обрабатывать его на другой стороне.
Спасибо вам большое за это. Итак, прямо сейчас я могу либо обнаружить столкновение с
CharacterBody2D
, либо изменить тип узлаStaticBody2D
наArea2D
(я сделал это, используяfunc _on_body_entered(body): print("Area2D collided with: ", body.name)
). Просто дополнительный вопрос, какой из них лучше? обнаруживать сталкивающиеся объекты через персонажа или область? еще раз спасибо