Menu
CoddyTech

보스전

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

돌 골렘이 투기장 밖으로 나가는 문을 지키고 있습니다. 골렘은 당신을 향해 발을 구르며 다가오고, 가까이 다가가면 잠시 주먹을 들어 올린 뒤 땅을 내리쳐서, 당신이 여전히 가까이 있으면 피해를 줍니다. 내리친 뒤에는 휴식을 취하며, 그때에만 당신의 검으로 골렘을 공격할 수 있습니다. 골렘은 걷거나 공격을 준비하는 동안에는 돌 피부로 모든 공격을 튕겨 냅니다. 골렘의 색으로 현재 행동을 알 수 있습니다. 걸을 때는 회색, 공격을 준비할 때는 빨간색, 휴식할 때는 청록색입니다. 골렘의 체력을 0으로 만들면 문이 열립니다. 화면 상단의 막대는 공격을 받을 때마다 체력을 표시합니다.

각 상태를 클래스로 만들어 골렘의 두뇌를 상태 머신으로 작성하세요. Boss와 BossStates.cs 파일의 ChaseState, WindupState, RestState를 작성하면 됩니다. 플레이어, 체력 막대, 문, IState, StateMachine, IDamageable은 준비되어 있으며, Boss는 이미 상태를 만들고 머신을 매 틱 업데이트합니다.

challenge icon

챌린지

어려움

BossStates.cs에서 골렘의 상태를 작성하세요.

  1. ChaseState: Tint(Color.gray); 플레이어를 향해 speed로 걸어가고, slamRange 안에 들어오면 공격 준비를 합니다.
  2. WindupState: Tint(Color.red); windupTime이 지난 후 Slam!을 기록하고, 범위 안에 있는 플레이어에게 slamDamage만큼 피해를 준 뒤 휴식합니다.
  3. RestState: Tint(Color.cyan); restTime이 지나면 추격합니다.
  4. Boss.TakeDamage는 rest 상태에서만 피해를 계산합니다. 피해량을 적용하고 HealthChanged를 발생시키며, 체력이 0이 되면 Fall()을 호출합니다.

‘플레이’를 눌러 골렘이 휴식할 때 공격하세요. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using System;
using UnityEngine;
using UnityEngine.Events;

public class Boss : MonoBehaviour, IDamageable
{
    public Transform player;
    public float speed = 2f;
    public float slamRange = 2.5f;
    public float windupTime = 1f;
    public float restTime = 2f;
    public int slamDamage = 2;
    public int maxHealth = 6;

    public event Action<int, int> HealthChanged;
    public UnityEvent onDefeated;

    public StateMachine machine;
    public IState chase;
    public IState windup;
    public IState rest;

    private int health;

    void Awake()
    {
        health = maxHealth;
        machine = new StateMachine();
        chase = new ChaseState(this);
        windup = new WindupState(this);
        rest = new RestState(this);
    }

    void Start()
    {
        HealthChanged?.Invoke(health, maxHealth);
        machine.ChangeState(chase);
    }

    void Update()
    {
        machine.Tick();
    }

    public void TakeDamage(int amount)
    {
        // 공격은 휴식 중일 때만 유효합니다: amount만큼 체력을 깎고, HealthChanged를 발생시키고, 체력이 0이 되면 Fall()을 호출합니다
    }

    // 준비 완료: 골렘이 쓰러지고, 문이 열리며, 골렘이 투기장을 떠납니다.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // 지면을 따라 측정한 플레이어까지의 거리.
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // 걸을 때는 회색, 공격을 준비할 때는 빨간색, 쉴 때는 청록색.
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz icon실력 점검

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

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

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