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나 컴포넌트를 보관한 뒤 화염구처럼 해당 객체에 인터페이스를 요청합니다.
챌린지
쉬움눈사람, 종, 허수아비가 IDamageable을 구현하여 망치에 맞도록 하세요.
Snowman:TakeDamage는 모든 축에서0.25f * amount만큼 크기를 줄입니다. 0.5 이하가 되면 파괴하세요.Bell: 점수 1점마다Dong을 기록하고amount를rings에 더하세요.Scarecrow: 처음 맞았을 때만transform.Rotate(0f, 0f, 90f);를 실행하세요.Slam에서 각 콜라이더에IDamageable이 있으면TakeDamage(power)를 호출하세요.
‘플레이’를 눌러 각 대상을 향해 휘두르세요. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
Unity 게임 아키텍처의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드