Menu
CoddyTech

기본 적 스크립트

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

C#에서는 클래스가 다른 클래스에서 파생될 수 있습니다. class Ghost : Enemy는 Enemy의 모든 필드와 메서드를 가져오고 자신만의 것을 추가합니다. 기반 클래스가 virtual로 표시한 메서드는 하위 클래스에서 override로 대체할 수 있으며, base.Describe()는 새 메서드 안에서 기반 클래스의 버전을 실행합니다. 일반적인 C# 코드로 보면 다음과 같습니다.

class Enemy
{
    protected int hp = 3;

    public virtual string Describe()
    {
        return "Enemy with " + hp + " hp";
    }
}

class Ghost : Enemy
{
    public override string Describe()
    {
        return base.Describe() + ", see-through";
    }
}

Ghost의 Describe()는 Enemy with 3 hp, see-through를 반환합니다. protected는 Enemy와 그 하위 클래스가 hp를 사용할 수 있고, 다른 클래스는 사용할 수 없다는 뜻입니다.

Unity에서는 적들이 대부분의 코드를 공유합니다. 체력, 속도, 이동 방식이 여기에 해당합니다. 이 코드는 MonoBehaviour에서 파생된 기반 클래스에 있으며, 각 적 종류는 그 클래스에서 파생됩니다. 이 Enemy는 Start에서 체력을 설정하고 Update에서 바라보는 방향으로 이동하며, Ghost는 시작 동작을 바꿔 두 배 빠르게 이동합니다.

public class Enemy : MonoBehaviour
{
    public int maxHp = 3;
    public float speed = 2f;
    protected int hp;

    protected virtual void Start()
    {
        hp = maxHp;
    }

    protected virtual void Update()
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}
public class Ghost : Enemy
{
    protected override void Start()
    {
        base.Start();
        speed *= 2f;
    }
}

Ghost는 필드를 상속하므로 Inspector에서 Ghost의 maxHp와 speed를 볼 수 있습니다. 또한 Update를 상속하므로 자체 Update가 없어도 이동합니다. hp는 protected이므로 Enemy와 그 하위 클래스가 사용할 수 있지만, 다른 스크립트는 사용할 수 없습니다.

Unity는 접근 제한자와 관계없이 이름으로 Start와 Update를 찾고, 가장 파생된 클래스에 있는 메서드를 호출합니다. Enemy의 Start가 private void Start()이고 Ghost가 자체 메서드를 선언한다면 Unity는 Ghost의 메서드만 호출합니다. Enemy의 메서드는 실행되지 않으며, 오류도 발생하지 않은 채 hp는 0으로 남습니다. 기반 클래스의 메시지를 protected virtual로 선언하면 일반적인 C# 방식으로 처리할 수 있습니다. 하위 클래스에서 override를 작성하고, base.Start()는 호출한 위치에서 기반 클래스의 부분을 실행합니다. 이 호출을 생략하면 기반 클래스의 부분은 건너뜁니다. 이렇게 하면 하위 클래스가 단계를 추가하는 대신 대체할 수 있습니다.

challenge icon

챌린지

쉬움

Golem과 Wasp가 각자의 동작을 수행하기 전에 Enemy의 동작을 실행하도록 만드세요.

  1. Enemy에서 void Start()와 void Update() 앞에 protected virtual을 작성하세요.
  2. Golem에서 protected override void Start()로 만들고, 첫 번째 줄에 base.Start();를 작성하세요.
  3. Wasp에서 protected override void Update()로 만들고, 첫 번째 줄에 base.Update();를 작성하세요.

‘플레이’를 누르세요. golem은 최대 체력으로 행진하고, wasp는 행진하면서 지그재그로 움직입니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

// 모든 몬스터의 공통 요소.
public class Enemy : MonoBehaviour
{
    public int maxHp = 4;
    public float speed = 1.5f;

    protected int hp;
    protected Vector3 spawnPoint;

    void Start()
    {
        hp = maxHp;
        spawnPoint = transform.position;
    }

    void Update()
    {
        // z축을 따라 성을 향해 전진
        transform.position += Vector3.back * speed * Time.deltaTime;
    }
}

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

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