게임에서 공격 및 공격 유형에 대한 프로그래밍 디자인에 대한 통찰력을 찾고 있습니다.


14

이제 2D 공간 RTS에 대한 공격을 시작했습니다 (이것은 Unity에 있으므로 구성 요소 중심입니다). 처음에는 "범위 내 적, 데미지 적용"만큼 간단했습니다. 그러나 특정 선박이나 구조물과 관련된 여러 종류의 무기 / 공격이있을 것입니다. 뿐만 아니라 손상 유형 및 향후 관성 등의 원시 손상과 관련된 다른 요인도 있습니다.

각 유닛과 구조물 유형에 자체 공격 유형이 있습니까? 공격 유형, 피해, 효과, 범위, 입자, 스프라이트 등을 정의하는 각 단위 / 구조에 대한 스크립트를 작성하고 구성 요소로 첨부한다는 의미입니까?

또는 공격 유형을 정의하는 스크립트, 그와 관련된 발사체 유형의 스크립트 등을 만든 다음 각 스크립트를 단위 / 구조에 첨부하여이를 확장하고 각 단위에 대한 스크립트를 수정하십시오.


나는 어떤 의미가 있기를 바랍니다. 나는 이것을 오랫동안 숙고 해 왔으며 문제를 해결하고 있는지, 아니면 내 자신의 문제를 만들어 내고 구멍에 파고 있는지 확실하지 않습니다.

특정 유닛 / 구조로 제한되거나 제한되지 않는 다양한 공격 유형을 가질 수있는 게임을하는 경우, 컴포넌트 중심 설계 환경에서 특정 유닛 / 구조로 묶어 놓은 프레임 워크를 어떻게 설계합니까? ?

이것이 명확하지 않은 경우 알려주십시오.

편집 : 좋은 답변, 감사합니다.

확장 된 질문 :

대답은 "각 개체마다 고유 한 공격 스크립트를 가질 수 있음"부터 "공격 유형을 고유 한 스크립트로 지정하여 재사용 가능한 솔루션을 위해 각 개체에 할당하는 것"까지 다양합니다. "블래스터"공격이 있다고 가정 해 봅시다. 특정 속도로 붉은 발사체를 발사합니다. 피해, 발사 속도 및 발사체 크기는 발사하는 유닛에 따라 다릅니다. 해당 장치에 대한 공격 스크립트를 작성하거나 사용하려는 각 장치의 목적에 맞게 "블래스터 공격"을 시도하고 수정하는 것이 더 낫습니까?


1
일반적인 게임 프로그래밍 아이디어에 대해서는 RPG FFV의 전체 사양을 참조하고 싶습니다.- gamefaqs.com
Code Whisperer

답변:


12

글쎄, 나는 솔직히 이것에 대한 전문가는 아니지만 ... 공격이 얼마나 복잡하고 다양해 질지에 달려 있다고 생각합니다. 그것이 RTS이기 때문에 나는 당신이 아마도 자신의 공격 유형을 가진 10-50 정도의 다른 단위 또는 구조를 가질 것이라고 추측합니다.

옵션 1 : 다소 비슷한 공격을하는 단위 수가 비교적 적은 경우 모든 것을 하나의 큰 스크립트에 넣고 관리자에서 사용되는 매개 변수를 정의하면됩니다.

옵션 2 : 반면에, 다른 행동으로 다른 유형의 공격 유형을 구상하는 경우 각 유닛과 건물이 고유 한 공격 스크립트를 갖도록 모든 것을 분리 할 수 ​​있습니다. 이 작업을 수행하면 많은 개별 스크립트에서 가져올 수있는 일반적으로 사용되는 코드를 정의하는 "도우미"스크립트를 만들 수 있다고 생각합니다. 이렇게하면 모든 것을 다시 작성할 필요가 없으며 모든 것이 어디에 있는지 알게됩니다.

옵션 3 : 아마 당신이하지 말아야 할 것은 특정 그룹의 그룹이 스크립트를 공유하는 것인데, 이것은 당신을 혼란스럽게 할 것이고 공격에 필요한 코드가 10 개의 다른 스크립트에 있다면 혼란이 될 것입니다.

여기, 나는 당신에게 그림을 그렸습니다.

여기에 이미지 설명을 입력하십시오


2
답장을 보내 주셔서 대단히 감사합니다. 나는 어떤 이유로 옵션 3에 기대기 시작했고 그것을 정당화하는 방법을 찾는 데 어려움을 겪고있었습니다. 아마도 두 번째 경로로 갈 것입니다. 각 유닛은 각 유닛 / 건물의 구성 요소로 공통 코드를 공격하여 공통 코드가 공유되는 자체 사용자 지정 공격 스크립트를 얻습니다. 나는 옵션 3으로 인도하게 된 생각의 기차로 어디로 가고 있는지 잘 모르겠습니다. 감사합니다. 차임하려는 다른 포스터가있는 경우를 대비하여 오전에 일어날 때까지이 페이지를 열어 둡니다.
Douglas Gaskell

문제 없습니다. 확실한 답은 아니지만 도움이 되길 바랍니다.
Mir

1
하나의 큰 스크립트에 비슷한 공격을
래칫 괴물

4
# 3을 추천하는 것에 놀랐습니다. 각 단위가 자체 유형을 정의 할 필요가 없도록 모듈 식 / 일반 클래스의 전체 요점이 아닌가? 게임이 RTS이고 공성 피해 (일반적으로 "장거리")가 피해 유형 인 경우, 게임을 한 번 정의하고 피해 계산을 수행 할 때 여러 대포 스타일 유닛이 참조하도록하여 공성 피해를 너프 (밸런스드)를해야한다면 클래스 하나만 업데이트하면 되나요?
HC_

1
"Here, I drew you a picture."나에게 이것을
FreeAsInBeer

4

Unity에 대해 많이 알지 못하고 게임 개발을 한동안하지 않았으므로이 질문에 대한 일반적인 프로그래밍 답변을 드리겠습니다. 엔터티는 N 개의 많은 구성 요소와 관련된 숫자이고 구성 요소에는 데이터 만 포함되며 시스템은 다음과 관련된 구성 요소 집합에서 작동합니다. 같은 실체.

문제 공간은 다음과 같습니다.

  • 게임에서 적을 공격하는 방법은 여러 가지가 있습니다.
  • 각 선박, 구조물 등은 여러 가지 공격 방법을 가질 수 있습니다 (각각 어떤 방식으로 결정됨)
  • 각 공격마다 고유 한 입자 효과가있을 수 있습니다.
  • 공격은 대상과 사용자에게 존재하는 일부 요소 (예 : 관성 또는 갑옷 등)를 고려해야합니다.

솔루션을 다음과 같이 구성합니다.

  • 공격에는 식별자가 있습니다. 이것은 문자열 일 수 있습니다.
  • 개체는 공격의 식별자를 기반으로 공격을 사용할 수 있다는 것을 '알고'있습니다.
  • 엔터티에서 공격을 사용하면 해당 디스플레이 구성 요소가 장면에 추가됩니다.
  • 공격 대상, 공격자 및 사용중인 공격에 대해 알고있는 논리가 있습니다.이 논리는 사용자가 얼마나 많은 피해를 입게되는지 (및 관성에 액세스 할 수 있는지 또는 두 엔티티 모두) 결정해야합니다.

공격과 개체 사이의 접촉 지점이 가능한 한 얇아 야합니다. 이렇게하면 코드를 재사용 할 수 있으며 동일한 유형의 공격을 사용하는 각기 다른 유형의 개체에 대해 중복 코드를 만들지 않아도됩니다. . 다시 말해, 아이디어를 제공하는 JavaScript 의사 코드가 있습니다.

// components
var bulletStrength = { strength: 50 };
var inertia = { inertia: 100 };
var target = { entityId: 0 };
var bullets = {};
var entity = entityManager.create([bulletStrength, inertia, target, bullets]);

var bulletSystem = function() {
  this.update = function(deltaTime, entityId) {
    var bulletStrength = this.getComponentForEntity('bulletStrength', entityId);
    var targetComponent = this.getComponentForEntity('target', entityId);
    // you may instead elect to have the target object contain properties for the target, rather than expose the entity id
    var target = this.getComponentForEntity('inertia', targetComponent.entityId);

    // do some calculations based on the target and the bullet strength to determine what damage to deal
    target.health -= ....;
  }
};

register(bulletSystem).for(entities.with(['bullets']));

죄송합니다.이 답변은 '물'입니다. 나는 반 시간의 점심 시간 만 가지고 있으며 Unity에 대해 완전히 알지 못하면 무언가를 생각해 내기가 어렵습니다.


3

유닛 / 구조 / 무기가 공격 할 때, 아마도 공격자와 방어자 (또는 방어자)를 취하는 공격 (재미있는 세부 정보가 모두 포함 된)을 만들 것입니다. 그런 다음 공격은 대상 / 수비수 (느리게, 독, 피해, 상태 변경)와 상호 작용하고, 자신을 끌어 내고 (빔, 광선, 총알), 완료되면 스스로 처분 할 수 있습니다. 여러 독 공격과 같은 몇 가지 문제를 예상 할 수 있으므로 대상이 공격과 상호 작용하는 손상 가능 인터페이스를 구현할 수는 있지만 모듈 식이고 유연하게 변경할 수있는 실행 가능한 접근법이라고 생각합니다.

확장 된 답변
이 방법으로 블래스터 공격에 접근하는 방법 입니다. 다른 사람들이 스스로 대답하도록하겠습니다.

내 유닛이 기본 공격 통계 / 방법으로 IAttacker 인터페이스 또는 클래스를 구현하게 할 것입니다. IAttacker는 IDamageable을 공격 할 때 자신과 대상 (IAttacker 및 IDamageable 또는 IDamageable 모음)을 전달하는 특정 공격을 만듭니다. 공격은 IAttacker에서 필요한 통계를 가져옵니다 (업그레이드 또는 이와 유사한 상황에서 변경 사항을 피하기 위해-공격이 이미 시작된 후 통계를 변경하지 않기를 원함) 특수 통계가 필요한 경우 IAttacker를 필요한 유형 (예 : IBlasterAttacker)을 사용하여 특수 통계를 가져옵니다.

이 방법을 사용하면 BlasterAttacker는 BlasterAttack을 작성하기 만하면 나머지는 BlasterAttack이 처리합니다. BlasterAttack를 서브 클래스로 만들거나 별도의 FastBlasterAttacker, MegaBlasterAttacker, SniperBlasterAttacker 등을 생성 할 수 있으며 각각에 대한 공격 코드는 동일하며 BlasterAttack에서 상속 될 수 있습니다. .


기본적으로이 장치는 IAttacker 인터페이스에서 상속받으며 (이미 가지고 있음) "적"에 대한 IDamageable 인터페이스가 있습니다 (이것도 있습니다). 공격자가 공격하면 BlasterAttack (또는 파생 클래스)이 호출됩니다. 이 "공격"은 IAttacker에서 필요한 데이터를 검색하여 발사체가 닿을 때 IDamageable에 적용합니까? 발사체 자체에 BlasterAttack 클래스가 포함되어 있으므로 발사되면 더 이상 IAttacker의 변경에 영향을받지 않으며 실제로 발사체가 맞을 때만 IDamageable에 손상 / 효과를 적용 할 수 있습니다.
Douglas Gaskell

"BlasterAttack (또는 파생 클래스)가 호출되었다"고 말하면 BlasterAttack이 생성 된 것입니다. 그렇게 BlasterAttack이 새로 생성 된 인스턴스는 상기 빔 (또는 탄환 또는 선이든)을 나타내고 있다 발사체. BlasterAttack은 IAttacker 및 IDamageable 객체 (위치, 공격자 통계 등)에서 필요한 모든 통계를 복사합니다. BlasterAttack는 자체 위치를 추적하고 해당되는 경우 "접촉"에 대한 피해를 적용합니다. 목적지를 놓치거나 도달 한 경우 (대상의 이전 위치) 수행 할 작업을 파악해야합니다. 땅을 태워? 사라지다? 당신의 전화.
ricksmt

영향 지역 공격의 경우, 범위 내에있는 사람과 범위를 벗어난 사람이 화재와 충격 사이에서 변경 될 수 있기 때문에 (적) 유닛의 글로벌 컬렉션에 액세스 할 수 있습니다. 물론, BlasterAttack도 비슷한 주장을 할 수 있습니다 : 당신은 당신의 초기 목표를 놓치지 만 그 뒤에있는 사람을 때립니다. 저의 유일한 관심사는 당신이 공격 한 적과 공격 대상을 파악하려는 많은 적을 통해 많은 공격을 반복 할 수 있다는 것입니다. 그것은 성능 문제입니다.
ricksmt

아, 말이 되네요. 놓친 공격의 경우 발사체는 자체 사전 설정 범위 / 수명을 갖습니다. 수명이 끝나기 전에 다른 물체에 부딪 치면 충돌하는 강체를 소유 한 모든 물체에 대한 참조가 수신되고 그 방식으로 피해가 적용됩니다. 실제로 그것은 모든 발사체가 작동하는 방식이며, 그들이 무엇을 향해 가고 있는지 알지 못하고, 단지 미사일과 같은 귀환 유사 발사체는 제외하고 있습니다. AEO 효과는 대상에 구체 충돌체를 활성화하고 그 안에있는 모든 물체를 얻을 수 있습니다. 도와 주셔서 감사합니다.
Douglas Gaskell

문제 없어요. 다행 이네요 Unity가이 모든 충돌 작업을보다 쉽게 ​​만들어줍니다.
ricksmt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.