보스전
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 64번째.
돌 골렘이 투기장 밖으로 나가는 문을 지키고 있습니다. 골렘은 당신을 향해 발을 구르며 다가오고, 가까이 다가가면 잠시 주먹을 들어 올린 뒤 땅을 내리쳐서, 당신이 여전히 가까이 있으면 피해를 줍니다. 내리친 뒤에는 휴식을 취하며, 그때에만 당신의 검으로 골렘을 공격할 수 있습니다. 골렘은 걷거나 공격을 준비하는 동안에는 돌 피부로 모든 공격을 튕겨 냅니다. 골렘의 색으로 현재 행동을 알 수 있습니다. 걸을 때는 회색, 공격을 준비할 때는 빨간색, 휴식할 때는 청록색입니다. 골렘의 체력을 0으로 만들면 문이 열립니다. 화면 상단의 막대는 공격을 받을 때마다 체력을 표시합니다.
각 상태를 클래스로 만들어 골렘의 두뇌를 상태 머신으로 작성하세요. Boss와 BossStates.cs 파일의 ChaseState, WindupState, RestState를 작성하면 됩니다. 플레이어, 체력 막대, 문, IState, StateMachine, IDamageable은 준비되어 있으며, Boss는 이미 상태를 만들고 머신을 매 틱 업데이트합니다.
챌린지
어려움BossStates.cs에서 골렘의 상태를 작성하세요.
ChaseState:Tint(Color.gray); 플레이어를 향해speed로 걸어가고,slamRange안에 들어오면 공격 준비를 합니다.WindupState:Tint(Color.red);windupTime이 지난 후Slam!을 기록하고, 범위 안에 있는 플레이어에게slamDamage만큼 피해를 준 뒤 휴식합니다.RestState:Tint(Color.cyan);restTime이 지나면 추격합니다.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;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Unity 게임 아키텍처의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드