Game Dev Study Log

by ricale

취미로 하는 게임 개발 공부

강의 43,44,45,46강 수강

강의 수강: Unity Turn-Based Strategy Game: Intermediate C# Coding

43. Generic Take Action (11:23)

예상대로 액션 메서드와 유효성 검사 메서드를 일반화

public abstract class BaseAction : MonoBehaviour
{
    public abstract void TakeAction(GridPosition gridPosition, Action onActionComplete);

    public virtual bool IsValidActionGridPosition(GridPosition gridPosition)
    {
        List<GridPosition> validGridPositionList = GetValidActionGridPositionList();
        return validGridPositionList.Contains(gridPosition);
    }

    public abstract List<GridPosition> GetValidActionGridPositionList();
}

액션 실행 코드도 매우 간결해짐

if(selectedAction.IsValidActionGridPosition(mouseGridPosition))
{
    SetBusy();
    selectedAction.TakeAction(mouseGridPosition, ClearBusy);
}

좀 더 개선할 수 있을 것 같긴 한데, 강의에서도 추후 계선할 것이라고 하니 기다려보기로.

44. Selected Action UI (07:57)

현재 선택된 액션을 UnitActionSystem 에 저장해두고, 액션이 바뀔 때마다 UnitActionSystemUI 의 모든 버튼을 순회하면서 저장해둔 액션과 동일한 액션을 들고 있는 버튼에 활성화 표시를 해준다.

45. Action Busy UI (06:46)

액션 중에는 UnitActionSystemUI 를 사용하지 못하도록, 새로운 UI 인 ActionBusyUI 를 만들어서 해당 UI 로 UnitActionSystemUI 를 가려버리는 기능을 구현. 이 강의에서 드디어 파라미터를 전달하는 이벤트 핸들러 코드가 등장.

46. Action Points (13:20)

액션마다 포인트를 부여하고 액션을 사용하면 포인트를 소모하는 로직 구현

각 액션 클래스에서는 자신이 몇 포인트가 필요한 액션인지 알려줄 메서드 작성

public virtual int GetActionPointCost()
{
    return 1;
}

Unit 은 자신의 액션 포인트를 소유하고 있고, 특정 액션에 대해 해당 액션을 실행할 수 있는 액션 포인트가 있는지 확인하고 소모하는 메서드들을 작성

public bool TrySpendActionPointsToTakeAction(BaseAction baseAction)
{
    if(CanSpendActionPointsToTakeAction(baseAction))
    {
        SpendActionPoints(baseAction.GetActionPointCost());
        return true;
    } else
    {
        return false;
    }
}

public bool CanSpendActionPointsToTakeAction(BaseAction baseAction)
{
    return actionPoints >= baseAction.GetActionPointCost();
}

private void SpendActionPoints(int amount)
{
    actionPoints -= amount;
}

UnitActionSystem 에서는 액션을 실행하기 전 액션 포인트를 확인하고 소모하는 로직을 추가. 그리고 UI 를 업데이트하는 로직도 추가

if(!selectedUnit.TrySpendActionPointsToTakeAction(selectedAction))
{
    return;
}

SetBusy();
selectedAction.TakeAction(mouseGridPosition, ClearBusy);

OnActionStarted?.Invoke(this, EventArgs.Empty);

코드 마지막줄에 나온 OnActionStarted 콜백을 통해 UnitActionSystemUI 가 업데이트 됨