본문 바로가기

게임프로그래밍

(141)
[실습2] 31. Combat 인터페이스를 통해 플레이어 레벨 얻기 1. 레벨 만들기 어트리뷰트들은 레벨에 따라 달라질 수 있다. 그렇기에 이런 레벨을 알 수 있으면 좋은데 레벨을 알기 위해서 계속해서 캐릭터 클래스를 캐스팅 한다면 많은 자원이 소모될 것이다. 그렇기 때문에 인터페이스를 구현하여 인터페이스로 캐스팅 하는 방식을 이용할 것이다. 플레이어 스테이트 클래스로 가 이곳에서 레벨을 구현하자. private: UPROPERTY(VisibleAnywhere, ReplicatedUsing=OnRep_Level) int32 Level = 0; UFUNCTION() void OnRep_Level(int32 OldLevel); 레벨은 물론 서버에서 클라이언트로 복제되어야 할 것이다. virtual void GetLifetimeReplicatedProps..
[실습2] 30. 게임플레이 이펙트로 어트리뷰트 초기화 하기 1. 어트리뷰트 데이터 초기값 할당하기 체력바도 만들고 체력 물약도 만들고 다양한 작업을 했지만 정작 체력을 구현하지는 않았다. 체력뿐 아니라 모든 어트리뷰트가 현재는 하드코딩 되어 있다. 이를 이제 초기화하는 방법을 알아보자. 캐릭터 베이스 클래스에서 초기값을 가지고 있는 게임플레이 이펙트와 이를 적용하는 함수를 만들 것이다. 프라이빗 섹션에 만들도록 하자.UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Attributes")TSubclassOf DefaultPrimaryAttributes;void InitializePrimaryAttributes(); 이제 함수를 정의할 것이다.void AAuraCharacterBase::InitializePrimaryA..
[실습 2] 29. 클램핑 버그 고치기 1. 제대로 된 클램핑 적용하기 PreAttributeChange 에서  클램핑을 한 덕분에 체력과 마나가 0이하로 내려가지 않고 최대 체력, 마나를 뛰어 넘지도 않는다.  하지만 이곳에서 수정자의 값은 실제로 변하지 않고, 리턴하는 값만 변하게 된다. 즉 이 함수에서 존재하는 NewValue의 값이 계속 최대 체력을 넘는 상태로 존재하고 이 값이 최대 체력보다 낮아져야만 제대로된 작동을 한다. 이 값을 바꿀 필요가 있을 것이다. 클램핑을 한번 더 해서 데이터의 값을 바꿀 것이다. PostGameplayEffectExecute() 함수에서 데이터를 받고 있고 이곳에서 값을 바꿀 것이다. void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayE..
[실습2] 28. 태그 브로드 캐스팅 하기 - 2 1. 데이터 테이블에서 원하는 데이터 찾기 데이터 테이블에서 태그로 해당 로우를 찾아내도록 하자. 이것은 함수로 구현할 것이다. templateT* GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag); 데이터 테이블에는 다향한 타입의 데이터들이 있고 이 모든 데이터 중 원하는 것을 받아오는 것이 가능하게 템블릿 함수로 만들어주었다. 이제 이 함수를 정의하자. 템플릿 함수는 선언이 파일과 동일한 파일에서 구현해야 한다. (이 경우 헤더파일에서 선언과 정의 전부 한다) template T* UOverlayWidgetController::GetDataTableRowByTag(UDataTable* DataTable, const FGamepl..
[실습2] 27. 태그 브로드 캐스팅 하기 - 1 1. 태그 브로드 캐스트 하기 이제 태그를 브로드 캐스트 하여 원하는 태그들을 화면에 보여주는 작업을 할 것이다. 이때 직접 HUD나 위젯으로 브로드 캐스트 하는 것이 아닌 위젯 컨트롤러에서 이 브로드캐스팅 한 값을 받을 수 있게 할 것이다. ASC 클래스에서 델리게이트를 선언하자.DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTags, const FGameplayTagContainer&) 위젯 컨트롤러 ASC 모두 이와 바인딩 할 수 있어야 한다. 그렇기에 퍼블릭 공간에서 사용할 것이다. 일단 먼저 브로드 캐스트 기능을 완성하자.void UAuraAbilitySystemComponent::EffectApplied(UAbilitySystemComponent* Abi..
[실습2] 26. 게임 플레이 이펙트에 게임플레이 태그 적용하고 태그 출력하기 1. 게임 플레이 이펙트에 태그 추가하기 게임플레이 이펙트 클래스로 들어가자 컴포넌트를 추가하면 다양한 기능을 추가할 수 있는데 이 중에서 태그를 추가하는 기능은 Grant Tags to Target Actor와 Tags This Effect Has 가 있다. 각각의 차이는 이름 그대로 이다. 태그를 타겟에게 설정하거나 아니면 게임플레이 이펙트 자체에 태그를 추가하는 것이다. Grant Tags는 지속시간이 있는 효과에만 적용된다. 즉 인피니트나 듀래이션 이펙트에서는 작동을 하지만 인스턴트 이펙트에서는 대상 액터에게 태그를 줄 수 없다. 이제 이런 태그를 C++에서 식별하는 방법을 알아보자.2. 게임플레이 이펙트에 영향을 받으면 델리게이트 호출하기 어빌리티 컴포넌트 클래스에는 게임플레이 효과가 발생하면 ..
[실습2] 25. PostGameplayEffectExecute() - 어트리뷰트 변경 후 호출되는 함수 1. PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) PostGameplayEffectExecute 위의 함수는 게임플레이 이펙트가 적용되고 난 후 추가적인 작업을 할 때 사용하는 함수이다. 예를 들어 체력이 0이 되면 캐릭터를 데스 상태로 변환하는 등의 작업을 할 수 있다.매개변수 FGameplayEffectModCallbackDataEvaluatedData: 변경된 Attribute와 그 값.Target: 효과를 적용받는 대상.Source: 효과를 유발한 원인(예: 공격자).EffectSpec: 실행된 GameplayEffect의 상세 정보PostGameplayEffectExecute 함수의 매개변수로 전달되는 FGamepl..
[실습2] 24. PreAttributeChange 함수로 클램핑 적용하기 1. 체력과 마나에 클램핑 적용하기 이펙트 액터가 존재하고 그 덕분에 체력이나 마나가 증가하고 감소한다. 하지만 현재 어떤 제한도 걸려있지 않아 그 값이 마이너스가 되게도 하고 최대 체력/마나를 뛰어 넘기도 한다. 이를 방지하려고 하는데 그러기 위해서 Pre Attribute Change 를 이용할 것이다. 어트리뷰트 세트 클래스로 가자. virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override; 해당 함수는 어트리뷰트가 변경되기 전 밸류의 값을 변환시키는 함수이다. 밸류의 값을 변환 시키는 것이 가능하기는 하지만 클램프 외에 다른 목적으로 사용하는 것은 권장하지 않고 있다. (말이 권장하지 ..
[실습2] 23. C++에서 인피니트 게임플레이 이펙트 제거하기 1. 게임플레이 이펙트 제거하기 인피니트 게임플레이 이펙트를 주면 그 효과는 수동으로 제거하기 전까지 계속 지속된다. 이제 이 효과를 취소하는 법을 알아보자. 어떤 효과를 제거하고 어떤 효과를 제거하지 않을지 표시할 수 있으면 좋을 것이다. 이를 열거형으로 정의하려고 한다. UENUM(BlueprintType)enum class EffectApplicationPolicy : uint8{ ApplyOnOverlap, ApplyOnEndOverlap, DoNotApply}; 그리고 이제 각각의 게임플레이 이펙트에 대해 정책을 설정해준다.UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Applied Effects")TSubclassOf Instan..
[실습2] 22. 인스턴트 게임플레이 이펙트 1. 인스턴트 게임플레이 이펙트 클래스 만들기 이펙트 액터에서 시전할 효과를 부여해주는 게임플레이 이펙트를 만들어보자. 제일 처음 만들 것은 인스턴트 게임플레이 이펙트이다.  게임플레이 이펙트 블루프린트 클래스를 만들도록 하자  이제 이곳에서 다양한 효과들을 지정할 수 있다. 지금은 인스턴트, 즉 최초에 한번만 적용하는 효과를 만들 것이다.  모디파이어를 이런 식으로 수정하면 체력값을 바꾸는 게임플레이 이펙트가 되는 것이다. 이제 이 이펙트를 이펙트 액터에 지정해주고 블루프린트 콜러블 함수를 호출하면 된다.  C++에서 이 이펙트를 저장하고 있는데 이를 블루프린트에서 노출가능하게 바꾸고 이곳에 대입할 것이다.UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="A..