• 누적성
    • 누적 비용
      • 체력
      • 공포
    •  패널티
      • 월드패널티
        • 아젠다 ( 조우강화 )
      • 개인패널티
    • 메리트
      • 월드메리트
        • 단서 ( 목적 )
      • 개인메리트
        • 에셋
        • 조력자
  • 순환 자원
    • 자원
    • 덱 ( 무더기, 핸즈 )
  • 상대요소
    • 위치

 

  • 설정과 시스템간의 맥락
  • 누적기반 성장과 흐름기빈 전략

'플레이 게임 기록 > 보드게임' 카테고리의 다른 글

카르카손  (0) 2024.07.01
윙스팬  (0) 2024.07.01
사이드 ( 사이스 )  (0) 2024.07.01
겐지스 라자  (0) 2024.07.01
Just One  (0) 2024.07.01

 

전쟁 게임

  • 장르 키워드
    • 경쟁 PvP ( AI상대 기반 솔로플레이 가능 )
    • 자원 수집 게임 ( 획득한 자원의 합, 곱으로 점수 평가 )
  • 승패 결정 요소 ( 합 )
    • 하트등급 x (별-업적 + 자원종류-공간다양성 + 점령지-공간장악성)
    • 추가목표 = 보너스 점수 ( 랜덤선택 )
    • 돈 ( 소비재이긴 하나, 소비재 보다는 점수에 가까움 / 낮은 소비, 높은 수급량 )
  • 행동 조건
    • 2개씩 4쌍, 총 8개의 액션 존재
    • 4쌍중 하나의 액션을 고르며, 해당 쌍의 2개액션 중 원하는 것 수행 ( 둘 다 수행 가능 )
    • 비용과 효과는 액션단위로 구분 ( 쌍이 아님 )
  • 전략  고려요소
    • 게임의 목적은 "발전"
    • 각 발전마다 별개의 "자원" 소모
      • 원하는 발전 순서에 따라 필요자원이 달라짐
      • 필요자원 - 패널귀속(랜덤)
      • 보상자원 - 패널귀속(랜덤)
      • 스타트 포인트(주변자원 분포조건) - 국가귀속
      • 도하 능력 및 추가 능력 - 국가귀속
    • 하나의 행동은 연속2번할 수 없음 → 몰빵 어려움
    • 일꾼배치의 증가 = 자원채취행동비용의 증가 → 확장을 비용이 아닌 "영구적" 추가비용으로 제시 → 비용과 효용이 평행하게 유지됨
      • 라운드가 넘어갈 수록 "비용"대비 "턴"의 가치가 증가
      • 그래서 실제로 일꾼개방은 점점 효과적인 수단이 되기도 함
    • 전투 : 블라인드 시스템 but 상대방의 자원 ( 가능 소모 전투력-완전공개 / 추가카드-수량공개,수치미공개 but 카드카운팅은 가능 )
    • 비용 - 효용 요소
      • 일회성 액션(위)와 발전성 액션(아래)로 구분됨
      • 여기를 클릭하여 펼치기...
      • 일회성 액션
        • 주 목적은 크게 넷, 일시적 효과인 "조우/전투"와 영구적 효과인 "자원 수급, 중앙점령"으로 나뉨
          • 조우 : 초기의 빠른 자원 수급
          • 전투 : 자원(전투력, 전투카드)소모 상대방의 견제 및 자원의 탈취
          • 자원 수급 : → 발전
          • 중앙점령 : 영구적 효과 획득
      • 발전성 액션
        • 이전 액션에 따라 "비용"과 "보너스(자원)"가 결정
        • 이후 액션에 따라 "효용"이 결정
      • 비용-효용 분석
        • 자신의 패널(랜덤배정)에 최적화 된 테크트리
          • 패널에 의해 업그레이드 기본비용, 업그레이드 소켓, 보너스 자원이 결정되며,
          • 진행(발전) 상황에 따라 각 액션의 효율이 급격하게 변함
          • 패널의 효율에 따라 기본적인 발전 우선순위 채택
        • 동일행동 불가
          • 최소 수급자원 2종이상의 다양성을 확보하도록 유도
        • 세션선택 후 액션 다중선택 구조
          • 최대한 "한번에 2개의 액션을 전부 사용"할 수 있는것이 효과적
          • "턴"은 기본적으로 가장 귀중한 자원
    • 매력요소
      • "전투의 패배"는 "사망 혹은 소멸"이 아닌 "복귀"
      • 전투의 최소화, 혹은 전략에 따라 전투의 패배가 메리트를 충분히 가질 수 있는 구조
        • "실패"의 경험 약화
        • 상황의 변화에 따라 지속적인 전략 재수립이 가능한 구조
      • 빌드와 유닛배치상태에 따라 "효율적인 행동"이 달라짐
        • 동시에 "패널"과 "국가"로 인해 플레이어마다 전략, 행동의 효율이 다름
        • 우월전략과 열등전략이 존재하더라도, "해당 게임"에서만, "자신"에게만 적용되어 "경쟁"요소를 통해 상쇄되는 구조 ( 비대칭 경쟁게임이니까.. )
      • 컨셉 요소
        • 맥락(스토리, 설정)과 겹쳐서 "국가 테마", "플레이어 선택 고유 테마(테슬라카드)"가 달라지며, 거기에 맞춰"업그레이드" "건설" "로봇 생산"등으로 연결
    • 문제
      • 각 액션이 대등한가
        • 상황, 자원, 위치, 패널에 따라 액션의 비용-효용이 변할정도는 됨. 그러나 패널간의 밸런스가 대등한지는 모르겠음 ( 패널마다 고효율 액션이 다름 → but 각 액션의 본질적 효율성이 다름 → 물론 초반/후반 효율이 변하고, 결국 다 하긴 해야하지만 )
      • 자원의 다양화를 강조
        • ( 명예 x 장악력 ) + 금전 + 부가목표로 점수를 계산
          • 금전은 사실상 수급량이 고정 ( 액션수급은 효율이 낮고, 발전 보상은 후반부에는 거의다 완료해야 하므로 )
          • 장악권은 일시적
            • 장악력 - 자원"종류"를 수집/보유하는것은 "인위적"인 억지요소 기능

'플레이 게임 기록 > 보드게임' 카테고리의 다른 글

윙스팬  (0) 2024.07.01
아캄 호러  (0) 2024.07.01
겐지스 라자  (0) 2024.07.01
Just One  (0) 2024.07.01
5분던전  (0) 2024.07.01

'플레이 게임 기록 > 보드게임' 카테고리의 다른 글

윙스팬  (0) 2024.07.01
아캄 호러  (0) 2024.07.01
사이드 ( 사이스 )  (0) 2024.07.01
Just One  (0) 2024.07.01
5분던전  (0) 2024.07.01

'플레이 게임 기록 > 보드게임' 카테고리의 다른 글

윙스팬  (0) 2024.07.01
아캄 호러  (0) 2024.07.01
사이드 ( 사이스 )  (0) 2024.07.01
겐지스 라자  (0) 2024.07.01
5분던전  (0) 2024.07.01

 

'플레이 게임 기록 > 보드게임' 카테고리의 다른 글

윙스팬  (0) 2024.07.01
아캄 호러  (0) 2024.07.01
사이드 ( 사이스 )  (0) 2024.07.01
겐지스 라자  (0) 2024.07.01
Just One  (0) 2024.07.01

생각정리.xlsx
5.42MB

 

Unreal Interface로 생성

Interface에는 추상함수만 추가

- 선언

- virtual [type] name ([params]) = 0;

 

 

ClassName : Parent Class, Interface1, Interface2

- 상속

- TScriptInterface<type> name -> 이렇게하면 사용할때 interface로 cast없이 사용가능 ( 모든Object에 대해 )

 

'Unreal > UE Architecture' 카테고리의 다른 글

Gameplay Ability System  (0) 2024.06.13
Cpp -> BP Pipeline 1  (0) 2024.05.17
문자열 처리  (0) 2024.05.16
UE Macro & Reflection System  (0) 2024.05.16
Smart Pointer & Container & Serialize  (0) 2024.05.16

인프런 : https://www.inflearn.com/course/%EC%9D%B4%EB%93%9D%EC%9A%B0-%EC%96%B8%EB%A6%AC%EC%96%BC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-part-4/dashboard

Udemy : https://www.udemy.com/course/unreal-engine-5-gas-top-down-rpg/

추가 문서 : https://kkadalg.tistory.com/29

command list

- showdebug abilitysystem

  - PageUp/Down으로 ASC를 가진 객체들을 순환할 수 있음

  -> DefaultGame.ini에서 [/Script/GameplayAbilities/AbilitySystemGlobals] bUseDebugTargetFromHud=True로 해줘야 AI도 보임

 

1. ASC ( AbilitySystemComponent )

- Actor에 interface 설정 : public IAbilitySystemInterface

- ASC . InitAbilityActorInfo( 실 소유자, 시각효과 발현자 ) ( possessed시(server), onrep_playerstate시(client) )

   -> 실 소유자의 owner는 항상 playercontroller야 함 ( playerstate owner는 항상 controller, pawn은 possess시 controller )

- ASC . TryActivateAbility, CancelAbilityHandle ( FGameplayAbilitySpec* . Handle )

- 접근 - UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent( 소유 액터 )

- 외부에서는 GetGameplayAttributeValueChangeDelegate() 같은걸로 attribute change noti delegate를 구독할 수있음

- SetReplicationMode Minimal AI용, Mixed 플레이어용, Full 싱글플레이어용

  Use Case GE Tag, Cue
Full Single o o
Mixed Multi, PlayerControlled owner-only o
Minimal Multi, AI-Controlled x o

 

2. GA ( GamePlayAbility )

- 액션단위

- ASC에선 FGameplayAbilitySpec* 으로 액션에 대한 instance를 제어 ( . handle을 통해 asc에서 내부 function에 접근 )

- FGameplayAbilitySpec* .. = ASC . FindAbilitySpecFromClass ( {GamePlayAction.child}::StaticClass() ) 로 생성

  - InstancingPolicty ( * 꼭 설정해줄것. default가 InstancedPerExecution )

     - NonInstanced : 인스턴싱 없이 CDO에서 일괄 처리, 단순, 상태부여는 어렵

     - InstancedPerActor : 액터마다 인스턴스. 고유스테이트 - 일반적

     - InstancedPerExecution : 어빌리티 발동시마다 인스턴스 발동. 액션마다 스테이트

 - 폰들 ( ASC의 owner 및 avatar )에 대해선 각 메서드 super에서 parameter로 받는 ActorInfo 내에 owner, avatar를 통해 접근 가능

 - GA를 상속받은 BP에서 각 State ( override )에서의 GameplayTag를 정의할 수 있음

 

3. GameplayTag

- #include "GameplayTagContainer.h"

- DefaultGameplayTags.ini에 생성 및 관리

- 계층구조를 가지는 태그 ( ex Actor . Action . Rotate )

- 쿼리검색 -> HasTagExact, HasAny, HasAnyExact, HasAll, HasAllExact 등

- Gameplay Ability System에서 사전정의된 태그리스트가 있음

  - AbilityTags 태그컨테이너

  - CancelAbilitiesWithTag 태그 컨테이너 등 ( BlockAbilitiesWithTag, ActivationOwnedTags, ActivationRequiredTags ... )

- 파라미터로 사용할 Tag의 포인터는 FGameplayTag::RequestGameplayTag(FName("태그이름")) 으로 얻음

   ( FGameplayTagContainer 타입 )

 

4. 기본 Architecture

- GA에 AbilityTags.AddTag로 어빌리티 태그 할당, ActivationOwnedTags로 상태태그 추가

- ASC -> GiveAbility를 통해 ASC에 해당 GA 추가

  ( FGameplayAbilitySpec ..(GA)를 GiveAbility에 박음. FGASpec이 GA 매니저인듯 )

- ASC -> TryActivateAbilititesByTag나 CancelAbilities 를 통해 Tag로 GA 트리거

 

5. GASpec ( Gameplay Ability Spec )

- ASC에서 GA를 관리할때 사용하는 중간매개체 ( 정확히는 GASpec의 Handle을 통해 관리 )

- 추가적인 메타데이터, 설정값을 포함

- GA의 상태 등에 대해 가져올 수 있음

- Handle값은 전역이며, 스펙생성시 1씩증가 ( 기본값 -1 )

- GA의 instance에 in32 InputID를 할당하고 ASC에서 ID를통해 접근할 수 있음 ( FindAbilitySpecFromInputID )

    -> GA가 발동중이면 입력신호전달 ( AbilitySpecInputPressed, 아니라면 발동 TryActivateAbility 하는 등 )

    -> 입력 release시 AbilitySpecInputReleased

 

6. AT ( Ability Task )

- NewAbilityTask < child class > ( owner GA ) 로 생성

- GA는 1frame내 동기처리가 기본

- animation과 타이밍 등 비동기적 요소가 포함된 스펙을 AT에서 관리

  - UAbilityTask_PlayMontageAndWait 등

    - 해당 태스크의 static 변수로 이닛 ( ex. CreatePlayMontageAndWaitProxy )

    - OnComplated 등에 AddDynamic으로 콜백함수 연결하고 ( GA의 ActivateAbility 메서드 시점에서 AT의 델리게이트를 GA 콜백함수에 연결 )

    - FreadyForActivation();으로 실행개시

    - 필요시 콜백함수에서 GA의 EndAbility ( GA종료 ) 호출

    - MontageJumpToSection 등 내장된 편의기능이 많음 ( GA )

 - 시작 : Activate ( override ) , 종료 : OnDestroy ( override )

 - static method에서 NewAbilityTask < AT class(보통자신) > ( GA ) 넣어서 해당 ga용 특정 at 생성 가능

 - 얘넨 그냥 GetAvatarActor 가지고있네 내장함수로

 

예제에서는 EnhancedInputSystem에서 IA에 Callback함수를 binding할 때, 같은 Callback을 바인딩하고 input param에 GA의 Id를 줘서 하나의 callback 함수로 여러 input(IA) -> action(GA)을 바인딩하고있음

 

7. GE ( Gameplay Event )

- ( Anim Notify등에서 ) Actor(보통 캐릭터)의 가상함수에

FGameplayEventData PayloadData;
UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(OwnerActor, TriggerGameplayTag, PayloadData);

  를 보낼 수 있음. TriggerGameplayTag는 블프나 notify detail에서 할당해도되고, 코드에 직접박아도 되고

그리고 액터의 ASC에 GA를 바인딩한 다음, GA의 AbilityTriggers ( TArray<FAbilityTriggerData>)에 해당 TriggerGameplayTag를 등록

  - 등록은 걍 BP에서 하는게 편함

 

8. TA ( GameplayAbilityTargetActor )

- StartTagetting -> ConfirmTargeting(AndContinue), CancelTargeting 등

- 타켓 판정 및 관리 ( line trace, collision trace 등 )

  - Target Data Handle에서 Target Data들을 묶어서 전달

- SpawnActorDeffered로 지연생성하고, 델리게이트 구독 등 초기화 별도로 해줌 ( AT에서 )

   -> FinishSpawning -> StartTargetting(in Ability) -> ConfirmTargeting

- Start에서 SourceActor에 타격판정할 액터 등록 // #If Enable Draw Debug

 

9. Attribute Set

- GameplayAttributeData : 단일 프로퍼티

   - Base Value

   - Current Value : 버프등으로 인한 변동값

- ASC는 등록될 때, Owner에있는 Attribute Set 객체들을 자동으로 등록함 ( ASC variable과 동일한 클래스 내에서 )

   -> 그냥 variable 선언하고, CreateDefaultSubobject로 할당하면됨

   -> ASC->GetSet<class>()

- Attribute Set class 안에있는 매크로 참조하여 사용. 아래쪽에 전처리#def 해서 getter, setter, inniter 자동생성 매크로 있음

#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
    GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
ATTRIBUTE_ACCESSORS(UABCharacterAttributeSet, AttackRange);

- PreAttributeChange, PostAttributeChange등의 가상함수를 제공

- MetaAttribute

   - 확장성을 위해 중간단계에 추상성 계산단계를 추가

   - ex. 공격로직을 hp에 직접 적용하지 않고 공격로직 -> Damage attritue -> hp attribute 등 ( 회복, 쉴드 등 추가개념 확장을 위해. 데미지는 음수가된다고 회복처리가 아니어야 함 )

 - PostGameplayEffectExecution 함수에는 Effect에 의해 Modi된 값이 들어옴

 - delegate 선언 시 mutable 선언을 통해서 const를 뺀 get/set에 접근

 - Data.Target.AddLosseGameplayTag로 태그추가가능

 

10. GE ( Gameplay Effect )

- GA에서 MakeOutgoingGameplayEffectSpec(GE클래스) 만들어서 핸들러로 사용

  -> ApplyGameplayEffectSpecToTarget

- 기본타입(DurationPolicy) : instant, duration, infinite

- 모디파이어로 어트리뷰트 변형방법을 지정 ( 혹은 GameplayEffectExecutionCalculation을 통해 커스텀 )

   -> .Attribute, .ModifierOp -> FGameplayEffectModifierMagnitude타입 변수를 생성 -> [Modifier].ModifierManitude = 해당변수

   -> MagnitudeType - Custom Calc Class  : Gameplay Mod Magnitude Calculator를 참조

- 로직보단 세팅위주여서 BP를 권장

- DataTag를 통해서도 호출가능

 ( GE에 DataTag 등록 -> EffectSpecHandle.Data->SetSetbyCallerMagnitude(태그, attribute ), 다음 apply )

- GEContext : 정보를 담은 객체 ( instigator, causer, hit result 등 )

- GESpec : GE관련 정보 ( level, modifier, tag, context handle 등 )

 -> GESpecHandle -> GESpec -> GEContextHandle -> GEContext ( GA없이 ASC가 직접 접근도 가능 )

 -> 그래서 GEContext만들고, handle만든다음, 해당핸들을 param으로 GESpec 생성하고, GESpecHandle 생성

FGameplayEffectContextHandle EffectContextHandle = ASC->MakeEffectContext();
EffectContextHandle.AddSourceObject(this);
FGameplayEffectSpecHandle EffectSpecHandle = ASC->MakeOutgoingSpec(InitStatEffect, Level, EffectContextHandle);
if (EffectSpecHandle.IsValid())
{
    ASC->BP_ApplyGameplayEffectSpecToSelf(EffectSpecHandle);
}

- type이 Instance거나, bisPeriod = true인 경우에는 base value를 바꾸지만, 아닌 경우에는 current value 변경(버프취급)

 

11. GC ( Gameplay Cue )

- VFX나 SFX같이 로직과 상관없는 애들

  - Static GC 순간발생

  - Actor GC 기간발생

- Tag를 통해 발동시킬떄는, GameplayCue로 시작하는 태그를 사용해야 함

- GA에서 GCParam을 만들고, 해당파람.EffectContext에 GEContextHandle을 주입 -> ASC->ExecutecuteGameplayCue()

 

 

 

 

ps.

float 유효범위 정의 : FString::Printf(TEXT("%.0f / %0.f"), float, float)

'Unreal > UE Architecture' 카테고리의 다른 글

Unreal Interface  (0) 2024.06.16
Cpp -> BP Pipeline 1  (0) 2024.05.17
문자열 처리  (0) 2024.05.16
UE Macro & Reflection System  (0) 2024.05.16
Smart Pointer & Container & Serialize  (0) 2024.05.16

+ Recent posts