본문 바로가기

게임프로그래밍

(141)
[실습2] 21. 이펙트 액터 기능 구현하기 1. 이펙트 액터 리팩터링 지난 번에 이펙트 액터 클래스 자체는 만들었지만 따로 특별한 설정은 하지 않았다. 이제 게임플레이 이펙트를 통해 플레이어의 어트리뷰트 속성에 영향을 주게 만들어보자. class PRACTICE2_API AAuraEffectActor : public AActor{ GENERATED_BODY() public: AAuraEffectActor();protected: virtual void BeginPlay() override; UFUNCTION() virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp..
[실습2] 20. 어트리뷰트 변경사항 적용하기 1. 어트리뷰트 변경시 브로드캐스트 하기 현재 위젯 컨트롤러는 처음 초기값을 브로드캐스팅한다. 이러한 브로드캐스팅은 한번만 하고 끝이 아니라 값이 변경될때마다 지속적으로 호출되어야 할 것이다. 베이스 위젯 컨트롤러 클래스로가 델리게이트들을 바인딩 할 수 있는 함수를 만들 것이다. 이렇게 하면 이를 상속받는 모든 컨트롤러가 해당 함수를 사용할 수 있을 것이다. virtual void BindCallbacksToDependencies();베이스 클래스에서 실제 정의는 하지 않을 것이니 빈 함수 몸체를 놓아두면 된다. 자식 클래스에서 이를 오버라이드하여 사용하자. 이제 자식클래스에서는 바인딩할 함수를 만들어야 한다. protected: void HealthChanged(const FOnAttributeC..
[실습2] 19. 초기값 위젯에 브로드캐스팅하기기 1. 서론 오버레이 위젯은 지금 자신의 위젯 컨트롤러를 가지고 있으며 그렇기에 위젯 컨트롤러에 접근할 수 있다. 물론 위젯 컨트롤러는 자신을 소유하고 있는 대상이 누군지 알지 못한다. 단방향 의존성으로 구성되어 있기 때문이다. 위젯 컨트롤러가 알고 있는 것은 그저 자신이 가지고 있는 4개의 주요 변수들이다. 컨트롤러는 자신을 소유하고 있는 위젯에 대해 알지 못하기 때문에 이러한 변수들을 브로드캐스트하여 자신을 소유하고 있는 위젯에게 그 값을 넘긴다. 이제 브로드캐스트하는 방법을 알아보자.2. 위젯 컨트롤러에서 브로드캐스트 하기 위젯 컨트롤러 클래스로 들어가자. 이때 오버레이 위젯 컨트롤러가 아닌 베이스 위젯 컨트롤러로 들어갈 것이다. 퍼블릭 공간에 함수를 선언한다.virtual void BroadCast..
[실습2] 18. 위젯 컨트롤러로 설정하기 1. 위젯컨트롤러 변수들 할당하기 전에 위젯 컨트롤러 클래스를 만들고 변수들을 선언하기는 했다. 하지만 선언만 했을 분 실제로 할당하지는 않았는데 이 변수들을 할당하는 방법을 알아보자. UPROPERTY(BlueprintReadOnly, Category="WidgetController")TObjectPtr PlayerController;UPROPERTY(BlueprintReadOnly, Category="WidgetController")TObjectPtr PlayerState;UPROPERTY(BlueprintReadOnly, Category="WidgetController")TObjectPtr AbilitySystemComponent;UPROPERTY(BlueprintReadOnly, Category=..
[실습2] 17. HUD 만들기 1. HUD 클래스 생성 HUD 클래스를 만들어 위젯을 등록해보도록 하자.  C++ 클래스를 먼저 생성하자. 위젯을 HUD에 그리기 위해서는 인스턴스를 저장할 변수와 이 인스턴스의 타입을 정할 클래스가 필요할 것이다. class PRACTICE2_API AAuraHUD : public AHUD{ GENERATED_BODY()public: UPROPERTY() TObjectKey OverlayWidget;private: UPROPERTY(EditAnywhere) TSubclassOf OverlayWidgetClass; }; 이제 제대로 만들어졌는지 테스트를 해보자. 단순히 비긴 플레이 함수에서 위젯을 보여주는 작업을 할 것이다. void AAuraHUD::BeginPlay(..
[실습2] 16. 유저 위젯과 위젯 컨트롤러 만들기 1. 서론 위젯과 데이터, HUD를 연결하기 위해 위젯 컨트롤러를 만들 것이다. 위젯에서 직접 데이터에 접근하고 HUD에서 직접 위젯에 접근하고 하면 나중에 이를 관리하기가 점점 힘들어진다. 그렇기에 위젯 컨트롤러를 만들 것이며 데이터는 컨트롤러에서 담당하고 위젯과 HUD는 그저 위젯 컨트롤러가 데이터를 넘겨주면 이를 반영하는 역할만 할 것이다. 컨트롤러의 경우 이러한 데이터를 브로드캐스팅하기 때문에 이 정보를 받는 위젯 클래스에 대해 알지 못한다. 반면 위젯 클래스는 데이터를 수신 받기 위해 컨트롤러에 대해 알아야 하니 단방향 의존성을 가지게 되고 이는 모듈화의 핵심이 된다.2. 유저 위젯 클래스 만들기  유저위젯에서 사용할 커스텀 위젯 클래스를 만들어주자. 그 다음 유저 위젯 컨트롤러도 만들어주자. ..
[실습2] 15. 이펙트 액터 만들기 1. 이펙트 액터 생성 어트리뷰트 데이터를 만들었으니 연습을 위해 이 데이터에 값을 바꿀 수 있는 액터를 만들어주려고 한다. 어트리뷰트 데이터의 값을 바꾸려면 세터를 이용해서 바꾸는게 아니라 게임플레이 이펙트를 통해 바꿔주어야 한다.   기본 액터 클래스로 만들 것이다. 해당 액터에서는 스피어 컴포넌트를 만들고 이에 접근하면 어트리뷰트 데이터를 바꾸는 작업을 할 것이다. class PRACTICE2_API AAuraEffectActor : public AActor{ GENERATED_BODY() public: AAuraEffectActor();protected: virtual void BeginPlay() override;private: UPROPERTY(VisibleAnyw..
[실습2] 14. Attribute Accessors 매크로 사용하기 1. 어트리뷰트 엑세서 만들기 체력과 마나등 어트리뷰트 데이터들 만들었고 이제 이에 접근할 수 있는 방법을 알아야 한다. 게터와 세터 등을 만들면 되지만 이것을 일일히 만들다 보면 속성을 하나 추가할때마다 해야할 작업이 너무 많을 것이다. 그렇기 때문에 매크로를 이용해 간단하게 접근하는 방법을 알아볼 것이다. 어트리뷰트 세트 클래스를 살펴보자.   일일히 헬퍼 함수들을 만드는 것은 너무 많은 수동 작업이 필요하니 대신 아래 매크로를 쓰라고 한다. 이를 사용하자. 이제 엔진 클래스가 아닌 우리가 사용할 어트리뷰트 세트 클래스로 들어가자. #define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \ GAMEPLAYATTRIBUTE_PROPERTY_GETTER(Cla..
[실습2] 13. 체력과 마나 어트리뷰트 만들기 1. 어트리뷰트 추가하기 Attribute Set 클래스가 존재하고 이곳에 실제로 속성들을 지정할 수 있다. 어트리뷰트 세트 클래스로 들어가자. 각종 속성들은 Pulbic 섹션에서 정의할 것이다.FGameplayAttributeData 구조체를 통해 이러한 정보를 저장할 수 있다. class PRACTICE2_API UAuraAttributeSet : public UAttributeSet{ GENERATED_BODY()public: UAuraAttributeSet(); UPROPERTY(ReplicatedUsing = OnRep_Health) FGameplayAttributeData Health; UFUNCTION() void OnRep_Health(const FGameplayAttributeData& ..
[실습2] 12. GAS 오너 액터와 아바타 액터 설정 1. 서론 - 오너 액터와 아바타 액터 어빌리티 시스템 컴포넌트에는 오너 액터와 아바타액터라는 개념이 있다. 오너 액터는 어빌리티 컴포넌트를 실제로 소유하고 있는 액터를 말한다. GAS도 컴포넌트니 당연히 액터에 의해 소유 될 수 있다. 아바타 액터의 경우 실제로 이 GAS를 사용하는 액터를 말한다. 에너미의 경우 이 둘이 동일하다. 에너미 클래스 자체가 주인이면서 또한 이 효과를 다룬다. 하지만 플레이어의 경우에는 다르다. GAS는 플레이어 스테이트 클래스에 있다. 즉, 오너는 스테이트 클래스이다. 하지만 이것을 다루는 액터는 플레이어(정확히는 캐릭터)클래스이다. 그렇기 때문에 이 둘을 명확히 설정할 필요가 있다. 액터 정보를 설정하는 함수는 존재한다. 이것을 언제 호출하고 설정해야할지를 고민해봐야 할..