feat: add nearby social interactions

This commit is contained in:
ANG-Server
2026-07-21 22:19:41 +08:00
parent 0bab768b14
commit 9dee47492c
43 changed files with 1499 additions and 77 deletions

View File

@@ -18,6 +18,7 @@ class_name NPCController
signal interaction_happened(text: String)
const CHAT_BUBBLE_SCENE: PackedScene = preload("res://scenes/ui/ChatBubble.tscn")
const InteractionAnchorUtil = preload("res://_Core/utils/InteractionAnchor.gd")
const CHAT_BUBBLE_LAYER_NAME: String = "WorldChatBubbleLayer"
const CHAT_BUBBLE_TARGET_OFFSET: Vector2 = Vector2(0, -84)
const NPC_TALKED_EVENT: String = "npc_talked"
@@ -34,12 +35,14 @@ const NAMEPLATE_VISUAL_CHAR_WIDTH: int = 12
@export_multiline var dialogue: String = "欢迎来到WhaleTown我是镇长范鲸晶"
@export var showNameplate: bool = false
@export var nameplateOffsetY: float = -112.0
@export var interactionDistance: float = 150.0
@onready var animation_player: AnimationPlayer = $AnimationPlayer
var _nameplate: Label
func _ready() -> void:
add_to_group("whaletown_interactable")
# 播放场景里配置好的待机动画,让不同 NPC 可以复用同一个控制器。
if animation_player.has_animation("idle"):
animation_player.play("idle")
@@ -63,7 +66,20 @@ func interact() -> void:
"npc_name": npcName,
"dialogue": dialogue
})
interaction_happened.emit(dialogue)
interaction_happened.emit(dialogue)
func get_interaction_actions(player: Node2D) -> Array[Dictionary]:
var anchor_position: Vector2 = InteractionAnchorUtil.get_position(self)
var distance: float = anchor_position.distance_to(player.global_position)
if distance > interactionDistance:
return []
return [{
"id": "npc:%s" % get_instance_id(),
"title": "%s 交谈" % npcName,
"distance": distance,
"priority": 40,
"callback": Callable(self, "interact"),
}]
# 在 NPC 头顶生成一次性聊天气泡。
#