start with swarm units
This commit is contained in:
36
swarm_engine/swarm_unit/multi_mesh_instance_3d.gd
Normal file
36
swarm_engine/swarm_unit/multi_mesh_instance_3d.gd
Normal 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)
|
||||
10
swarm_engine/swarm_unit/swarm_unit.gd
Normal file
10
swarm_engine/swarm_unit/swarm_unit.gd
Normal 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
|
||||
Reference in New Issue
Block a user