본문 바로가기
유니티/플랫폼 게임 만들기

유니티로 슈퍼마리오 같은 게임 만들기 #5 - 적과의 충돌 처리 및 기본 공격 기능 구현

by 찡사랑방 2024. 10. 30.
728x90
728x90

 

안녕하세요! 이번 포스팅에서는 플레이어가 적과 충돌할 때의 반응을 설정하고, 간단한 공격 기능을 추가해보겠습니다. 이 과정에서 유니티의 충돌 감지 기본 공격 시스템을 다뤄볼게요.

 

 

 

1. 플레이어와 적의 충돌 처리

적과의 충돌 시 플레이어에게 데미지를 입히거나 게임의 생명 시스템을 구현하여, 캐릭터가 적과 부딪힐 때 게임 오버 조건을 추가할 수 있습니다.

  1. HealthManager 스크립트 작성
    • Assets > Scripts 폴더에 HealthManager라는 C# 스크립트를 생성합니다. 이 스크립트를 Player 오브젝트에 추가하여 플레이어의 생명 시스템을 관리하도록 설정합니다.
  2. 생명 변수와 데미지 처리 메서드 추가
using UnityEngine;

public class HealthManager : MonoBehaviour
{
    public int maxHealth = 3;
    private int currentHealth;

    void Start()
    {
        currentHealth = maxHealth; // 초기 체력 설정
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;
        if (currentHealth <= 0)
        {
            // 체력이 0 이하가 되면 플레이어 사망 처리
            Die();
        }
    }

    void Die()
    {
        // 사망 처리 로직 (예: 씬 다시 로드 또는 게임 오버 화면)
        Debug.Log("Game Over!");
    }
}

 

 

  • maxHealth는 플레이어의 최대 체력을 설정하는 변수입니다.
  • TakeDamage 메서드는 적과의 충돌 시 체력을 감소시키고, 체력이 0 이하가 되면 Die 메서드로 연결됩니다.
  • Die() 메서드에는 사망 시 처리할 로직(예: 씬을 다시 시작하거나 게임 오버 화면으로 전환)을 추가할 수 있습니다.

 

  3. 적과 충돌 시 데미지 입기

 

using UnityEngine;

public class EnemyAttack : MonoBehaviour
{
    public int damage = 1; // 적의 공격력

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            HealthManager playerHealth = collision.gameObject.GetComponent<HealthManager>();
            if (playerHealth != null)
            {
                playerHealth.TakeDamage(damage); // 플레이어에게 데미지
            }
        }
    }
}

 

 

 

  • Enemy 오브젝트에 적의 충돌을 감지할 스크립트를 추가합니다. EnemyAttack이라는 C# 스크립트를 작성하고, Enemy 오브젝트에 붙입니다.
  • OnCollisionEnter2D 메서드에서 플레이어와의 충돌을 감지하고, 플레이어의 HealthManager 스크립트를 참조해 데미지를 입힙니다.
  • Player 오브젝트에 Tag Player로 설정하여 충돌 체크가 원활하게 되도록 합니다.

 

2. 플레이어의 기본 공격 구현

플레이어가 적을 공격할 수 있는 기본 공격 기능을 추가하여, 적을 제거할 수 있도록 만들어보겠습니다.

  1. PlayerAttack 스크립트 작성
    • PlayerAttack이라는 C# 스크립트를 생성하고, Player 오브젝트에 추가합니다.
  2. 공격 변수 및 공격 범위 설정
using UnityEngine;

public class PlayerAttack : MonoBehaviour
{
    public Transform attackPoint;
    public float attackRange = 0.5f;
    public int attackDamage = 1;
    public LayerMask enemyLayers;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Z))
        {
            Attack();
        }
    }

    void Attack()
    {
        // 공격 범위 내 적 체크
        Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRange, enemyLayers);
        
        foreach (Collider2D enemy in hitEnemies)
        {
            enemy.GetComponent<EnemyHealth>().TakeDamage(attackDamage);
        }
    }
}

 

 

 

  • attackPoint는 공격이 시작되는 위치를 나타내며, Empty Object를 만들어 플레이어 앞쪽에 위치시킵니다.
  • attackRange는 공격 범위를 설정하고, enemyLayers는 공격 대상이 되는 적의 레이어입니다.
  • OverlapCircleAll 함수는 공격 범위 내의 모든 적을 감지하고, 감지된 적들에게 데미지를 줍니다.

3. 적 체력 시스템 구현

 

using UnityEngine;

public class EnemyHealth : MonoBehaviour
{
    public int health = 2;

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

    void Die()
    {
        Destroy(gameObject); // 적 오브젝트 제거
    }
}

 

 

  • EnemyHealth 스크립트를 작성하여 적의 체력을 관리하도록 합니다. 이 스크립트를 Enemy 오브젝트에 추가합니다.
  • 적이 플레이어의 공격을 받아 health가 0 이하로 떨어지면 Die() 메서드가 호출되고, 적이 게임에서 제거됩니다.

4. 공격 포인트 설정

  • Player 오브젝트 하단에 Empty Object를 생성하여 attackPoint로 이름을 설정하고, PlayerAttack 스크립트의 attackPoint 필드에 연결합니다.

 

3. 테스트 및 조정

  1. 플레이 모드에서 테스트
    • Play 모드에서 Z 키를 눌러 플레이어가 공격하는지 확인합니다. 공격 시, 범위 내 적이 체력을 잃고 제거되는지 확인하세요.
  2. 공격 범위와 데미지 조정
    • PlayerAttack 스크립트에서 attackRange attackDamage 값을 조정하여 공격 범위와 데미지를 테스트하고, 적의 난이도에 맞게 최적화해보세요.

 

다음 포스팅에서는 점프와 공격 애니메이션을 추가해 캐릭터의 움직임을 더욱 생동감 있게 만들어보겠습니다.

728x90