Menu
CoddyTech

기본 적 스크립트

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

적들은 대부분의 코드를 공유합니다. 체력, 속도, 이동 방식이 그렇습니다. 이 코드는 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

챌린지

쉬움

몬스터들이 성을 향해 진군합니다. Enemy.cs에는 이들이 공통으로 가진 내용이 들어 있습니다. Start는 hp를 maxHp로 설정하고 spawnPoint를 기억하며, Update는 몬스터를 speed의 속도로 z축을 따라 이동시킵니다. Grunt는 단순한 Enemy이며 잘 작동합니다. 두 종류의 몬스터는 각자 고유한 동작을 추가하지만, 둘 다 Enemy의 동작을 잃습니다.

  • Golem: Start는 골렘을 1.5배 크게 만들고 The golem wakes up을 기록하지만, Unity가 Golem의 Start만 실행하고 Enemy의 Start는 실행하지 않기 때문에 hp는 0으로 유지됩니다.
  • Wasp: Update는 spawnPoint.x를 기준으로 양쪽으로 1단위씩 움직이지만, Unity가 Wasp의 Update만 실행하고 Enemy의 Update는 실행하지 않기 때문에 제자리에서 지그재그로 움직입니다.

Enemy의 Start와 Update를 protected virtual로 만들고, Golem과 Wasp에서 이를 재정의하여 각자 먼저 Enemy의 동작을 실행한 다음 자신의 동작을 실행하게 하세요. Play를 누른 다음 Check를 누르세요.

직접 해보기

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;
    }
}
quiz icon실력 점검

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

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