Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends CharacterBody2D
- signal path_changed(path : PackedVector2Array)
- @export var walk_speed := 200.0
- @onready var _agent : NavigationAgent2D = null
- var _velocity := Vector2.ZERO
- var target = null
- func _ready():
- for child in self.get_children():
- if child.get_class() == "NavigationAgent2D":
- _agent = child
- break
- if _agent == null:
- _agent = NavigationAgent2D.new()
- self.add_child(_agent)
- if _agent != null:
- set_target_location(self.position)
- _agent.path_changed.connect(_on_path_changed)
- _agent.velocity_computed.connect(_on_velocity_computed)
- _agent.target_reached.connect(_on_target_reached)
- _agent.max_speed = walk_speed
- _agent.avoidance_enabled = true
- func set_target_location(mouse_target: Vector2) -> void:
- _agent.set_target_location(mouse_target)
- target = _agent.get_final_location()
- func _physics_process(delta):
- if not visible and not target: return
- var target_global_position := _agent.get_next_location()
- var direction := self.global_transform.origin.direction_to(target_global_position)
- var desired_velocity := direction * _agent.max_speed
- var steering = (desired_velocity - _velocity) * delta * 4.0
- _velocity += steering
- _agent.set_velocity(_velocity)
- func _on_path_changed():
- var path = _agent.get_nav_path()
- self.path_changed.emit(path)
- func _on_velocity_computed(safe_velocity):
- velocity = safe_velocity
- if not _agent.is_navigation_finished():
- # move the player, if not finished
- move_and_slide()
- else:
- self.global_transform.origin = NavigationServer2D.map_get_closest_point(_agent.get_navigation_map(), self.global_transform.origin)
- func _on_target_reached():
- print(["_on_target_reached"])
- self.path_changed.emit([])
- target = null;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement