How would you go about switching targets with either the gamepad’s RS (right stick directional flick), or something like the keyboard+mouse’s Shift+WASD or Alt+WASD?
Well, the first part is setting up the buttons in the InputManager… I think you can handle that… you should wind up with two events
public event OnTargetLeft;
public event OnTargetRight;
That’s the easy part.
The hard part is selecting the target to the left or right of the current target…
This is untested and off the cuff…
public void SelectTargetToTheLeft()
{
if (!CurrentTarget)
{
SelectTarget();
return;
}
var position = transform.position;
var forward = transform.forward;
float closestDistance = 1000;
Target candidate = null;
float angle = Vector3.SignedAngle(forward, CurrentTarget.transform.position - position,
Vector3.up);
foreach (var target in targets.Where(t=>Vector3.SignedAngle(forward, t.transform.position, Vector3.up)<angle))
{
if (Vector3.SqrMagnitude(target.transform.position - position) < closestDistance)
{
closestDistance = Vector3.SqrMagnitude(target.transform.position - position);
candidate = target;
}
}
if (candidate != null)
{
CurrentTarget = candidate;
}
}
And for the Right, you’ll want to test for a > angle.
Of course, this means we now have three distinct select methods… so there’s probably some heavy DRY refactoring to be done.