보스전
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 50번째.
투기장 밖으로 통하는 문을 돌 골렘이 지키고 있습니다. 골렘은 당신을 향해 쿵쿵 걸어오고, 가까이 다가가면 잠시 주먹을 들어 올린 뒤 땅을 내리칩니다. 그때 당신이 여전히 가까이 있으면 피해를 입습니다. 내리친 뒤에는 휴식을 취하며, 그때만 검으로 골렘에게 피해를 줄 수 있습니다. 걸어가거나 공격을 준비하는 동안에는 돌 피부가 모든 공격을 튕겨 냅니다. 골렘의 색으로 현재 상태를 알 수 있습니다. 걸을 때는 회색, 공격을 준비할 때는 빨간색, 쉴 때는 청록색입니다. 체력을 0으로 만들면 문이 열립니다. 화면 상단의 체력 막대는 공격을 받을 때마다 바뀝니다.
각 상태를 클래스로 구현하는 상태 머신으로 골렘의 두뇌를 작성하세요. Boss와 BossStates.cs의 ChaseState, WindupState, RestState를 작성하면 됩니다. 플레이어, 체력 막대, 문, IState, StateMachine, IDamageable은 준비되어 있습니다.
챌린지
어려움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;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.