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

class reference 기반 spawn 플로우

Detail Pannel에서 [class reference]칸 만들기

  1. ADisPatcherChild를 상속하는 클래스 중 선택
    1. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dispatcher")
         TSubclassOf<ADisPatcherChild> ChildClass;
      
  2. 선택된 class의 객체 만들기
    1. [SpawnActorDeferred<AActor> 사용]
      1. TempChild = GetWorld()->SpawnActorDeferred<AActor>(ChildClass, FTransform(TargetLoc), nullptr, nullptr, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
        TempChild->FinishSpawning(FTransform(TargetLoc));
      2. Cast는 따로 해줘야 함 ( return값은 AActor type )

 

좌표 변환

예시 : 

TargetLoc = FScaleRotationTranslationMatrix(FVector(0, 0, 0), FRotator(0, 0, 0), FVector(0, 0, 0)).TransformPosition(TargetLoc);
  • (combine)(dependent)(select)FScaleMatrix.(FVector).TransformPosition(location)(FVector)Rotation(FRotator)Vector(direction)Translation(FVector)

 

function Override

  1. 필요한 argument들을 가진 method를 만든다. ( header & source ) ( copilot🧡 )
  2. [Component or Actor] → [Target function].AddDynamic( target instance, ref 위에서만든 method )
    1. BP에선 override function인데, 가상함수가 아님.. arguments입력시의 휴먼에러 대한 무결성을 보장해주지는 않는듯?
    2. 원하는 method를 특정 event에 matching시켜주는 형태 ( parameter는 수기입.. )
      1. 필요한 argument들을 가진 method를 만든다. ( header & source ) ( copilot🧡 )
      2.  
      3. [Component or Actor] → [Target function].AddDynamic( target instance, ref 위에서만든 method )
        1. BP에선 override function인데, 가상함수가 아님.. arguments입력시의 휴먼에러 대한 무결성을 보장해주지는 않는듯?
        2. 원하는 method를 특정 event에 matching시켜주는 형태 ( parameter는 수기입.. )

 

코드에서 경로로 에셋 참조하기

SkeletalMesh3에게 "주소"가 참조하는 class를 <USkeletalMesh>의 ptr 타입을 포함한 클래스 반환 ( ptr은 .Object에 저장 )
이렇게 반환받은 SkeletalMesh3에 .Object var에 저장 ( USkeletalMEsh ptr 타입으로 )

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

Unreal Interface  (0) 2024.06.16
Gameplay Ability System  (0) 2024.06.13
문자열 처리  (0) 2024.05.16
UE Macro & Reflection System  (0) 2024.05.16
Smart Pointer & Container & Serialize  (0) 2024.05.16

Char[] → FString

Char[] ← *FString ↔ FCString

 

Char[]
FString
FCString
Char[]   FString   FCString
Char[]
( *Char )
-> FString <-> FCString
Char[]
( *Char )
<- *FString    

 

FString

FCString

  • 메모리수준 조작이라고 하는데 사실 언제 쓸지 감이 안잡힘 

 

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

Gameplay Ability System  (0) 2024.06.13
Cpp -> BP Pipeline 1  (0) 2024.05.17
UE Macro & Reflection System  (0) 2024.05.16
Smart Pointer & Container & Serialize  (0) 2024.05.16
Input  (0) 2024.05.16

Unreal Macro 선언 및 flag

  • UCLASS( )
  • UENUM( )
    • BlueprintType : Blueprint에서 read / write 가능
  • USTRUCT
    • Atomic : 하나단위로 직렬화
    • BlueprintType : Blueprint에서 read / write 가능
  • UFUNCTION( )
    • BlueprintCallable : Blueprint에서 사용 가능
    • Category = <string>("TopCategory|SubCategory|Etc") : function은 필수 항목
  • UPROPERTY( )
    • EditAnywhere / VisibleAnywhere : architecture type / level에 배치된 instance 양쪽에서 수정 가능
    • BlueprintReadWrite / BlueprintReadOnly : blueprint에서 read, write
    • Category = <string> : detail 패널에서 categorizing

 

Refleaction System

클래스 관리, 참조, 접근을 위해 클래스 포맷을 관리하는 시스템

  • C#이나 Java같은 후발 객체지향언어에는 언어자체에서 구현되어있는 개념

 

UBT(unreal build tool) 및 UHT(unreal header tool)을 통해 모사

  • 클래스 생성 시, 클래스에 대한 형태를 관리하는 매크로를 자동 생성
  • 런타임에 클래스 포맷 혹은 포맷분석을 통해 역으로 바이너리 데이터를 탐색/조작하기 위함 ( 자기 자신을 파악 )
  • UHT에 의해 만들어진 리플렉션 포맷 파일은 intermediate 폴더 내에 자동으로 생성
    • 구문이 변경될떄마다 자동으로 수정됨
    • 컴파일 분석 수준의 기능은 제공하지 않음
  • 주 용도
    • 런타임에 class내의 property 접근(읽기/쓰기) ( editor환경 등 )
    • 직렬화
    • 자체적인 GC시스템
  • 주 관리
    • <UClass> {class}::staticclass를 통해 class포맷에 접근 가능 ( 자기자신은 getClass() )
      • createdefaultsubobject(cdo), newobject(runtime)
      • <UProperty> FindPropertyByName
    • 생성자에서 명시한 건 CDO(class default object) 수준에서 관리 ( UClass에서 CDO를 참조함 )
    •  
  • 클래스 하이어라키
    • UField
      • UStruct
        • UClass
        • UScriptStruct
        • UFunction
      • UEnum
      • UProperty

 

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

Cpp -> BP Pipeline 1  (0) 2024.05.17
문자열 처리  (0) 2024.05.16
Smart Pointer & Container & Serialize  (0) 2024.05.16
Input  (0) 2024.05.16
기본 구성  (0) 2024.05.16

Smart Pointer

  • 구조
  • 구성
  Own the object Prevent Deletion Unique Property Converted by
TSharedPtr yes yes
(ref counting)
can point null MakeShared()
TSharedRef yes yes must point valid object MakeShareable()
TWeakPtr no no breaks ref cycle  
  • TSharePtr - 참조 카운트 기반 GC, 오브젝트 소유
  • TShareRef - Ptr과 동일하나, null값 미허용
  • TWeakPtr - Ptr과 동일하나, 오브젝트 미소유
  • TUniquePtr - Ptr과 동일하나, 하나의 오브젝트는 여러개의 UniquePtr을 가질 수 없음 ( 소유권 이전은 가능 )
  • ( MakeSharable )

 

Hard, Soft referencing

    • A가 B를 Hard Reference 하고 있다면, A가 로딩될 때 B도 로딩된다.
      반면 A가 B를 Soft Reference 한다면, B 애셋의 경로 등을 string의 형태로 가지고 있다는 뜻이다.

Direct Property Reference (Hard Reference)

    • UPROPERTY를 붙여 변수를 선언하면, 해당 변수(혹은 블루프린트)가 로드될 때 이에 대응하는 애셋 또한 로딩된다.
    • Hard Reference
      /** construction start sound stinger */
      UPROPERTY(EditDefaultsOnly, Category=Building)
      USoundCue* ConstructionStartStinger;

Construction Time Reference (Hard Reference)

    • ConstructorHelpers 클래스를 이용해 애셋을 로딩할 때도 동일하다.
    • Hard Reference
      /** gray health bar texture */
      UPROPERTY()
      class UTexture2D* BarFillTexture;
       
      AStrategyHUD::AStrategyHUD(const FObjectInitializer& ObjectInitializer) :
          Super(ObjectInitializer)
      {
          static ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("/Game/UI/HUD/BarFill"));
          assert(nullptr != BarFillObj);
          BarFillTexture = BarFillObj.Object;
      }

Indirect Property Reference (Soft Reference)

    • FSoftObjectPath를 이용해 경로를 보관한다. 그 후 TSoftObjectPtr를 사용해 템플릿화 된 코드를 저장한다.
      실제로 애셋을 로딩할 때는 LoadObject<T>() 함수를 호출해야 한다.
    • Soft Reference
      UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category=Building)
      TSoftObjectPtr<UStaticMesh> BaseMesh;
       
      UStaticMesh* GetLazyLoadedMesh()
      {
          if (BaseMesh.IsPending())
          {
              const FSoftObjectPath& AssetRef = BaseMesh.ToStringReference();
              BaseMesh = Cast< UStaticMesh>(Streamable.SynchronousLoad(AssetRef));
          }
          return BaseMesh.Get();
      }

Find / Load Object (Soft Reference)

    • UPROPERTY를 이용하지 않고, 애셋과 경로 정보를 가지고 직접 애셋을 로드할 수 도 있다.
      만약 이미 로드된 애셋(혹은 UObject)을 찾는다면 FindObject<T>()를 사용하면 된다.
      만약 로드되지 않은 애셋을 로드하고 싶다면 LoadObject<T>()를 사용한다.
    • Soft Reference
      AFunctionalTest* TestToRun = FindObject<AFunctionalTest>(TestsOuter, *TestName);
      GridTexture = LoadObject<UTexture2D>(NULL, TEXT("/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid"), NULL, LOAD_None, NULL);

 

Container

  • Common
    • 값복사 : FMemory::Memcpy( {복사될 컨테이너}, {복사할 컨테이너}, 복사할 메모리 크기 ( ex, sizeof(int32) * {복사될 컨테이너}.Num )
    • 언리얼 배열 초기화 : { 값1, 값2, ... 값n }
    • 기본 메서드
      • Num : 배열 길이 반환
      • Add / Emplace : 끝에 값 추가 ( add는 임시변수에 넣은 다음 컨테이너에 복사하므로, 보통 emplace가 낫다는듯 )
    • Contains는 체크용. (if true, get return)값도 얻을거면 Find

 

 

 

  •  TMap
    • key-value map
    • Find( {key} ) → return할때 value의 pointer를 반환하는것에 주의
    • 동적배열이라 iteration 속도 괜춘
    • 해시 기반이라 searching 빠름 ( TSet 형태 따름 )
      • 기본이 key값 Unique. key값 중복 필요하면 TMultiMap 사용
    • TSet의 항목을 TPair<KeyType, ValueType>으로 구성한 구조

 

  • UStruct
    • Generated_body 매크로 선언시, 실제로는 UScriptStruct 클래스로 구현됨
      • 제한적 리플렉션. UPROPERTY만 선언가능, UFUNCTION은 불가
    • F가 접두로 붙음
      • 힙 메모리 할당(포인터 연산) 없이 스택내 데이터로 사용 ( new, newobject 사용 불가 )

 

 

Serialize

  • Path Manager
    • FPaths
      • <FString> Combine ( <FString> PrePath, <FString> PostPath ) : 경로 string을 합쳐주는듯..? 그냥 concat, join이랑 동일한듯..?
        • 사이에 "/" 붙여주는 듯
      • <void> MakeStandardFileName ( <FString> 변환할 ptr ) : 변환할 ptr을 스탠다트 경로로 바꿔줌 ( 절대경로)
        • 현재의 상대경로를 절대경로로 변경 해줌
    • FPlatformMisc
      • <FString> ProjectDir( ) : 프로젝트 루트 경로 반환

 

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

Cpp -> BP Pipeline 1  (0) 2024.05.17
문자열 처리  (0) 2024.05.16
UE Macro & Reflection System  (0) 2024.05.16
Input  (0) 2024.05.16
기본 구성  (0) 2024.05.16

입력 전달 플로우

 

기본 Input Binding Delegate

subsystem인 InputComponent instance의 delegate를 통해 input-action binding하는 구조
InputComponent→BindAxis(" input name ", target instance, & exec function )
InputComponent→BindAction(" input name ", target instance, & exec function )


  • bind axis의 타겟 function은 float 파라미터를 가져야 함
  • input name은 editor - project setting - input 의 keybinding에 할당한 key값


ex)
class hi()
{
  • InputComponent→BindAxis ( "move_forward", this, hi::movef )
  • hi::movef ( float move_f ) { character.move_forward }
}

 

 

 

Enhanced Input System

  • input modifier
  • input action
  • input mapping context

 

구조 개요

회전 입력 전달 경로

  • 이동
    • Pawn :: AddMovementInput
      • Controller Rotation기준으로 forward, right vector 계산

 

Input Action

  • Input Action : 여러 input을 종합해 float1 ~ float3 의 output을 내보낼 수 있는 단위
  • Consume Input : 입력 소모해버리는지 여부?
  • Value Type : bool, float 1 ~ 3 가능하며, modifier에서 각 입력을 어떻게 값으로 변환할지 제어
    • ex. swizzle input axis value - bool이면 ( 1or0 , 0, 0 ) , float 1 이면 ( value, 0, 0 ), float 2면 ( value_x, value_y, 0 ), float 3이면 ( value_x, value_y, value_z ) 이런형태 ( 아래는 인풋타입에 따른 value 생성자. 다음 생성자에서 값 적용

 

Input Modifier

  • 커스텀 타입으로, Input 시, virtual ModifyRaw_Implementation( 인풋, FInputActionValue ( bool ~ float3 ), DeltaTime ) method를 customize하여 → output value를 줄 수 있는 연산모듈
    Input Modifier Class & Modify Raw ( override function )

 

더보기

.h

UCLASS(NotBlueprintable, MinimalAPI, meta = (DisplayName = "Swizzle Input Axis Values"))
class UInputModifierSwizzleAxis : public UInputModifier
{
   GENERATED_BODY()
 
public:
 
   // Default to XY swap, useful for binding 1D inputs to the Y axis.
   UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Settings)
   EInputAxisSwizzle Order = EInputAxisSwizzle::YXZ;
 
protected:
   virtual FInputActionValue ModifyRaw_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue CurrentValue, float DeltaTime) override;
   virtual FLinearColor GetVisualizationColor_Implementation(FInputActionValue SampleValue, FInputActionValue FinalValue) const override;
};

 

.cpp

FInputActionValue UInputModifierSwizzleAxis::ModifyRaw_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue CurrentValue, float DeltaTime)
{
    FVector Value = CurrentValue.Get<FVector>();
    switch (Order)
    {
    case EInputAxisSwizzle::YXZ:
        Swap(Value.X, Value.Y);
        break;
    case EInputAxisSwizzle::ZYX:
        Swap(Value.X, Value.Z);
        break;
    case EInputAxisSwizzle::XZY:
        Swap(Value.Y, Value.Z);
        break;
    case EInputAxisSwizzle::YZX:
        Value = FVector(Value.Y, Value.Z, Value.X);
        break;
    case EInputAxisSwizzle::ZXY:
        Value = FVector(Value.Z, Value.X, Value.Y);
        break;
    }
    return FInputActionValue(CurrentValue.GetValueType(), Value);

axis에 사용되는 swizzle axis 예시

  • bool이면 ( 1or0 , 0, 0 ) , float 1 이면 ( value, 0, 0 ), float 2면 ( value_x, value_y, 0 ), float 3이면 ( value_x, value_y, value_z ) 이런형태 ( 아래는 인풋타입에 따른 value 생성자. 다음 생성자에서 값 적용

 

Input Mapping Context

 

 

입력 설정

활성화된 PlayerController의 Enhanced Input Local Player Subsystem 소켓에  특정 Input Mapping Context를 추가

  • PlayerController
    • Enhanced Input Local Player Subsystem
      • Input Mappings[]
        • ← add Mapping Context
  • Input_Mappin_Context에서 할당했던 [Input_Action]의 이름을 통해 event 연결

 

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

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
기본 구성  (0) 2024.05.16
  • Actor
    • 의미 : 레벨에 배치할 수 있는 게임플레이 Object ( class AActor )
    • 구조 : Component들의 그룹
  • Component
    • 의미 : 기능의 단위가 되는 Object
  • Object
    • 의미 : 모든 형태의 인스턴스 ( class UObject )
    • 구조 : Component, Actor 등 하나의 class로부터 파생된 모든 instance의 총칭
      • AActor를 가리키지 않은 instance를 총칭하기도 함

 

기본 모듈

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

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
Input  (0) 2024.05.16

+ Recent posts