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()) Global.character_mgr.destroy_character(character.id()) 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) btPlayer.update(delta) func on_init() -> void: pass func on_process(_delta) -> void: pass