37 lines
1.4 KiB
GDScript
37 lines
1.4 KiB
GDScript
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)
|