export target variables and made a targetable interface

This commit is contained in:
2026-01-21 14:21:47 +01:00
parent 04121f18a4
commit fb78add739
7 changed files with 41 additions and 16 deletions

View File

@@ -0,0 +1,8 @@
using Godot;
namespace Movementtests.interfaces;
public interface ITargetable
{
Vector3 GetTargetGlobalPosition();
}

View File

@@ -0,0 +1 @@
uid://c7t7d18oi72pj

View File

@@ -446,6 +446,7 @@ layout_mode = 2
[node name="EnemyTarget" type="TextureRect" parent="UI"] [node name="EnemyTarget" type="TextureRect" parent="UI"]
unique_name_in_owner = true unique_name_in_owner = true
modulate = Color(0.9882353, 0, 0.10980392, 1)
layout_mode = 1 layout_mode = 1
anchors_preset = 8 anchors_preset = 8
anchor_left = 0.5 anchor_left = 0.5

View File

@@ -29,8 +29,10 @@ public partial class PlayerUi : Control
var (state, position) = targetProperties; var (state, position) = targetProperties;
var visible = state != TargetState.NoTarget; var visible = state != TargetState.NoTarget;
var modulation = state == TargetState.TargetInRange ? new Color("ffffff") : new Color("fc001c");
_enemyTarget.SetVisible(visible); _enemyTarget.SetVisible(visible);
_enemyTarget.SetPosition(position); _enemyTarget.SetPosition(position - _enemyTarget.Size / 2);
_enemyTarget.SetModulate(modulation);
} }

View File

@@ -71,16 +71,18 @@ public partial class PlayerController : CharacterBody3D,
[Export] public Marker3D TutorialWeaponTarget; [Export] public Marker3D TutorialWeaponTarget;
[Export] public bool TutorialDone { get; set; } [Export] public bool TutorialDone { get; set; }
// Combat stuff
[ExportCategory("Combat")] [ExportCategory("Combat")]
[ExportGroup("Damage")] [ExportGroup("Damage")]
[Export] [Export] public RDamage RDamage { get; set; }
public RDamage RDamage { get; set; } [Export] public RKnockback RKnockback { get; set; }
[Export] public RHealth RHealth { get; set; }
[Export] [Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public RKnockback RKnockback { get; set; } public float TargetingDistance { get; set; } = 10.0f;
[Export] [Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public RHealth RHealth { get; set; } public float TargetInRangeDistance { get; set; } = 5.0f;
// Movement stuff // Movement stuff
[ExportCategory("Movement")] [ExportCategory("Movement")]
@@ -355,6 +357,7 @@ public partial class PlayerController : CharacterBody3D,
// General use stuff // General use stuff
PlayerUi = GetNode<PlayerUi>("UI"); PlayerUi = GetNode<PlayerUi>("UI");
_closeEnemyDetector = GetNode<ShapeCast3D>("%CloseEnemyDetector"); _closeEnemyDetector = GetNode<ShapeCast3D>("%CloseEnemyDetector");
_closeEnemyDetector.TargetPosition = _closeEnemyDetector.TargetPosition.Normalized() * TargetingDistance;
// DashIndicator = GetNode<TextureRect>("%DashIndicator"); // DashIndicator = GetNode<TextureRect>("%DashIndicator");
PowerCooldownIndicator = GetNode<ColorRect>("%DashCooldownIndicator"); PowerCooldownIndicator = GetNode<ColorRect>("%DashCooldownIndicator");
@@ -1831,15 +1834,18 @@ public partial class PlayerController : CharacterBody3D,
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
return; return;
} }
var collidedObject = _closeEnemyDetector.GetCollider(0); var collidedObject = _closeEnemyDetector.GetCollider(0);
if (collidedObject is not Node3D target) if (collidedObject is not ITargetable target)
{ {
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
return; return;
} }
enemyTargetState = PlayerUi.TargetState.TargetInRange; var targetPos = target.GetTargetGlobalPosition();
positionOnScreen = _camera.UnprojectPosition(target.GlobalPosition); var targetDistance = targetPos.DistanceTo(GlobalPosition);
enemyTargetState = targetDistance > TargetInRangeDistance ? PlayerUi.TargetState.TargetInRange : PlayerUi.TargetState.TargetTooFar;
positionOnScreen = _camera.UnprojectPosition(targetPos);
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
} }

View File

@@ -10,7 +10,8 @@ public partial class Enemy : CharacterBody3D,
IKillable, IKillable,
IMoveable, IMoveable,
ISpawnable, ISpawnable,
IKnockbackable IKnockbackable,
ITargetable
{ {
// Signals and events // Signals and events
public event Action<IDamageable, DamageRecord> DamageTaken; public event Action<IDamageable, DamageRecord> DamageTaken;
@@ -156,4 +157,11 @@ public partial class Enemy : CharacterBody3D,
if (CKnockback is null) return Vector3.Zero; if (CKnockback is null) return Vector3.Zero;
return CKnockback.ComputeKnockback(); return CKnockback.ComputeKnockback();
} }
public Vector3 GetTargetGlobalPosition()
{
var target = GetNode<Node3D>("CTarget");
if (target is null) return GlobalPosition;
return target.GlobalPosition;
}
} }

View File

@@ -38,18 +38,14 @@ albedo_color = Color(0.06469653, 0.06469653, 0.06469653, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_4yfjf"] [sub_resource type="BoxShape3D" id="BoxShape3D_4yfjf"]
size = Vector3(1, 2, 1.5) size = Vector3(1, 2, 1.5)
[node name="GroundedEnemy" type="CharacterBody3D" node_paths=PackedStringArray("CHealth", "CDamage", "CKnockback", "CMovement")] [node name="GroundedEnemy" type="CharacterBody3D"]
collision_layer = 16 collision_layer = 16
collision_mask = 273 collision_mask = 273
script = ExtResource("1_r6506") script = ExtResource("1_r6506")
CHealth = NodePath("CHealth")
RHealth = ExtResource("2_w4lm8") RHealth = ExtResource("2_w4lm8")
DeathEffects = Array[Object]([]) DeathEffects = Array[Object]([])
CDamage = NodePath("CDamageable")
RDamage = ExtResource("2_bn56u") RDamage = ExtResource("2_bn56u")
CKnockback = NodePath("CKnockback")
RKnockback = ExtResource("11_8k3xb") RKnockback = ExtResource("11_8k3xb")
CMovement = NodePath("CMovement")
RMovement = ExtResource("4_na24f") RMovement = ExtResource("4_na24f")
[node name="CHealth" type="Node" parent="."] [node name="CHealth" type="Node" parent="."]
@@ -68,6 +64,9 @@ WallInFrontRayCast = NodePath("../WallInFrontRayCast")
[node name="CKnockback" parent="." instance=ExtResource("10_jqqi6")] [node name="CKnockback" parent="." instance=ExtResource("10_jqqi6")]
[node name="CTarget" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_62kkh") shape = SubResource("CapsuleShape3D_62kkh")