어떤 시점에서 엔진은 게임에 대한 전문 지식과 지식을 가져야합니다. 나는 여기서 접선을 떠날 것이다.
RTS에서 자원을 가져 가십시오. 하나 개의 게임이있을 수 있습니다 Credits
및 Crystal
다른 Metal
및Potatoes
OO 개념을 올바르게 사용하고 최대한 활용해야합니다. 코드 재사용. Resource
여기에 개념이 존재 한다는 것이 분명합니다 .
따라서 우리는 자원이 다음과 같이 결정합니다.
- 스스로 증가 / 감소시키는 메인 루프의 고리
- 현재 금액을 얻는 방법 (을 반환
int
)
- 임의로 빼거나 추가하는 방법 (리소스를 이동하는 플레이어, 구매 ....)
이 개념은 Resource
게임에서 킬이나 포인트를 나타낼 수 있습니다! 매우 강력하지 않습니다.
이제 게임에 대해 생각해 봅시다. 동전을 처리하고 출력에 소수점을 추가하여 일종의 통화를 할 수 있습니다. 우리가 할 수없는 것은 "순간적인"자원입니다. "전력망 생성"과 같이
InstantResource
비슷한 방법 으로 클래스 를 추가한다고 가정 해 봅시다 . 이제 리소스로 엔진을 오염시키고 있습니다.
문제
RTS 예제를 다시 보자. 플레이어 Crystal
가 다른 플레이어에게 어떤 것을 기부한다고 가정하십시오 . 당신은 다음과 같은 것을하고 싶습니다 :
if(transfer.target == engine.getPlayerId()) {
engine.hud.addIncoming("You got "+transfer.quantity+" of "+
engine.resourceDictionary.getNameOf(transfer.resourceId)+
" from "+engine.getPlayer(transfer.source).name);
}
engine.getPlayer(transfer.target).getResourceById(transfer.resourceId).add(transfer.quantity)
engine.getPlayer(transfer.source).getResourceById(transfer.resourceId).add(-transfer.quantity)
그러나 이것은 정말 지저분합니다. 일반적인 목적이지만 지저분합니다. 이미 a resourceDictionary
를 부과하지만 이제는 리소스에 이름이 있어야 함을 의미합니다! 그리고 그것은 플레이어 당이므로 더 이상 팀 리소스를 가질 수 없습니다.
이것은 "너무 많은"추상화 (내가 인정할 훌륭한 예가 아님) 대신 게임에 플레이어와 크리스탈이 있다는 점을 받아 들여야한다 (예를 들어).
engine.getPlayer(transfer.target).crystal().receiveDonation(transfer)
engine.getPlayer(transfer.source).crystal().sendDonation(transfer)
의 객체가 기부금의 이체 / 송금을 위해 HUD에 물건을 자동으로 표시 하는 클래스 Player
및 클래스가 CurrentPlayer
있는 경우 .CurrentPlayer
crystal
이것은 크리스탈, 크리스탈 기부, 현재 플레이어를위한 HUD 메시지 등으로 엔진을 오염시킵니다. 더 빠르고 읽기 / 쓰기 / 유지 관리가 더 빠릅니다 (훨씬 빠르지 않기 때문에 더 중요합니다)
최종 비고
리소스 사례는 훌륭하지 않습니다. 그래도 요점을 볼 수 있기를 바랍니다. 어떤 경우에 나는 것을 증명하고있다 "자원 엔진에 속하지 않는" 특정 게임의 요구와 어떤 자원의 모든 개념에 적용이 매우 다른 것을 무엇으로. 일반적으로 3 (또는 4) 개의 "레이어"가 있습니다.
- "핵심"-엔진의 교과서 정의, 이벤트 후크가 포함 된 장면 그래프, 쉐이더 및 네트워크 패킷 및 플레이어의 추상 개념을 다룹니다.
- "GameCore"-RTS의 리소스 또는 FPS의 탄약과 같은 게임 유형에 일반적이지만 모든 게임에 해당되는 것은 아닙니다. 게임 로직이 여기에 스며 들기 시작합니다. 이것은 우리의 초기 자원 개념이있는 곳입니다. 대부분의 RTS 리소스에 적합한 내용을 추가했습니다.
- "GameLogic"실제 게임에 따라 다릅니다. 이름이
creature
or ship
또는 같은 변수가 있습니다 squad
. 사용 상속 3 층에 걸쳐 수업거야 당신이 (예를 들어 것은 Crystal
A는 Resource
어떤 A는 GameLoopEventListener
말)
- "자산"은 다른 게임에는 쓸모가 없습니다. 반감기 2의 AI 스크립트 결합을 예로 들어, 동일한 엔진을 가진 RTS에서는 사용되지 않습니다.
오래된 엔진에서 새로운 게임 만들기
이것은 매우 일반적입니다. 1 단계는 레이어 3과 4를 제거하는 것입니다 (게임이 완전히 다른 유형 인 경우 2). 이전 RTS에서 RTS를 만들고 있다고 가정합니다. 우리는 여전히 크리스탈과 재료가 아닌 리소스를 가지고 있습니다. 따라서 레이어 2와 1의 기본 클래스는 여전히 의미가 있습니다 .3과 4에서 참조 된 크리스탈은 모두 버릴 수 있습니다. 우리는 그렇게합니다. 그러나 우리는 그것을 우리가하고 싶은 것에 대한 참조로 확인할 수 있습니다.
층 1의 오염
이런 일이 일어날 수 있습니다. 추상화와 성능은 적입니다. 예를 들어 UE4는 최적화 된 구성 사례를 많이 제공합니다 (따라서 X와 Y를 원한다면 누군가가 X와 Y를 함께 빠르게 처리하는 코드를 작성했습니다. 두 가지를 모두 수행한다는 것을 알고 있습니다). 이것은 나쁘지 않지만 시간이 많이 걸립니다. 레이어 1은 "데이터를 셰이더에 전달하는 방법"및 사물을 애니메이션하는 방법과 같은 것을 결정합니다. 프로젝트에 가장 적합한 방법은 항상 좋습니다. 미래를 위해 노력하고 계획하십시오. 코드를 재사용하는 것이 친구입니다.
레이어 분류
마지막으로 (나는 약속한다) 레이어를 너무 두려워하지 마십시오. 엔진은 예전의 고정 기능 파이프 라인의 오래된 용어로, 엔진은 그래픽 방식으로 거의 같은 방식으로 작동했으며 (결과적으로 많은 공통점이 있음) 프로그래밍 가능한 파이프 라인이이를 머리에서 돌리고 "레이어 1"이 오염되었습니다. 개발자가 원하는 효과를 AI는 엔진의 차별화 된 기능 (수많은 접근법 때문에)이었으며 이제는 AI와 그래픽입니다.
이 레이어에 코드를 제출해서는 안됩니다. 유명한 언리얼 엔진조차도 게임마다 다른 많은 버전이 있습니다. 변경되지 않은 파일 구조 (데이터 구조가 아닌 것 등)는 거의 없습니다. 이건 괜찮아! 다른 게임에서 새 게임을 만들려면 30 분 이상 걸립니다. 핵심은 계획, 복사 및 붙여 넣을 비트 및 남겨 둘 비트를 아는 것입니다.