스타크래프트의 유닛 컨트롤 모드는 실시간 전략 게임에서 핵심적인 요소로, 플레이어가 다양한 유닛들을 개별적으로 또는 집단으로 제어하는 방식입니다. 이 기능은 게임의 복잡성과 깊이를 더해주며, 유닛의 이동, 공격, 대기, 자원 채취 등의 명령이 효과적으로 수행되도록 도와줍니다. 이를 위해 게임 내에서는 유닛과 명령을 처리하는 자료구조가 매우 중요합니다. 아래에서는 스타크래프트 유닛 컨트롤 모드의 자료구조를 설명하겠습니다.

1. 유닛 자료구조(Unit Structure)

스타크래프트에서 유닛은 다양한 속성과 상태를 가지며, 이를 저장하고 관리하기 위해 각 유닛에 대한 자료구조가 필요합니다. 이 자료구조는 각 유닛의 기본 속성(체력, 공격력 등)과 현재 상태(이동 중, 공격 중, 대기 중 등)를 관리하는 데 사용됩니다.

(1) 유닛 구조체(Unit Struct)

유닛 구조체는 개별 유닛의 상태를 관리하는데 필요한 다양한 필드를 포함합니다. 유닛이 수행하는 행동, 상태, 위치, 속성 등이 이 구조체에서 관리됩니다.

struct Unit {
    int unitID;         // 유닛 고유 식별자 (Unique ID)
    int playerID;       // 유닛의 소유자 (플레이어 ID)
    int unitType;       // 유닛의 종류 (마린, 저글링, 탱크 등)
    int health;         // 현재 체력
    int maxHealth;      // 최대 체력
    int attackPower;    // 공격력
    int armor;          // 방어력
    int positionX;      // X 좌표 (맵 상에서의 위치)
    int positionY;      // Y 좌표 (맵 상에서의 위치)
    bool isMoving;      // 이동 여부
    bool isAttacking;   // 공격 여부
    bool isSelected;    // 플레이어가 선택한 유닛인지 여부
    Command currentCommand; // 현재 수행 중인 명령 (이동, 공격, 대기 등)
    // 추가 필드...
};
  • unitID: 각 유닛은 고유한 ID로 식별됩니다. 이를 통해 게임 내에서 유닛을 추적하고 명령을 내릴 수 있습니다.
  • playerID: 유닛의 소유자 정보를 저장하며, 이는 다중 플레이어 환경에서 중요한 역할을 합니다.
  • unitType: 유닛의 종류(테란 마린, 저그 저글링 등)를 구분하며, 이 정보는 각 유닛의 능력치와 특성에 맞춰 동작합니다.
  • health, maxHealth: 유닛의 현재 체력과 최대 체력을 저장합니다.
  • positionX, positionY: 유닛의 2D 좌표를 저장하여, 맵에서의 위치를 추적합니다.

(2) 명령 구조체(Command Struct)

유닛은 플레이어의 명령을 받고 행동을 수행하며, 명령에는 이동, 공격, 대기, 자원 채취 등 다양한 종류가 있습니다. 이를 처리하기 위해 Command 구조체가 사용됩니다.

struct Command {
    int commandType;      // 명령의 종류 (이동, 공격 등)
    int targetUnitID;     // 명령 대상 유닛의 ID (공격 대상일 경우)
    int targetPositionX;  // 이동 명령일 경우 목표 위치 (X 좌표)
    int targetPositionY;  // 이동 명령일 경우 목표 위치 (Y 좌표)
    bool isCompleted;     // 명령 완료 여부
};
  • commandType: 명령의 종류(이동, 공격, 대기 등)를 나타내는 필드로, 각 명령에 따라 유닛의 행동이 달라집니다.
  • targetUnitID: 공격 명령일 경우, 목표로 하는 유닛의 ID를 지정합니다.
  • targetPositionX, targetPositionY: 이동 명령일 경우, 목표 위치의 좌표를 나타냅니다.
  • isCompleted: 명령이 완료되었는지 여부를 추적합니다.

2. 유닛 상태 관리(State Management)

유닛 컨트롤에서 중요한 요소는 각 유닛의 현재 상태를 효율적으로 관리하는 것입니다. 유닛은 다음과 같은 상태를 가질 수 있으며, 이를 자료구조로 관리합니다.

(1) 상태 플래그(State Flags)

유닛의 현재 상태(이동 중, 공격 중 등)는 플래그를 통해 관리됩니다. 이러한 플래그들은 유닛이 어떤 행동을 수행 중인지 또는 대기 상태인지 등을 나타냅니다.

struct UnitState {
    bool isMoving;    // 이동 중인지 여부
    bool isAttacking; // 공격 중인지 여부
    bool isIdle;      // 대기 중인지 여부
    bool isGathering; // 자원 채취 중인지 여부
    // 추가 상태 플래그...
};
  • isMoving: 유닛이 이동 중인 경우 true로 설정됩니다.
  • isAttacking: 유닛이 공격 중인 경우 true로 설정됩니다.
  • isIdle: 유닛이 대기 중인 경우 true로 설정됩니다.
  • isGathering: 유닛이 자원 채취 중인 경우 true로 설정됩니다.

3. 유닛 컨트롤의 핵심 알고리즘

유닛이 주어진 명령을 수행하기 위해서는 다양한 알고리즘이 필요합니다. 이는 경로 탐색, 목표 선택, 그리고 명령 실행 등의 과정으로 나뉩니다.

(1) 경로 탐색(Pathfinding)

유닛은 맵에서 목표 위치로 이동하기 위해 경로를 찾아야 합니다. 스타크래프트에서는 주로 A* 알고리즘이 경로 탐색에 사용되며, 맵 상의 장애물이나 지형을 고려하여 최적 경로를 찾습니다.

  • 노드(Node) 기반 탐색: 맵은 여러 개의 노드로 나누어지며, 유닛은 이 노드 사이를 이동하게 됩니다. A* 알고리즘은 시작점에서 목표점까지의 최단 경로를 계산하며, 이동 가능한 영역과 불가능한 영역을 구분합니다.

(2) 목표 선택(Target Selection)

공격 명령을 받은 유닛은 적 유닛 중 목표를 선택하여 공격합니다. 이를 위해 각 적 유닛의 우선순위를 평가하는 알고리즘이 필요합니다.

  • 우선순위 시스템: 적 유닛의 체력, 공격력, 방어력 등을 기준으로 목표를 평가하며, 가장 위협적이거나 가까운 유닛을 우선적으로 공격합니다.

(3) 명령 큐(Command Queue)

유닛은 여러 개의 명령을 순차적으로 처리할 수 있으며, 이를 위해 명령 큐(Command Queue)가 사용됩니다. 명령 큐는 유닛이 수행할 명령들을 차례로 저장하며, 하나의 명령이 완료되면 다음 명령을 실행합니다.

struct CommandQueue {
    std::queue<Command> commandList; // 명령 목록
    void addCommand(Command newCommand); // 명령 추가
    void executeNextCommand();           // 다음 명령 실행
};
  • commandList: 명령 목록은 큐(queue) 형태로 구현되어, 첫 번째 명령부터 차례대로 실행됩니다.
  • addCommand: 새로운 명령을 큐에 추가합니다.
  • executeNextCommand: 현재 명령이 완료되면 다음 명령을 실행합니다.

4. 집단 컨트롤(Group Control)

스타크래프트에서는 여러 유닛을 한꺼번에 선택하여 제어할 수 있는 집단 컨트롤 기능이 중요합니다. 이를 위해 여러 유닛을 동시에 관리하는 자료구조가 필요합니다.

(1) 유닛 그룹 구조체(Unit Group Struct)

유닛 그룹은 여러 개의 유닛을 동시에 관리하는 구조체로, 플레이어가 선택한 유닛들의 집합을 저장합니다.

struct UnitGroup {
    std::vector<Unit*> selectedUnits; // 선택된 유닛들의 리스트
    void issueCommandToGroup(Command groupCommand); // 그룹에 명령을 전달
};
  • selectedUnits: 플레이어가 선택한 유닛들의 리스트를 저장합니다.
  • issueCommandToGroup: 그룹 전체에 동일한 명령을 전달합니다. 예를 들어, 모든 유닛에게 동일한 목표 지점으로 이동하도록 명령할 수 있습니다.

(2) 그룹 동작(Group Behavior)

유닛 그룹은 명령을 받으면 각 유닛이 자신의 위치와 상황에 맞게 행동합니다. 예를 들어, 이동 명령을 받으면 그룹 내 유닛들이 서로 충돌하지 않도록 경로를 계산하며, 전투 시에는 자동

으로 적을 공격합니다.

결론

스타크래프트의 유닛 컨트롤 모드는 복잡한 자료구조와 알고리즘을 통해 구현됩니다. 각 유닛의 상태와 명령을 관리하는 자료구조는 유닛이 정확하고 효율적으로 플레이어의 명령을 수행할 수 있도록 도와줍니다. 또한 경로 탐색, 목표 선택, 명령 큐와 같은 알고리즘은 실시간 전략 게임의 핵심적인 게임 플레이 요소를 지원합니다.

+ Recent posts