Menu
CoddyTech

추상 컴포넌트

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 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를 추상 클래스로 만들고 타워가 모든 종류의 몬스터를 공격하게 하세요.

  1. Monster에서 public abstract class Monster와 본문이 없는 protected abstract void React();를 작성하세요.
  2. 이제 컴파일러가 Imp를 가리킵니다. 위치에 Vector3.forward * 2f를 더하는 protected override void React()를 추가하세요.
  3. Tower의 루프 안에서 target.GetComponent<Monster>()에 Zap()을 호출하세요.

‘플레이’를 누르고 Space를 누르세요. 슬라임은 작아지고 임프는 뒤로 점프합니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

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

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

    // 이 종류의 몬스터가 zap을 맞고 살아남았을 때 반응하는 방식.
    protected virtual void React()
    {
    }
}

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

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