So what I am trying to do is to find a random point on the (green") arc around the enemy:

enter image description here

Sorry for the bad drawing but

  • Red (no go)
  • Green ( Points the allied can go to)

I know that unity has the following function:

Radius = 5;
_randomDirection = (Random.insideUnitCircle * _target.position).normalized;
Vector3 finalPosition = _target + _randomDirection + Radius;

However, this is for a full circle. How can I achieve the closest half circle?


1 Answer 1


Check if the point you get is on the far half-circle, and if it is, mirror it.

Radius = 5;
_randomDirection = (Vector3)(Random.insideUnitCircle).normalized;

Vector3 toTarget = _target.position - _source.position;
if (Vector3.Dot(toTarget, _randomDirection) > 0f) {
    _randomDirection = Vector3.Reflect(_randomDirection, toTarget);

Vector3 finalPosition = _target.position + _randomDirection * Radius;

You can also create this vector from scratch using a random angle:

Vector2 fromTarget = (_source.position - _target.position).normalized;
Vector2 perpendicular = new Vector2(-fromTarget.y, fromTarget.x);

float angle = Random.Range(0, Mathf.PI);

Vector2 offset = fromTarget * Mathf.Sin(angle) + perpendicular * Mathf.Cos(angle);

Vector3 finalPosition = _target.position + (Vector3)(offset * Radius);
  • \$\begingroup\$ The first example you posted doesnt seem to work for some reason :( \$\endgroup\$ Feb 19, 2021 at 19:01
  • \$\begingroup\$ "Doesn't work" is not enough information to diagnose the problem. We'll need specific symptoms or test cases to be able to help you. \$\endgroup\$
    – DMGregory
    Feb 19, 2021 at 19:07
  • 1
    \$\begingroup\$ Bright solution and should w0rk perfectly well though I might just negate instead of reflect as it's random anyway, saves 0.01 nanosec :-). \$\endgroup\$
    – Stormwind
    Feb 22, 2021 at 16:51

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .