发现一个运行问题,RigidBody2D 和 RigidBody2D 或 Area2D 相碰后触发 body_entered 绑定的方法后闪退
这是我发生闪退时大概的布局,但是我新建一个项目,摆出这个场景试图复现的时候没成功,不会闪退……我不知道怎么回事
所有 RigidBody2D 都开启了 contact_monitor 都设置了 contacts_reported = 10
情况 1:RigidBody2D 和 RigidBody2D 下挂着的 Area2D
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()