Menu
CoddyTech

IDamageable

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 7번째.

인터페이스는 클래스가 구현하겠다고 약속하는 메서드 목록이며, 메서드 안에는 코드가 없습니다. 다른 공통점이 전혀 없는 클래스들도 같은 약속을 할 수 있습니다. 일반적인 C#에서는 다음과 같습니다.

interface IGreeter
{
    string Greet();
}

class Robot : IGreeter
{
    public string Greet() { return "Beep"; }
}

class Cat : IGreeter
{
    public string Greet() { return "Meow"; }
}

IGreeter 형식의 변수에는 Robot이나 Cat을 담을 수 있으며, greeter.Greet()를 실행하면 변수에 담긴 객체의 메서드가 실행됩니다. IGreeter를 나열했지만 공개 Greet() 메서드가 없는 클래스는 컴파일되지 않습니다.

게임에서는 많은 대상이 피해를 입을 수 있지만, 그 외에는 공통점이 거의 없습니다. 플레이어에게는 체력이 있고, 상자는 첫 번째 공격에 부서집니다. 공통 기본 클래스를 두면 이 둘을 하나의 계열에 속하게 해야 합니다. 인터페이스는 둘이 공유하는 한 가지 특성의 이름을 정하고, 각 스크립트는 이를 자기 방식대로 구현합니다.

public interface IDamageable
{
    void TakeDamage(int amount);
}
public class PlayerHealth : MonoBehaviour, IDamageable
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        Debug.Log("Ouch! hp: " + hp);
    }
}
public class Crate : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        Destroy(gameObject);
    }
}

스크립트에는 여전히 MonoBehaviour라는 기본 클래스 하나가 있고, 그 뒤에 인터페이스를 나열합니다. 인터페이스는 IDamageable.cs라는 별도의 파일에 있으며 MonoBehaviour를 상속하지 않습니다. 인터페이스는 컴포넌트가 아니므로 그 자체로는 오브젝트에 추가되지 않습니다. 인터페이스를 나열하는 클래스에는 공개 TakeDamage(int) 메서드가 있어야 하며, 없으면 컴파일되지 않습니다.

피해를 입히는 쪽은 클래스가 아니라 인터페이스를 요청합니다.

// Fireball.cs
void OnCollisionEnter(Collision collision)
{
    IDamageable target = collision.gameObject.GetComponent<IDamageable>();
    if (target != null)
    {
        target.TakeDamage(3);
    }
    Destroy(gameObject);
}

화염구는 같은 코드로 플레이어에게 피해를 입히고 상자를 부숩니다. 나중에 새로운 종류의 대상이 추가되어도 여기의 코드는 바꿀 필요가 없습니다. Unity는 Inspector에 인터페이스 형식의 필드를 표시하지 않으므로, 스크립트는 GameObject나 컴포넌트를 보관한 뒤 화염구처럼 해당 객체에 인터페이스를 요청합니다.

challenge icon

챌린지

쉬움

눈사람, 종, 허수아비가 IDamageable을 구현하여 망치에 맞도록 하세요.

  1. Snowman: TakeDamage는 모든 축에서 0.25f * amount만큼 크기를 줄입니다. 0.5 이하가 되면 파괴하세요.
  2. Bell: 점수 1점마다 Dong을 기록하고 amount를 rings에 더하세요.
  3. Scarecrow: 처음 맞았을 때만 transform.Rotate(0f, 0f, 90f);를 실행하세요.
  4. Slam에서 각 콜라이더에 IDamageable이 있으면 TakeDamage(power)를 호출하세요.

‘플레이’를 눌러 각 대상을 향해 휘두르세요. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class Snowman : MonoBehaviour
{
}

Unity 게임 아키텍처의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드