通过区域判断玩家是否"入圈", 通过RayCast2D判断玩家是否可以触及.
多个RayCast2D避免头或尾部份"暴露"而未有检测到.

extends Area2D
signal player_detecded(body: Node2D)
@onready var special_collision: CollisionPolygon2D = $specialCollision
@onready var raycasts = [$RayCast2D, $RayCast2D2, $RayCast2D3]
var player: Node2D
func _physics_process(delta: float) -> void:
if not player: return
if _is_detected(player):
player_detecded.emit(player)
player = null
func _is_detected(player):
raycasts[0].look_at(player.global_position - 16 * transform.y)
raycasts[1].look_at(player.global_position)
raycasts[2].look_at(player.global_position + 16 * transform.y)
for raycast: RayCast2D in raycasts:
if raycast.is_colliding():
if raycast.get_collider().is_in_group("player"):
print("发现玩家")
return true
return false
func _on_body_entered(body: Node2D):
if body.is_in_group("player"):
print("玩家进圈")
player = body
func _on_body_exited(body:Node2D):
if body.is_in_group("player"):
print("玩家出圈")
player = null
func set_color(color):
special_collision.change_color(color)

打赏