[Godot] 闪退记录:RigidBody2D 和 RigidBody2D 或 Area2D 相碰后触发 body_entered 绑定的方法后闪退

462 阅读1分钟

发现一个运行问题,RigidBody2D 和 RigidBody2D 或 Area2D 相碰后触发 body_entered 绑定的方法后闪退

这是我发生闪退时大概的布局,但是我新建一个项目,摆出这个场景试图复现的时候没成功,不会闪退……我不知道怎么回事

所有 RigidBody2D 都开启了 contact_monitor 都设置了 contacts_reported = 10

情况 1:RigidBody2D 和 RigidBody2D 下挂着的 Area2D

image.png

Player 和 Target 都是 RigidBody2D,Target 下面挂一个范围略大于自身的 Area2D

脚本为:

Player.gd

extends RigidBody2D

var input_dir : Vector2 = Vector2.ZERO
export var speed : float = 200.0

func _input(event: InputEvent):
	var move_x : float = Input.get_axis("ui_left", "ui_right")
	var move_y : float = Input.get_axis("ui_up", "ui_down")
	input_dir = Vector2(move_x, move_y).normalized()

func _integrate_forces(state):
	if input_dir != Vector2.ZERO:
		linear_velocity = lerp(linear_velocity, input_dir * speed, 0.1)

TargetArea2D.gd

extends Area2D

func _ready():
	connect("body_entered", self, "test_func")

func test_func(node):
	if node.name == "Player":
		print("test_func")

情况 2:RigidBody2D 和 RigidBody2D

或者不用 Area2D,直接用 RigidBody2D 的碰撞

Target.gd

extends RigidBody2D

func _ready():
	connect("body_entered", self, "test_func")

func test_func(node):
	if node.name == "Player":
		print("test_func")

这两种情况在我的游戏中都会闪退……

但是我自己摆复现场景就是复现不出来……所以估计是我其他代码的干扰……?

也没找到类似的 issue

解决方法:使用 get_colliding_bodies 检测碰撞物体

例如 Target 的脚本为:

Target.gd

extends RigidBody2D

func _process(delta):
	var colliders : Array = get_colliding_bodies()
	for collider in colliders:
		if collider.name == "Player":
			finish_level()
		
func finish_level():
	GlobalLevelConst.game_root.scene_manager.load_salute()