extends MultiMeshInstance3D @export var move_speed = 2 @export var number: int = 100 @export var stretch: int = 2 @onready var flow_field_navigation: FlowFieldNav = %FlowFieldNavigation @onready var player: Player = %player func _ready() -> void: for x in range(number): for z in range(number): var index = z * number + x self.multimesh.set_instance_transform(index, Transform3D(Basis(), Vector3(x * stretch, 0.0, -z * stretch))) func _process(delta: float) -> void: for x in range(number): for z in range(number): var index = z * number + x var current_trans = self.multimesh.get_instance_transform(index) var cell = flow_field_navigation.get_cell_from_pos(current_trans.origin) if cell != null and cell.flow_direction.length() > 0.0: var movement = cell.flow_direction.normalized() * move_speed * delta current_trans.origin += movement var direction_to_player = (player.position - current_trans.origin).normalized() var target_rotation_y = Quaternion(Vector3.UP, atan2(-direction_to_player.x, -direction_to_player.z)) var fix_rotation_x = Quaternion(Vector3.RIGHT, deg_to_rad(-90)) var fix_rotation_y_180 = Quaternion(Vector3.UP, deg_to_rad(180)) var final_rotation = fix_rotation_y_180 * target_rotation_y * fix_rotation_x current_trans.basis = Basis(final_rotation) self.multimesh.set_instance_transform(index, current_trans)