basic targeting system

This commit is contained in:
2026-01-21 12:32:58 +01:00
parent fa029b9e53
commit 04121f18a4
8 changed files with 115 additions and 14 deletions

View File

@@ -341,6 +341,9 @@ public partial class PlayerController : CharacterBody3D,
private bool _canAttack = true;
private readonly List<IDamageable> _hitEnemies = new List<IDamageable>();
private ShapeCast3D _closeEnemyDetector;
private Camera3D _camera;
public override void _Ready()
{
LoadSettings();
@@ -351,6 +354,8 @@ public partial class PlayerController : CharacterBody3D,
// General use stuff
PlayerUi = GetNode<PlayerUi>("UI");
_closeEnemyDetector = GetNode<ShapeCast3D>("%CloseEnemyDetector");
// DashIndicator = GetNode<TextureRect>("%DashIndicator");
PowerCooldownIndicator = GetNode<ColorRect>("%DashCooldownIndicator");
PowerCooldownIndicator.Visible = false;
@@ -366,7 +371,7 @@ public partial class PlayerController : CharacterBody3D,
// Camera stuff
HeadSystem = GetNode<HeadSystem>("HeadSystem");
Camera3D camera = GetNode<Camera3D>("HeadSystem/CameraSmooth/Camera3D");
_camera = GetNode<Camera3D>("HeadSystem/CameraSmooth/Camera3D");
Node3D cameraSmooth = GetNode<Node3D>("HeadSystem/CameraSmooth");
// Movement stuff
@@ -479,8 +484,8 @@ public partial class PlayerController : CharacterBody3D,
_gravity = (float)ProjectSettings.GetSetting("physics/3d/default_gravity");
MantleSystem.Init();
StairsSystem.Init(stairsBelowRayCast3D, stairsAheadRayCast3D, cameraSmooth);
DashSystem.Init(HeadSystem, camera);
WeaponSystem.Init(HeadSystem, camera);
DashSystem.Init(HeadSystem, _camera);
WeaponSystem.Init(HeadSystem, _camera);
WallHugSystem.Init();
EmpoweredActionsLeft = MaxNumberOfEmpoweredActions;
@@ -1789,11 +1794,20 @@ public partial class PlayerController : CharacterBody3D,
{
if (_currentInputBufferFrames > 0) _currentInputBufferFrames -= 1;
// Manage head and camera movement
LookAround(delta);
// Manage general movement
Velocity += ComputeKnockback();
MoveSlideAndHandleStairs((float) delta);
MantleSystem.ProcessMantle(_grounded.Active);
// Manage gameplay systems
MantleSystem.ProcessMantle(_grounded.Active);
HandleEnemyTargeting();
if (_closeEnemyDetector.IsColliding())
// Manage dash target and tutorial specific stuff
if (WeaponSystem.InHandState.Active && !_aiming.Active && TutorialDone)
{
DashIndicatorMesh.Visible = false;
@@ -1806,6 +1820,28 @@ public partial class PlayerController : CharacterBody3D,
DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition);
}
}
public void HandleEnemyTargeting()
{
_closeEnemyDetector.SetRotation(HeadSystem.GetGlobalLookRotation());
var enemyTargetState = PlayerUi.TargetState.NoTarget;
var positionOnScreen = Vector2.Zero;
if (!_closeEnemyDetector.IsColliding())
{
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
return;
}
var collidedObject = _closeEnemyDetector.GetCollider(0);
if (collidedObject is not Node3D target)
{
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
return;
}
enemyTargetState = PlayerUi.TargetState.TargetInRange;
positionOnScreen = _camera.UnprojectPosition(target.GlobalPosition);
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
}
///////////////////////////
// Hit Management ///////