RTS 게임 유닛 구조


18

moveTo 및 Attack 동작과 같은 항목을 두 번 이상 프로그래밍하지 않고도 다양한 단위를 만드는 방법을 원합니다.

내가 보는 방식에는 두 가지 방법이 있습니다.

  1. 할 수 있거나 할 수없는 것을 지정하는 플래그가 있는 단일 일반 단위 클래스 (정적 배열에서 인스턴스를 작성하고 필요할 때 가져옵니다)
  2. (Attack, Harvest, Patrol)과 같은 유닛 특정 액션에 대한 추상 메소드가있는 추상 유닛 클래스 . 이는 유닛이 실제로 아무것도 수확 할 수없는 경우에도 서브 클래스 에서 모두 구현해야합니다 .

이 작업을 수행하는 첫 번째 방법이 가장 단순 해 보이지만 대부분의 장치에서 사용되지 않는 많은 코드가 생길 수 있습니다.

두 번째 방법도 효과가 있습니다. 그러나 자원을 수확 할 수있는 두 개의 다른 단위를 사용하기로 결정하면 올바른 두 가지 클래스로 동일한 코드를 가지게 될 것입니다.

이 문제에 대한 올바른 접근 방법입니까?
AoE와 같은 게임에서 모든 유닛은 내가 생각하는 것의 일종의 행동 / 주문 목록을 가지고 있으며, 각 행동 / 주문을 한 번만 코딩 할 수있는 것과 비슷한 것을 달성하는 방법을 정말로 알고 싶습니다. 그런 다음 조치가 필요한 모든 부대에 제공하십시오.

불분명하거나 (그럴듯한) 정확히 찾고있는 것에 대한 자세한 정보가 필요하면 의견을 남겨주십시오.

답변:


25

공통 접근법은 기본 클래스 "Unit"이 모든 유닛이 공통적으로 가지고있는 가장 기본적인 측면을 구현하는 구성 요소 기반 접근 방식을 갖는 것입니다. 각 유닛은 수행 할 수있는 작업을 나타내는 여러 구성 요소 오브젝트 목록을 갖습니다. 어떻게하는지.

예를 들어, 탱크 구성 요소가있을 수 있습니다 Mobile, Destructible, Attacker, 움직이지는 터렛 Destructible, Attacker그리고 수확기 Mobile, Destructible, Harvester. 이러한 클래스에는 이러한 동작을 구현하는 데 필요한 모든 코드가 포함됩니다. 구성 요소 간의 상호 작용 ( Attacker무엇을 손상시킬 Destructible수 있음)은 구성 요소가 다른 장치에 필요한 구성 요소가 있는지 확인한 다음 해당 구성 요소와 직접 상호 작용하여 구현할 수 있습니다.

클래식 클래스 상속에 비해 장점을 쉽게 결합 할 수 있다는 것입니다. 예를 들어 보병을 공격하고 수송 할 수있는 수확기를 원할 경우 필요한 구성 요소 만 추가하면됩니다. 기본 Unit 클래스를 확장하지 않고도 새로운 구성 요소 형태로 새로운 기능을 쉽게 추가하고 제거 할 수 있습니다.

전체 엔진은 이미 컴포넌트 기반이기 때문에 Unity는 이러한 아키텍처에서 지원합니다. 따라서 이와 같은 게임 논리 구성 요소는 스크립트 형태로 추가 할 수 있습니다.


따라서 통일 적으로 필요에 따라 구성 요소를 비활성화하고 활성화합니까?
Daniel Holst

@DanielHolst 아니요, 필요에 따라 추가하고 제거합니다. 당신은 유니티 편집기 또는 scrips에 사용하여 그렇게 할 수 gameObject.AddComponentgameObject.RemoveComponent.
Philipp

아,하지만 "moveTo"액션 / 명령을 말하십시오. 주문이 언제 완료되는지 어떻게 알 수 있습니까?
Daniel Holst

2
@DanielHolst 나는 당신이 무언가를 잘못 이해했다고 생각합니다. Moving성분 수단 "이 유닛은 일반적으로 운동 할 수있다." 장치가 움직이는 지 여부에 관계없이 구성 요소가 영구적으로 부착됩니다. 지금 당장 움직이고있는 것은 아닙니다 . 주문을 이행하거나 취소 할 때 구성 요소를 구성 요소 에 추가하고 해당 구성 요소를 장치에서 제거 하면이 방법으로도이를 수행 할 있습니다 MoveOrder.
Philipp

1
@DanielHolst 이제 다른 웜 캔인 단위 AI의 방향으로 표류하고 있습니다. 가능한 접근 방식은 특정 구성 요소가 있다고 가정하거나 장치의 구성 요소에 따라 동작을 변경하는 AIScript 구성 요소 라이브러리를 갖는 것입니다. 그러나 이것은 주석에서 다루기가 너무 복잡한 주제입니다.
Philipp

4

많은 게임 들이 엔티티에 컴포넌트 기반 시스템을 사용 하는데 , 엔티티의 클래스 (또는 이와 동등한)의 일부로 코딩되지 않고보다 많은 행동과 능력을보다 일반적인 단위 유형에 추가 할 수있는 엔티티위한 컴포넌트 기반 시스템을 사용 합니다 .


구현하기가 매우 어려울까요?
Daniel Holst

이와 같은 패턴은 전반적인 구현을보다 쉽게하기 위해 사용됩니다. 어떤 접근 방식을 결정할 수 없다면 가능한 한 간단하게 시작하고 더 많은 기능을 사용할 때 선택을 늘리는 것이 좋습니다. 문제에 대해 더 많이 느끼면 상황에 더 적합한 접근 방식으로 리팩토링하거나 다시 작성할 수 있습니다.
로스 테일러 터너

1
@DanielHolst 질문에 Unity깃발이 있습니다. 유니티에는 이미 컴포넌트 시스템이 내장되어 있으며 상속보다 컴포지션을 선호 합니다. 한 가지 간단한 방법은 MonoBehaviour각 작업 유형에 대해을 만든 다음 수행 할 수있는 작업을 각 장치 유형에 미리 조립하는 것입니다 (손상 값 및 비용과 같은 유형별 세부 정보를 사용하여 작업 인스턴스 사용자 지정). 이를 통해 단위 생성을 데이터 기반으로 유지하므로 많은 사용자 지정 단위 유형을 쉽게 만들 수 있습니다.
DMGregory

@DanielHolst "매우 어려운"의 정의에 따라 다릅니다. 내 대답은 이것이 어떻게 구현 될 수 있는지에 대해 더 자세히 설명합니다.
Philipp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.