유니티 기초 강좌: 슈팅2 – 총알이 없는 슈팅

안녕하세요! 이번 강좌에서는 “총알이 없는 슈팅”이라는 흥미로운 요소를 유니티에서 구현하는 방법에 대해 알아보겠습니다. 총알이 없는 슈팅이라는 개념은 전통적인 슈팅 게임의 총알 발사 메커니즘을 넘어, 보다 창의적이고 새로운 게임플레이 경험을 제공하는 요소로 작용할 수 있습니다.

이 강좌에서는 총알을 사용하지 않고, 플레이어가 적과 상호작용하는 방법, 적이 플레이어의 위치를 인식하는 방식, 그리고 플레이어가 공격하는 방식 등을 다룰 것입니다. 그리고 이러한 요소들을 구현하기 위해 필요한 C# 스크립트와 설정 방법도 자세히 설명하겠습니다.

1. 총알이 없는 슈팅의 기본 개념

총알이 없는 슈팅은 플레이어가 특정 범위 내에서 적을 타격하는 방식입니다. 이는 플레이어가 공격 버튼을 누를 때마다 적에게 피해를 줄 수 있는 근접 공격이나 범위 공격의 형태로 구현될 수 있습니다. 이러한 방법은 단순한 총알 발사 대신 다양한 게임플레이 메커니즘을 만들어낼 수 있습니다.

예를 들어, 플레이어가 레이저와 같은 공격을 사용하여 해당 공격이 가리키는 방향의 모든 적들을 타격하는 시스템을 고려해볼 수 있습니다. 이렇게 하면 플레이어는 보다 전략적으로 공격을 해야 하며, 적들은 이를 회피하려는 행동을 취할 수 있습니다. 이러한 메커니즘은 색다른 게임 경험을 제공합니다.

2. 유니티 프로젝트 설정하기

첫 번째 단계는 유니티 프로젝트를 설정하는 것입니다. 유니티를 실행하고 새로운 3D 프로젝트를 시작하세요. 프로젝트 이름과 저장 위치를 설정한 후, 프로젝트를 생성합니다.

2.1 씬 구성하기

씬에는 플레이어 캐릭터, 적, 그리고 공격 범위를 표시할 UI가 필요합니다. 아래의 단계를 따라 씬을 구성하세요:

  • 플레이어 캐릭터 만들기: 3D 모델을 생성하거나 유니티의 기본 큐브 오브젝트로 대체하여 플레이어 캐릭터를 생성합니다.
  • 적 배치하기: 여러 개의 적 모델을 씬에 배치하여 다양한 위치에서 플레이어와 상호작용하도록 합니다.
  • UI 요소 추가하기: 공격 범위를 시각적으로 나타내기 위해 UI Canvas를 추가하고, 공격 반경 표시를 위한 UI 오브젝트를 생성합니다.

3. 플레이어 스크립트 작성하기

이제 플레이어 스크립트를 작성하여 플레이어가 공격할 때 적을 타격하도록 하겠습니다. C# 스크립트를 생성하고 ‘PlayerController’라는 이름을 붙입니다.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float attackRange = 5f;       // 공격 범위
    public LayerMask enemyLayer;        // 적 레이어

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) // 스페이스 키로 공격
        {
            Attack();
        }
    }

    void Attack()
    {
        Collider[] hitEnemies = Physics.OverlapSphere(transform.position, attackRange, enemyLayer);
        foreach (Collider enemy in hitEnemies)
        {
            // 여기에 적을 타격하는 로직을 추가하세요
            Debug.Log("Hit " + enemy.name);
        }
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, attackRange); // 공격 범위 시각화
    }
}

위 코드는 플레이어가 스페이스 바를 눌렀을 때, 지정된 공격 범위 내에 있는 적을 감지하는 기능을 합니다. Physics.OverlapSphere함수를 사용하여 플레이어 주변의 적을 감지하고, 적이 감지될 때마다 로그를 출력하도록 설정했습니다.

4. 적 스크립트 작성하기

이번에는 적이 플레이어의 공격을 받을 때의 행동을 정의하는 스크립트를 작성해보겠습니다. ‘EnemyController’라는 새 스크립트를 만듭니다.

using UnityEngine;

public class EnemyController : MonoBehaviour
{
    public int health = 100; // 적의 체력

    public void TakeDamage(int damage)
    {
        health -= damage;
        if (health <= 0)
        {
            Die();
        }
    }

    void Die()
    {
        Debug.Log(name + " has died!");
        Destroy(gameObject); // 적 오브젝트 제거
    }
}

위 코드에서, 적은 체력을 가지고 있으며, 플레이어로부터 피해를 받으면 체력이 감소합니다. 체력이 0 이하가 되면 적이 사망하고, 게임 오브젝트가 파괴됩니다.

이제 적이 피해를 받는 로직을 PlayerController의 Attack() 메서드에 추가해보겠습니다.

void Attack()
{
    Collider[] hitEnemies = Physics.OverlapSphere(transform.position, attackRange, enemyLayer);
    foreach (Collider enemy in hitEnemies)
    {
        EnemyController enemyController = enemy.GetComponent<EnemyController>();
        if (enemyController != null)
        {
            enemyController.TakeDamage(10); // 피해량 지정
            Debug.Log("Hit " + enemy.name);
        }
    }
}

5. 테스트하기

모든 스크립트를 작성한 후에는 유니티 에디터에서 플레이 버튼을 눌러 테스트해보세요. 스페이스 바를 눌러 근처의 적이 피해를 받는지 확인합니다. 적이 사망하면 로그에 관련 메시지가 출력됩니다.

이 과정에서 필요한 경우 공격 범위를 조정하고, 적의 체력을 변경하여 다양한 게임플레이 조정이 가능합니다.

6. 추가 확장 아이디어

이번 강좌에서는 간단한 형태의 총알이 없는 슈팅 메커니즘을 구현했습니다. 이제 이를 확장하기 위한 몇 가지 아이디어를 제안드립니다:

  • 다양한 종류의 공격 추가: 플레이어가 사용할 수 있는 다양한 공격 방식을 추가하여 게임의 다양성을 높일 수 있습니다.
  • 적의 행동 패턴 변화: 적이 단순히 플레이어를 추적하는 것뿐만 아니라, 회피하거나 반격하는 행동을 추가할 수 있습니다.
  • 아이템 및 파워업: 플레이어가 사용할 수 있는 아이템이나 파워업을 추가하여 공격력이나 범위를 증가시키는 메커니즘을 구현할 수 있습니다.

7. 마무리

총알이 없는 슈팅 게임 메커니즘은 플레이어에게 새로운 경험을 제공하고, 게임의 전략성을 높여줄 수 있습니다. 이번 강좌를 통해 기본적인 구현 방법을 배웠으니, 더 많은 기능과 요소들로 이 시스템을 발전시키는 것은 여러분의 몫입니다.

유니티로 게임을 제작하는 과정은 도전적이지만, 동시에 창의적이고 재미있는 여정입니다. 앞으로의 길에 많은 도움이 되기를 바랍니다. 감사합니다!