start with swarm units

This commit is contained in:
2025-03-02 12:06:08 +01:00
parent 19cc3a1888
commit 5301cfa598
5 changed files with 33 additions and 4 deletions

View File

@@ -0,0 +1,36 @@
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)

View File

@@ -0,0 +1,10 @@
extends CharacterBody3D
@export var move_speed = 2
@export var flow_field_navigation: FlowFieldNav
func _physics_process(delta: float) -> void:
var flow_direction = flow_field_navigation.get_direction_from_position(position)
if flow_direction.length() > 0.0:
var movement = flow_direction.normalized() * move_speed * delta
position += movement