|
|
|
|
extends Node3D
|
|
|
|
|
class_name AI
|
|
|
|
|
|
|
|
|
|
@onready var character: Character = (get_owner() as Character)
|
|
|
|
|
@onready var status: Status = (%Status as Status)
|
|
|
|
|
@onready var btPlayer: BTPlayer = (%BTPlayer as BTPlayer)
|
|
|
|
|
|
|
|
|
|
var is_init: bool = false
|
|
|
|
|
|
|
|
|
|
func _process(delta) -> void:
|
|
|
|
|
if not is_init:
|
|
|
|
|
init()
|
|
|
|
|
else:
|
|
|
|
|
process(delta)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func init() -> void:
|
|
|
|
|
if not status.cfg:
|
|
|
|
|
return
|
|
|
|
|
is_init = true
|
|
|
|
|
var behavior_tree_res: BehaviorTree = status.cfg.get_ai()
|
|
|
|
|
if not behavior_tree_res:
|
|
|
|
|
print("未配置AI:", character.cfg().get_res_name())
|
|
|
|
|
btPlayer.queue_free()
|
|
|
|
|
return
|
|
|
|
|
btPlayer.behavior_tree = behavior_tree_res
|
|
|
|
|
on_init()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func process(delta) -> void:
|
|
|
|
|
if not status.ai_is_alert:
|
|
|
|
|
if status.cfg.ai:
|
|
|
|
|
var player: Character = Global.character_mgr.get_player()
|
|
|
|
|
var dir: Vector2 = player.pos2D() - character.pos2D()
|
|
|
|
|
var dist: float = dir.length()
|
|
|
|
|
var can_see: bool = character.get_face_dir().angle_to(dir) < PI / 2
|
|
|
|
|
var alert_range: float = status.cfg.ai.alert_range if can_see else status.cfg.ai.alert_range_back
|
|
|
|
|
var alert_speed: float = status.cfg.ai.alert_speed if can_see else status.cfg.ai.alert_speed_back
|
|
|
|
|
if dist < alert_range:
|
|
|
|
|
status.ai_alert += alert_speed * delta
|
|
|
|
|
status.emit_status("ai_alert")
|
|
|
|
|
if status.ai_alert >= status.ai_alert_max:
|
|
|
|
|
status.ai_is_alert = true
|
|
|
|
|
status.ai_alert = 0
|
|
|
|
|
status.emit_status("ai_is_alert")
|
|
|
|
|
status.emit_status("ai_alert")
|
|
|
|
|
else:
|
|
|
|
|
status.ai_alert -= status.cfg.ai.alert_recover * delta
|
|
|
|
|
if status.ai_alert < 0:
|
|
|
|
|
status.ai_alert = 0
|
|
|
|
|
status.emit_status("ai_alert")
|
|
|
|
|
else:
|
|
|
|
|
status.ai_is_alert = true
|
|
|
|
|
status.emit_status("ai_is_alert")
|
|
|
|
|
on_process(delta)
|
|
|
|
|
if btPlayer:
|
|
|
|
|
btPlayer.update(delta)
|
|
|
|
|
|
|
|
|
|
func on_init() -> void: pass
|
|
|
|
|
|
|
|
|
|
func on_process(_delta) -> void: pass
|