Menu
CoddyTech

추상 컴포넌트

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

일부 기본 클래스는 그 자체로는 절대 존재하지 않는 종류의 것을 설명합니다. 모든 무기는 발사하지만, 권총도 산탄총도 아닌 무기는 발사할 방법이 없습니다. 그런 클래스에 abstract를 표시하고, 하위 클래스가 구현해야 하는 각 단계를 본문이 없는 추상 메서드로 선언하세요.

public abstract class Weapon : MonoBehaviour
{
    public int shots;

    public void Pull()
    {
        shots++;
        Fire();
    }

    protected abstract void Fire();
}
public class Shotgun : Weapon
{
    public GameObject pelletPrefab;

    protected override void Fire()
    {
        for (int i = -1; i <= 1; i++)
        {
            Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
        }
    }
}

Fire를 구현하지 않는 하위 클래스는 컴파일되지 않습니다. CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()' 오류가 발생합니다. Unity는 추상 스크립트를 오브젝트에 추가하는 것도 거부합니다. Weapon을 오브젝트에 드래그하면 Can't add script behaviour 'Weapon'. The script class can't be abstract!라는 메시지가 표시됩니다. Fire가 없는 Weapon을 Unity가 만들 수 없기 때문입니다.

다른 스크립트는 여전히 기본 유형을 사용할 수 있습니다. GetComponent<Weapon>()은 오브젝트에 있는 하위 클래스를 반환하고, Pull()은 해당 하위 클래스의 Fire를 실행합니다.

// Player.cs
private Weapon weapon;

void Start()
{
    weapon = GetComponent<Weapon>();
}

void Update()
{
    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        weapon.Pull();
    }
}

Shotgun 컴포넌트를 Pistol로 바꿔도 Player 스크립트는 그대로입니다.

challenge icon

챌린지

쉬움

마법사의 탑이 들판의 몬스터들에게 전격을 가합니다. Monster.cs에는 모든 몬스터가 공유하는 내용인 hp(3)와 Zap()이 들어 있습니다. Zap()은 hp를 1 감소시키고, hp가 0이면 몬스터를 제거하며, 그렇지 않으면 React()를 호출합니다. Slime.cs는 크기를 줄이는 방식으로 반응합니다. Imp.cs에는 반응이 없고, Monster가 빈 React를 제공하므로 반응이 빠져 있다는 사실을 알 수 없습니다.

  • Monster를 추상 클래스로 만들고 React를 추상 메서드로 만들어, 반응 방식을 지정하지 않은 몬스터는 컴파일되지 않도록 하세요. 그러면 컴파일러가 Imp를 지적합니다.
  • Imp의 React를 작성하세요. 탑에서 멀어지는 방향(+z 방향)으로 2단위 뒤로 점프합니다.
  • Tower.cs에서 Space를 누르면, 어떤 종류인지와 관계없이 Monster 태그가 붙은 각 오브젝트의 Monster 컴포넌트를 가져와 Zap()을 호출하세요.

Play를 눌러 몬스터들에게 전격을 가한 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

// 모든 몬스터가 공통으로 가진 것.
public class Monster : MonoBehaviour
{
    public int hp = 3;

    public void Zap()
    {
        hp--;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
        else
        {
            React();
        }
    }

    // 이 종류의 몬스터가 공격을 받고 살아남았을 때 보이는 반응.
    protected virtual void React()
    {
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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