create AntNitwit class and make them wander
This commit is contained in:
38
scripts/units/ant_nitwit.gd
Normal file
38
scripts/units/ant_nitwit.gd
Normal file
@@ -0,0 +1,38 @@
|
||||
extends ControlledUnit
|
||||
class_name AntNitwit
|
||||
|
||||
enum AntNitwitState {
|
||||
WANDERING,
|
||||
MOVING,
|
||||
}
|
||||
|
||||
var state: AntNitwitState = AntNitwitState.WANDERING
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
super._ready()
|
||||
moving_started.connect(_on_moving_started)
|
||||
moving_ended.connect(_on_moving_ended)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
super._process(delta)
|
||||
if moving_to_target:
|
||||
state = AntNitwitState.MOVING
|
||||
|
||||
_handle_wandering(delta)
|
||||
|
||||
|
||||
func _handle_wandering(delta: float) -> void:
|
||||
if state != AntNitwitState.WANDERING:
|
||||
return
|
||||
|
||||
_wander(delta)
|
||||
|
||||
|
||||
func _on_moving_ended() -> void:
|
||||
state = AntNitwitState.WANDERING
|
||||
|
||||
|
||||
func _on_moving_started() -> void:
|
||||
state = AntNitwitState.MOVING
|
||||
@@ -1,13 +1,23 @@
|
||||
extends Unit
|
||||
class_name ControlledUnit
|
||||
|
||||
signal moving_started
|
||||
signal moving_ended
|
||||
|
||||
var selected: bool = false
|
||||
var moving_to_target: bool = false
|
||||
var ground_plane: Plane = Plane(Vector3.UP, 0)
|
||||
|
||||
@onready var camera: Camera3D = get_viewport().get_camera_3d()
|
||||
@onready var selection_sprite: Sprite3D = $SelectionSprite
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
max_wander_distance = 2
|
||||
min_wander_interval = 0.5
|
||||
max_wander_interval = 30
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
assert(camera != null, "camera missing!")
|
||||
assert(selection_sprite != null, "selection_sprite missing!")
|
||||
@@ -16,6 +26,13 @@ func _ready() -> void:
|
||||
super._ready()
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
super._physics_process(delta)
|
||||
if moving_to_target and nav_agent.is_navigation_finished():
|
||||
moving_to_target = false
|
||||
moving_ended.emit()
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if not is_on_screen:
|
||||
return
|
||||
@@ -26,6 +43,8 @@ func _input(event: InputEvent) -> void:
|
||||
button_event.button_index == MOUSE_BUTTON_RIGHT
|
||||
and button_event.pressed
|
||||
):
|
||||
moving_to_target = true
|
||||
moving_started.emit()
|
||||
_set_target_click(button_event.position)
|
||||
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@ class_name Unit
|
||||
const MOVE_SPEED: float = 3
|
||||
const TURN_SPEED: float = 10
|
||||
|
||||
const MAX_WANDER_DISTANCE: float = 5
|
||||
const MIN_WANDER_INTERVAL: float = 0.25
|
||||
const MAX_WANDER_INTERVAL: float = 5
|
||||
var max_wander_distance: float = 5
|
||||
var min_wander_interval: float = 0.25
|
||||
var max_wander_interval: float = 5
|
||||
|
||||
var hovered: bool = false
|
||||
var is_on_screen: bool = false
|
||||
@@ -94,13 +94,13 @@ func _wander(delta: float) -> void:
|
||||
wandering_timer -= delta
|
||||
if wandering_timer <= 0:
|
||||
var new_pos_offset := Vector3(
|
||||
randf_range(-MAX_WANDER_DISTANCE, MAX_WANDER_DISTANCE),
|
||||
randf_range(-max_wander_distance, max_wander_distance),
|
||||
0,
|
||||
randf_range(-MAX_WANDER_DISTANCE, MAX_WANDER_DISTANCE),
|
||||
randf_range(-max_wander_distance, max_wander_distance),
|
||||
)
|
||||
var new_pos := wandering_center + new_pos_offset
|
||||
nav_agent.set_target_position(new_pos)
|
||||
wandering_timer = randf_range(-MIN_WANDER_INTERVAL, MAX_WANDER_INTERVAL)
|
||||
wandering_timer = randf_range(-min_wander_interval, max_wander_interval)
|
||||
|
||||
|
||||
func _on_nav_agent_velocity_computed(safe_velocity: Vector3) -> void:
|
||||
|
||||
Reference in New Issue
Block a user