Как изменить размер и форму CollisionShape (3D) во время выполнения?

Я пытаюсь сделать свою игру более динамичной, сделав масштабируемые хитбоксы атаки. Однако при добавлении новой формы к текущей CollisionShape он показывает правильный радиус при печати, но радиус в игре не соответствует новому значению.

В настоящее время я использую следующий код:

var shape = CylinderShape.new()
shape.set_radius(new_radius)
shape.set_height(new_height)

$Spatial/CollisionShape.shape = shape

При запуске я попытался распечатать текущий CollisionShape.shape.radius, и он показал новый номер, однако в игре collisionshape все еще старая форма и ничего не изменилось (как визуально с включенной опцией отладки, так и при проверке размера столкновения)

Итак, мой вопрос: как мне изменить форму или размер фигуры во время выполнения.

То, что я уже пробовал:

$Spatial/CollisionShape.shape.radius = new_radius
$Spatial/CollisionShape.shape.height = new_height

К сожалению, это дало тот же результат. Я также попытался сделать фигуру нулевой, прежде чем помещать новую фигуру в CollisionShape. Это тоже ничего не изменило.

Я что-то упускаю?


person Koen Dekker    schedule 12.06.2020    source источник
comment
Я немного поискал и нашел кучу разговоров о том, что CollisionShape является ПОМОЩНИКАМИ РЕДАКТОРА, и об использовании CollisionObject.shape_owner_get_shape для доступа к реальной внутриигровой форме. Это из официальных документов Годо - docs.godotengine.org/en/stable/classes /. Когда я попытался найти дополнительную информацию о владельцах форм, оказалось, что об этом очень мало и неудовлетворительно документации.   -  person Christopher Bennett    schedule 13.06.2020
comment
Лучшие ссылки, которые я нашел, находятся здесь: godotengine.org/qa/ 6756 / - и здесь - reddit.com/r/godot / comments / bngrvn /   -  person Christopher Bennett    schedule 13.06.2020
comment
Вы все еще меняете форму столкновения где-нибудь еще? Я сделал быстрый тестовый проект с вашим фрагментом кода, и я, по крайней мере, могу увидеть, как меняется форма.   -  person René Kling    schedule 13.06.2020
comment
Спасибо за предложения, я разберусь!   -  person Koen Dekker    schedule 14.08.2020


Ответы (1)


Похоже, что невозможно обновить форму коллизии; вам нужно создать новый. Я решил это так, где у меня есть CSGBox, которому принадлежит StaticBody, которому принадлежит CollisionShape, и я хочу, чтобы форма столкновения статического тела соответствовала CSGBox:

var box : BoxShape = BoxShape.new()
box.extents.x = self.width/2
box.extents.y = self.height/2
box.extents.z = self.depth/2

$StaticBody/CollisionShape.shape = box

(Этот скрипт прикреплен к CSGBox).

person Steve Smith    schedule 21.05.2021