remove test_unit and make proper unit hierarchy

This commit is contained in:
2024-10-06 07:05:26 +10:00
parent 9a2cdb7c40
commit 9ae09aad13
4 changed files with 55 additions and 43 deletions

View File

@@ -1,8 +1,8 @@
[gd_scene load_steps=6 format=3 uid="uid://cfixshlmwhpmi"] [gd_scene load_steps=6 format=3 uid="uid://cfixshlmwhpmi"]
[ext_resource type="Script" path="res://scripts/units/test_unit.gd" id="1_e76lg"]
[ext_resource type="PackedScene" uid="uid://bi231xk2sp410" path="res://assets/models/ant.glb" id="1_ff64u"] [ext_resource type="PackedScene" uid="uid://bi231xk2sp410" path="res://assets/models/ant.glb" id="1_ff64u"]
[ext_resource type="Texture2D" uid="uid://dehqm00kiljut" path="res://assets/textures/selection_unit_decal.png" id="2_5725f"] [ext_resource type="Texture2D" uid="uid://dehqm00kiljut" path="res://assets/textures/selection_unit_decal.png" id="2_5725f"]
[ext_resource type="Script" path="res://scripts/units/controlled_unit.gd" id="2_gj6f7"]
[ext_resource type="Texture2D" uid="uid://duf132faskeid" path="res://assets/textures/selection_unit_hover_decal.png" id="4_umx1w"] [ext_resource type="Texture2D" uid="uid://duf132faskeid" path="res://assets/textures/selection_unit_hover_decal.png" id="4_umx1w"]
[sub_resource type="SphereShape3D" id="SphereShape3D_e8dcp"] [sub_resource type="SphereShape3D" id="SphereShape3D_e8dcp"]
@@ -10,7 +10,7 @@ radius = 0.25
[node name="TestUnit" instance=ExtResource("1_ff64u")] [node name="TestUnit" instance=ExtResource("1_ff64u")]
collision_mask = 0 collision_mask = 0
script = ExtResource("1_e76lg") script = ExtResource("2_gj6f7")
[node name="AnimationPlayer" parent="." index="1"] [node name="AnimationPlayer" parent="." index="1"]
deterministic = true deterministic = true
@@ -39,5 +39,3 @@ avoidance_enabled = true
height = 0.5 height = 0.5
radius = 0.25 radius = 0.25
neighbor_distance = 10.0 neighbor_distance = 10.0
debug_enabled = true
debug_use_custom = true

View File

@@ -106,12 +106,13 @@ func _set_selection_state(hover: bool) -> void:
unit.global_position unit.global_position
+ (Vector3.UP * UNIT_SELECT_OFFSET) + (Vector3.UP * UNIT_SELECT_OFFSET)
) )
if unit is TestUnit: if unit is ControlledUnit:
var controlled_unit := unit as ControlledUnit
if hover: if hover:
(unit as TestUnit).set_hovered(rect_abs.has_point(point)) controlled_unit.set_hovered(rect_abs.has_point(point))
else: else:
(unit as TestUnit).set_selected(rect_abs.has_point(point)) controlled_unit.set_selected(rect_abs.has_point(point))
(unit as TestUnit).set_hovered(false) controlled_unit.set_hovered(false)
func _on_frustrum_area_unit_entered(unit: Node3D) -> void: func _on_frustrum_area_unit_entered(unit: Node3D) -> void:

View File

@@ -0,0 +1,46 @@
extends Unit
class_name ControlledUnit
var selected: 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 _ready() -> void:
set_selected(false)
super._ready()
func _input(event: InputEvent) -> void:
if event is InputEventMouseButton and selected:
var button_event := event as InputEventMouseButton
if (
button_event.button_index == MOUSE_BUTTON_RIGHT
and button_event.pressed
):
_set_target_click(button_event.position)
func set_selected(on: bool) -> void:
selected = on
func _set_target_click(mouse_pos: Vector2) -> void:
var click_position := _click_raycast(mouse_pos)
if click_position == null:
return
nav_agent.set_target_position(click_position)
func _click_raycast(mouse_pos: Vector2) -> Vector3:
var from := camera.global_position
var to := camera.project_ray_normal(mouse_pos)
return ground_plane.intersects_ray(from, to)
func _animate(delta: float) -> void:
super._animate(delta)
selection_sprite.visible = selected

View File

@@ -1,22 +1,18 @@
extends CharacterBody3D extends CharacterBody3D
class_name TestUnit class_name Unit
const MOVE_SPEED: float = 3 const MOVE_SPEED: float = 3
const TURN_SPEED: float = 10 const TURN_SPEED: float = 10
var selected: bool = false
var hovered: bool = false var hovered: 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
@onready var hover_sprite: Sprite3D = $HoverSprite @onready var hover_sprite: Sprite3D = $HoverSprite
@onready var nav_agent: NavigationAgent3D = $NavigationAgent3D @onready var nav_agent: NavigationAgent3D = $NavigationAgent3D
@onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var animation_player: AnimationPlayer = $AnimationPlayer
func _ready() -> void: func _ready() -> void:
set_selected(false) set_hovered(false)
nav_agent.max_speed = MOVE_SPEED nav_agent.max_speed = MOVE_SPEED
nav_agent.velocity_computed.connect(_on_nav_agent_velocity_computed) nav_agent.velocity_computed.connect(_on_nav_agent_velocity_computed)
set_max_slides(2) set_max_slides(2)
@@ -32,37 +28,9 @@ func _physics_process(_delta: float) -> void:
_navigate() _navigate()
func _input(event: InputEvent) -> void:
if event is InputEventMouseButton and selected:
var button_event := event as InputEventMouseButton
if (
button_event.button_index == MOUSE_BUTTON_RIGHT
and button_event.pressed
):
_set_target_click(button_event.position)
func set_selected(on: bool) -> void:
selected = on
func set_hovered(on: bool) -> void: func set_hovered(on: bool) -> void:
hovered = on hovered = on
func _set_target_click(mouse_pos: Vector2) -> void:
var click_position := _click_raycast(mouse_pos)
if click_position == null:
return
nav_agent.set_target_position(click_position)
func _click_raycast(mouse_pos: Vector2) -> Vector3:
var from := camera.global_position
var to := camera.project_ray_normal(mouse_pos)
return ground_plane.intersects_ray(from, to)
func _navigate() -> void: func _navigate() -> void:
if nav_agent.is_navigation_finished(): if nav_agent.is_navigation_finished():
velocity = Vector3.ZERO velocity = Vector3.ZERO
@@ -89,7 +57,6 @@ func _animate(delta: float) -> void:
else: else:
animation_player.play('idle') animation_player.play('idle')
selection_sprite.visible = selected
hover_sprite.visible = hovered hover_sprite.visible = hovered