본문 바로가기
유니티 코딩 공부

유니티 - 물체 간 상호작용 구현 방법

by 황곰박사 2025. 3. 29.
반응형

물체 간 상호작용 구현 방법

1. 개요

게임 개발 및 소프트웨어 설계에서 물체 간의 상호작용은 핵심적인 요소입니다. 특히 Unity나 다른 게임 엔진에서 물체 간 충돌, 이벤트, 메시지 시스템을 활용하는 것이 중요합니다. 이 글에서는 물체 간의 상호작용을 구현하는 다양한 방법과 효과적인 코드 작성법을 살펴보겠습니다.


2. 충돌 감지를 통한 상호작용

(1) 충돌 감지 (Collider & Rigidbody)

Unity에서는 ColliderRigidbody를 활용하여 충돌을 감지합니다. 충돌 감지는 OnCollisionEnter() 또는 OnTriggerEnter() 메서드를 사용하여 구현할 수 있습니다.

OnCollisionEnter() - 충돌 시 실행되는 코드

using UnityEngine;

public class PlayerCollision : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            Debug.Log("적과 충돌!");
        }
    }
}

OnTriggerEnter() - 트리거 영역 감지

using UnityEngine;

public class ItemCollector : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Item"))
        {
            Debug.Log("아이템 획득!");
            Destroy(other.gameObject);
        }
    }
}

참고: OnCollisionEnter()는 Rigidbody가 필요하며, OnTriggerEnter()를 사용하려면 Collider의 IsTrigger를 활성화해야 합니다.


3. 이벤트 시스템을 활용한 상호작용

(1) C# 이벤트를 활용한 상호작용

이벤트 시스템을 사용하면 객체 간의 직접적인 의존성을 줄이고, 확장성을 높일 수 있습니다.

이벤트 선언 및 사용 예시

using System;
using UnityEngine;

public class EventManager : MonoBehaviour
{
    public static event Action OnItemCollected;

    public static void ItemCollected()
    {
        OnItemCollected?.Invoke();
    }
}

public class Player : MonoBehaviour
{
    void Start()
    {
        EventManager.OnItemCollected += HandleItemCollected;
    }

    void HandleItemCollected()
    {
        Debug.Log("아이템을 획득했습니다!");
    }
}

이점: 이벤트를 사용하면 여러 객체가 같은 이벤트를 수신할 수 있어 확장성이 높아집니다.


4. 메시지 시스템을 활용한 상호작용

(1) SendMessage() 메서드를 활용한 간단한 호출

Unity의 SendMessage()를 사용하면 특정 메서드를 호출할 수 있습니다.

void TakeDamage(int damage)
{
    Debug.Log("피해를 입었습니다: " + damage);
}

void AttackEnemy()
{
    enemy.SendMessage("TakeDamage", 10);
}

주의: SendMessage()는 문자열 기반이라 오타에 민감하고 성능이 상대적으로 느립니다.


5. 인터페이스를 활용한 상호작용

(1) 인터페이스를 이용한 객체 간 표준화

인터페이스를 사용하면 특정 동작을 보장할 수 있으며, 코드의 유연성을 높일 수 있습니다.

인터페이스 정의 및 구현

public interface IDamageable
{
    void TakeDamage(int damage);
}

public class Enemy : MonoBehaviour, IDamageable
{
    public void TakeDamage(int damage)
    {
        Debug.Log("적이 " + damage + " 만큼 피해를 입음");
    }
}

public class Player : MonoBehaviour
{
    void Attack(IDamageable target)
    {
        target.TakeDamage(10);
    }
}

장점: 인터페이스를 사용하면 여러 객체가 같은 기능을 가질 수 있도록 강제할 수 있습니다.


6. 실전 적용 사례

(1) 플레이어와 적의 충돌 감지

  • OnCollisionEnter()를 활용하여 플레이어가 적과 충돌했을 때 체력을 감소시킴

(2) 아이템 습득 처리

  • OnTriggerEnter()를 사용하여 특정 아이템을 획득할 경우 점수를 증가시키거나 효과를 발동시킴

(3) 이벤트 기반 UI 업데이트

  • 이벤트 시스템을 활용하여 점수 변화가 발생할 때 UI를 자동으로 업데이트하도록 구현

7. 결론

객체 간 상호작용을 효과적으로 구현하는 방법에는 충돌 감지, 이벤트 시스템, 메시지 시스템, 인터페이스 활용 등이 있습니다. 프로젝트 특성에 따라 적절한 방식을 선택하여 유연하고 확장성 있는 코드를 작성하는 것이 중요합니다.

반응형