Unity에서 근접 전투 시스템 만들기

게임에서의 근접 전투는 플레이어가 무기나 자신의 신체를 사용하여 적을 공격하는 근거리 전투를 의미합니다. 이러한 유형의 전투는 액션 어드벤처, 롤플레잉, 격투 게임을 비롯한 다양한 게임 장르에서 매우 중요합니다. 근접 시스템은 게임플레이에 깊이를 더해 플레이어에게 원거리 전투와는 다른 본능적이고 몰입감 넘치는 경험을 제공합니다. Unity에서 근접 시스템을 구현하려면 스크립팅, 애니메이션, 충돌 감지가 포함되어 원활하고 반응성이 뛰어난 전투 메커니즘을 보장합니다.

이 글에서는 Unity에서 초보자에게 적합한 기본적인 근접 전투 시스템을 만드는 단계를 안내해 드리겠습니다. 플레이어 캐릭터 설정, 근접 공격 애니메이션 생성, 공격 로직 스크립팅, 적중 기록을 위한 충돌 감지 구현 등을 다룹니다.

게임에서 근접 전투의 중요성

근접 전투는 다음과 같은 여러 가지 이유로 특정 유형의 게임에서 필수적입니다.

  • 몰입형 게임플레이: 근접 전투는 강렬하고 매력적인 게임플레이 경험을 선사하여 플레이어가 액션에 더욱 몰입감을 느낄 수 있게 해줍니다.
  • 다양성: 주로 원거리 전투를 특징으로 하는 게임에 근접 전투를 추가하면 다양성을 제공하고 게임플레이를 신선하고 흥미롭게 유지합니다.
  • 캐릭터 및 세계 구축: 근접 전투는 캐릭터의 능력과 게임 설정을 반영하여 전체적인 내러티브와 세계 구축을 향상시킬 수 있습니다.
  • 전략적 깊이: 플레이어는 위치 지정, 타이밍, 무기 선택을 고려해야 하며 게임플레이에 전략 계층을 추가해야 합니다.

플레이어 캐릭터 설정

  1. 새 프로젝트 만들기: Unity을 열고 새 3D 프로젝트를 만듭니다.
  2. 플레이어 캐릭터 추가: 플레이어 캐릭터에 대한 3D 모델을 가져오거나 생성합니다. 필요한 경우 Unity Asset Store의 무료 자산을 사용할 수 있습니다.
  3. 애니메이터 컨트롤러 설정: 플레이어의 애니메이션을 처리할 애니메이터 컨트롤러를 생성합니다. 필요한 애니메이션(유휴, 걷기, 공격)을 가져오고 애니메이션 상태 및 전환을 설정합니다.

근접 공격 애니메이션 만들기

  1. 공격 애니메이션 가져오기:
    • 캐릭터의 공격 애니메이션을 다운로드하거나 생성하세요.
    • 이러한 애니메이션을 Unity로 가져와 애니메이터 컨트롤러에 추가하세요.
  2. 애니메이션 전환 설정:
    • 애니메이터 컨트롤러에서 유휴, 걷기 및 공격 상태 간의 전환을 만듭니다.
    • 이러한 전환을 제어하려면 'isAttacking'과 같은 매개변수를 사용하세요.

공격 논리 스크립팅

공격 애니메이션 트리거 및 적중 감지를 포함하여 플레이어의 근접 공격 로직을 처리하는 C# 스크립트를 작성하겠습니다.

  1. 새 스크립트 만들기:
    • 프로젝트 창을 마우스 오른쪽 버튼으로 클릭하고 'Create -> C# Script'을 선택하고 이름을 'PlayerCombat'로 지정합니다.
  2. 스크립트 구현:
    • 스크립트를 두 번 클릭하여 원하는 코드 편집기(예: Visual Studio Code)에서 엽니다.
    using UnityEngine;
    
    public class PlayerCombat : MonoBehaviour
    {
        public Animator animator;
        public Transform attackPoint;
        public float attackRange = 0.5f;
        public LayerMask enemyLayers;
        public int attackDamage = 40;
        public float attackRate = 2f;
        private float nextAttackTime = 0f;
    
        void Update()
        {
            if (Time.time >= nextAttackTime)
            {
                if (Input.GetButtonDown("Fire1"))
                {
                    Attack();
                    nextAttackTime = Time.time + 1f / attackRate;
                }
            }
        }
    
        void Attack()
        {
            animator.SetTrigger("Attack");
    
            // Detect enemies in range of the attack
            Collider[] hitEnemies = Physics.OverlapSphere(attackPoint.position, attackRange, enemyLayers);
    
            // Damage them
            foreach (Collider enemy in hitEnemies)
            {
                enemy.GetComponent().TakeDamage(attackDamage);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (attackPoint == null)
                return;
    
            Gizmos.DrawWireSphere(attackPoint.position, attackRange);
        }
    }
  3. 스크립트 할당:
    • 'PlayerCombat' 스크립트를 플레이어 캐릭터에 연결하세요.
    • Inspector에서 'Animator', 'Attack Point' 및 기타 필드를 설정합니다.

적 논리 구현

  1. 적 스크립트 생성:
    • 프로젝트 창을 마우스 오른쪽 버튼으로 클릭하고 'Create -> C# Script'을 선택하고 이름을 'Enemy'로 지정합니다.
    • 스크립트를 두 번 클릭하여 원하는 코드 편집기에서 엽니다.
    using UnityEngine;
    
    public class Enemy : MonoBehaviour
    {
        public int maxHealth = 100;
        int currentHealth;
    
        void Start()
        {
            currentHealth = maxHealth;
        }
    
        public void TakeDamage(int damage)
        {
            currentHealth -= damage;
    
            if (currentHealth <= 0)
            {
                Die();
            }
        }
    
        void Die()
        {
            // Add death animation or effects
            Destroy(gameObject);
        }
    }
  2. 스크립트 할당:
    • 'Enemy' 스크립트를 적 개체에 연결합니다.

시각적 및 오디오 피드백 추가

시각적 및 청각적 피드백을 통해 근접 전투 경험을 향상시키는 것은 플레이어 만족도에 매우 중요합니다. 수행 방법은 다음과 같습니다.

  1. 적중 효과 추가:
    • 공격이 적에게 명중할 때 발생하는 입자 효과를 만듭니다.
    • 적에게 공격을 가하면 'Attack' 메서드로 이러한 효과를 인스턴스화합니다.
  2. 음향 효과 추가:
    • 공격 및 적중 충격에 대한 음향 효과를 가져옵니다.
    • 'AudioSource' 구성요소를 사용하여 공격 중 및 적에게 공격당할 때 이러한 사운드를 재생합니다.
    using UnityEngine;
    
    public class PlayerCombat : MonoBehaviour
    {
        public Animator animator;
        public Transform attackPoint;
        public float attackRange = 0.5f;
        public LayerMask enemyLayers;
        public int attackDamage = 40;
        public float attackRate = 2f;
        private float nextAttackTime = 0f;
        public AudioClip attackSound;
        public AudioClip hitSound;
        private AudioSource audioSource;
        public GameObject hitEffect;
    
        void Start()
        {
            audioSource = GetComponent();
        }
    
        void Update()
        {
            if (Time.time >= nextAttackTime)
            {
                if (Input.GetButtonDown("Fire1"))
                {
                    Attack();
                    nextAttackTime = Time.time + 1f / attackRate;
                }
            }
        }
    
        void Attack()
        {
            animator.SetTrigger("Attack");
            audioSource.PlayOneShot(attackSound);
    
            // Detect enemies in range of the attack
            Collider[] hitEnemies = Physics.OverlapSphere(attackPoint.position, attackRange, enemyLayers);
    
            // Damage them and play hit effect
            foreach (Collider enemy in hitEnemies)
            {
                enemy.GetComponent().TakeDamage(attackDamage);
                audioSource.PlayOneShot(hitSound);
                Instantiate(hitEffect, enemy.transform.position, Quaternion.identity);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (attackPoint == null)
                return;
    
            Gizmos.DrawWireSphere(attackPoint.position, attackRange);
        }
    }

결론

Unity에서 근접 전투 시스템을 구현하면 특히 근접 전투가 필수적인 장르에서 게임 플레이 경험을 크게 향상시킬 수 있습니다. 이 가이드를 따르면 애니메이션, 공격 로직 및 충돌 감지 기능을 갖춘 기본 근접 시스템을 만들 수 있습니다. Unity에 익숙해지면 필요에 맞게 시스템을 더욱 구체화할 수 있습니다.