Basic attack system

alt text So I'm currently working on a basic attack system and I wanted to know the best way to do this. I am currently relying heavily on the ThirdPersonCharacterAttack script converted to c#. I searched the wiki and couldn't find a single entry for an attack script. I figured that this might as well function for a good majority of new Unity users as well, so I'll work on this and update it here.

My basic issue:

I want to make an attack system in which I can attack 1 vs. 1 and 1 vs. Many. I attempted to illustrate this to get my idea across, and I hope it was helpful.

Now, I'm torn between:

using an actual circle and checking to see if enemies with the circle when the attack function is in progress

or

checking the distance between surrounding enemies and just seeing if they are close enough to be hit by my attack.

Which is more efficient?

Also, I was considering drawing a sphere and making it a trigger and thus checking the collision of objects with the tag "enemy" or some such thing.

Here is the code I'm currently working with:

    void Start()
    {
        animation["punch"].speed = punchSpeed;
        punchPosition = new Vector3(0, 1.0f, 0);
        punchRadius = 0.1f;
    }

   void Update ()
{
    ThirdPersonController controller = GetComponent<ThirdPersonController>();
    if (!busy && Input.GetKeyDown(KeyCode.G) && controller.IsGroundedWithTimeout() && !controller.IsMoving())
    {   
        SendMessage ("DidPunch");
        busy = true;
    }
}

    IEnumerator DidPunch ()
{
    animation.CrossFadeQueued("punch", 0.1f, QueueMode.PlayNow);
    punchPosition.z = 1.0f;
    punchRadius = 1.0f;
    yield return new WaitForSeconds(punchHitTime);
    Vector3 pos = transform.TransformPoint(punchPosition);
    //var enemies : GameObject[] = GameObject.FindGameObjectsWithTag("Enemy");

    //for (var go : GameObject in enemies)
    //{
        //var enemy = go.GetComponent(EnemyDamage);
        /*if (enemy == null)
            continue;*/

        /*if (Vector3.Distance(enemy.transform.position, pos) < punchRadius)
        {
            enemy.SendMessage("ApplyDamage", punchHitPoints);
            // Play sound.
            if (punchSound)
                audio.PlayOneShot(punchSound);
        }*/
    //}
    yield return new WaitForSeconds(punchTime - punchHitTime);
    busy = false;
    punchPosition.z = 0.0f;
    punchRadius = 0.1f;
}

    void OnDrawGizmosSelected ()
{
    Gizmos.color = Color.yellow;
    Gizmos.DrawWireSphere (transform.TransformPoint(punchPosition), punchRadius);
}

I think checking the distance is more efficient and easier to do. If you make a sphere trigger, each frame it will check the all 3D space to see if anything collides or not which is expensive. I am not sure about what's your thinking of doing it using circle. But I still believe checking distance is better, that's how I do for AOEs in my own RPG.

It would also be nice to mention that in a larger scale game, you could set up “territories” for areas that spawns of monsters roam in. This would stop all monsters from checking where you are.