Menu
CoddyTech

보스전

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

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

각 상태를 클래스로 구현하는 상태 머신으로 골렘의 두뇌를 작성하세요. Boss와 BossStates.cs의 ChaseState, WindupState, RestState를 작성하면 됩니다. 플레이어, 체력 막대, 문, IState, StateMachine, IDamageable은 준비되어 있습니다.

challenge icon

챌린지

어려움

Inspector에서 Boss에 player, speed (2), slamRange (2.5), windupTime (1), restTime (2), slamDamage (2), maxHealth (6)을 지정하고, onDefeated UnityEvent를 Gate의 Open에 연결합니다. PlayerDistance()와 Tint(color)는 준비되어 있습니다.

  • Boss는 IDamageable을 구현합니다. Awake에서 체력을 maxHealth로 설정하고 StateMachine과 세 가지 상태를 만듭니다. 이들은 공개 필드 machine, chase, windup, rest에 저장됩니다(각 상태는 생성자에서 보스를 받습니다). Start에서 체력과 maxHealth로 HealthChanged를 발생시키고 chase 상태로 시작합니다. 매 프레임마다 머신을 틱합니다.
  • ChaseState: 골렘에 Color.gray를 적용하고 지면을 따라 speed로 플레이어를 향해 이동시킵니다. 플레이어가 slamRange 안에 들어오면 windup 상태로 전환합니다.
  • WindupState: 골렘에 Color.red를 적용하고 windupTime초 동안 가만히 있습니다. 그런 다음 Slam!을 로그에 출력하고, 플레이어가 여전히 slamRange 안에 있으면 플레이어의 IDamageable을 통해 slamDamage만큼 피해를 준 다음 rest 상태로 전환합니다.
  • RestState: 골렘에 Color.cyan을 적용하고 restTime초 동안 기다린 다음 chase 상태로 돌아갑니다. windup과 rest는 매번 전체 시간 동안 지속됩니다.
  • TakeDamage는 골렘이 rest 상태이고 아직 서 있을 때만 피해를 계산합니다. 지정된 양만큼 체력을 줄이고 HealthChanged를 발생시킵니다. 체력이 0이 되면 The golem falls을 로그에 출력하고 onDefeated를 호출한 뒤 자신을 비활성화합니다.

Play를 누르고, 내려치는 공격을 피한 다음 골렘이 쉬는 동안 공격하고 Check를 누르세요.

직접 해보기

using System;
using UnityEngine;
using UnityEngine.Events;

public class Boss : MonoBehaviour
{
    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;

    // 지면을 따라 측정한 player까지의 거리.
    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 게임 아키텍처의 모든 레슨