IDamageable
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 6번째.
게임에는 피해를 입을 수 있는 대상이 많지만, 서로 공통점은 거의 없습니다. 플레이어는 체력이 있고, 상자는 한 번 맞으면 부서집니다. 공통 기본 클래스를 만들면 이들을 하나의 계층에 억지로 넣게 됩니다. 인터페이스는 이들이 공유하는 한 가지를 명시하고, 각 스크립트는 이를 각자의 방식으로 구현합니다:
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를 상속하지 않습니다. 인터페이스는 컴포넌트가 아니므로 단독으로 오브젝트에 추가할 수 없습니다. 인터페이스를 나열한 클래스에는 public 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 또는 컴포넌트를 가지고 있다가 화염구처럼 해당 오브젝트에서 인터페이스를 가져옵니다.
챌린지
쉬움Slam()을 호출하고, 이 메서드는 radius 안에 있는 모든 콜라이더를 찾습니다. 광장에 있는 세 가지 대상은 각각 고유한 방식으로 피해를 입으며, 서로 다른 점은 그뿐입니다.
Snowman: 피해를 1포인트 입을 때마다 모든 축에서 크기가 0.25씩 줄어듭니다(처음 크기는 1.5입니다). 크기가 0.5 이하가 되면 녹으므로 눈사람을 파괴합니다.Bell: 피해를 1포인트 입을 때마다Dong을 한 번 기록합니다(피해를 2 입으면 두 번 기록합니다). 또한 피해 포인트를rings에 더합니다.Scarecrow: 첫 번째 공격을 받으면 피해량과 관계없이 z축을 기준으로 90도 회전하며 쓰러집니다. 이후 공격은 아무 변화도 일으키지 않습니다.
IDamageable.cs는 메서드 하나인 void TakeDamage(int amount)를 포함하는 인터페이스를 선언합니다. Snowman, Bell, Scarecrow가 이 인터페이스를 구현하도록 하고, 각각 고유한 반응을 구현하세요. 그런 다음 Slam에서 찾은 각 콜라이더의 IDamageable에 대해 TakeDamage(power)를 호출하세요. 지면처럼 IDamageable이 없는 콜라이더는 건너뜁니다.
플레이를 누르고, 각 대상에게 다가가 망치를 휘두른 다음, 확인을 누르세요.
직접 해보기
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.