게임프로그래밍 (151) 썸네일형 리스트형 [실습2] 49. Set by Coller로 데미지 설정하기 1. 게임플레이 이펙트의 수정자 매그니튜드를 Set by Coller로 교체하기 현재 발사체는 게임플레이 이펙트의 도움 덕분에 데미지를 정할 수 있다. 하지만 발사체 마다 다양한 데미지 공식을 적용하고 싶다면 (가령 파이어볼에는 불속성, 아이스볼에는 얼음속성을 지정할 수 있다) 게임플레이 이펙트가 아닌 발사체 자체, 즉 어빌리티가 데미지를 설정할 수 있어야 한다. 그리고 이렇게 설정한 데미지를 게임플레이 이펙트에 설정한다. Set by Coller는 키-밸류로 연결되어있는데 이 키의 값은 게임플레이 태그이다. 게임 플레이 태그를 더 추가해야할 것이다. 아래와 같이 사용하여 값을 지정할 수 있다. 키-밸류 페어가 설정되었는데 키는 게임플레이태그, 밸류는 데미지(현재는 하드코딩한 50)이다. FAuraGam.. [실습2] 48. 메타 어트리뷰트 1. 메타 어트리뷰트 만들기 데미지를 입힐때 게임플레이 이펙트가 직접적으로 데미지를 입히는 것이 아닌 메타 어트리뷰트를 통해 데미지를 설정할 것이다. 이렇게 하는 이유는 단순히 하나의 속성으로 데미지값을 정하는 것이 아니라 방어력이나 크리티컬 등의 다양한 요소가 있을 수 있고, 이것을 메타 어트리뷰트에서 처리할 것이기 때문이다. 메타 어트리뷰트는 서버에서만 존재하며 계산 결과를 클라이언트에게 알릴 것이다. 이제 이 메타 어트리뷰트를 만들어보자. 어트리뷰트 세트 클래스로 가서 변수를 선언하자.UPROPERTY(BlueprintReadOnly, Category="Meta Attributes")FGameplayAttributeData IncomingDamage;ATTRIBUTE_ACCESSORS(UAuraAt.. [실습2] 47. 발사체에 대미지 부여 효과를 주는 게임플레이 이펙트 적용하기 1. 게임플레이 이펙트 발사체에 적용하기 게임플레이 이펙트 클래스를 만들고 이것을 발사체에 적용하는 방법을 알아보자. 발사체의 헤더파일로 간다. 게임플레이 이펙트 스펙 핸들을 만들어 이곳에서 게임플레이 이펙트를 관리할 것이다.UPROPERTY(BlueprintReadWrite, meta = (ExposeOnSpawn = true))FGameplayEffectSpecHandle DamageEffectSpecHandle; 이제 이 핸들의 설정은 이 발사체를 생성하는 게임플레이어빌리티에서 설정할 것이다. 게임 플레이 이펙트를 저장할 변수를 만든다.UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)TSubclassOf DamageEffectClass; 스펙 핸들을 만들어야 할 .. [실습2] 46. 서버에서 타겟 데이터 수신하기 1. 클라이언트에서 보내는 데이터 서버에서 받기 데이터를 클라이언트에서 서버로 보내고 있다. 서버에서 이를 받아보자. 아래의 함수를 통해 서버로 데이터를 보내고 있다.AbilitySystemComponent->ServerSetReplicatedTargetData 이제 서버에서 타겟데이터의 변화가 있을때 콜백함수를 바인딩할 수 있는 델리게이트를 만들어보자.아래 함수를 통해 그것이 가능하다.AbilityTargetDataSetDelegate 바인딩할 함수도 만들자. 브로드캐스트할때 보내는 데이터를 잘 받을 수 있게 함수 시그니처를 설정하였다void OnTagetDataReplicateCallback(const FGameplayAbilityTargetDataHandle& DataHandle, FGamepl.. [실습2] 45. 마우스 커서 데이터 서버로 보내기 1. 마우스 커서 데이터 서버로 보내기 클라이언트에서 현재 마우스 커서의 위치를 서버로 보내는 법을 알아보자. 클라이언트일 경우 실행할 함수를 만들자. void SendMounseCursorData(); 엑티베이트 함수에서 현재 로컬(클라이언트)인지 확인해서 이 함수를 실행한다.void UTargetDataUnderMouse::Activate(){ const bool bIsLocallyControlled = Ability->GetCurrentActorInfo()->IsLocallyControlled(); if (bIsLocallyControlled) { SendMounseCursorData(); } else { // 서버에 있을 때, 타겟 데이터를 수.. [실습2] 44. 어빌리티 태스크 1. Ability Tasks 어빌리티 태스크는 어빌리티가 실행되는 동안 비동기 작업을 시행하기 위해 설계된 모듈이다. 비동기 작업의 대표적인 예로는 애니메이션 몽타주의 재생 완료 등이 있다. 어빌리티에서 몽타주 재생 함수를 가져오면 Latent라고 나온다. Latent는 비동기 실행 노드를 말한다. 노드에서 볼 수 있듯이 기본 출력핀은 즉시 다음 노드가 실행되지만 완료된 후, 블랜드 아웃 후 등등 다양한 비동기적으로 실행이 가능한 출력핀들이 있다. 이러한 기능은 어빌리티 태스크가 있어서 가능한 것인데 이제 더 많은 기능들을 넣기 위하여 커스텀 어빌리티 태스크 클래스를 만들어보자. 태스크에 존재하는 함수들은 스태틱 함수들이다. 우리가 만든 커스텀 태스크 클래스도 이를 따르도록 하자. UCLASS()cla.. [실습2] 43. 발사체 생성 능력 만들기 1. 발사체 클래스 생성발사체를 만들어 이를 발사하는 능력을 캐릭터에게 주려고 한다. 발사체는 Actor 클래스일 것이다. class UProjectileMovementComponent;class USphereComponent;UCLASS()class PRACTICE2_API AAuraProjectile : public AActor{ GENERATED_BODY() public: AAuraProjectile(); UPROPERTY(VisibleAnywhere) TObjectPtr ProjectileMovement;protected: virtual void BeginPlay() override; UFUNCTION() void OnSphereOverlap(UPri.. [실습2] 42. 마우스 클릭으로 움직이게 하기 1. 마우스를 누르고 있을때 마우스 위치로 움직이게 하기 캐릭터를 현재 WASD로 움직이고 있는데 이제 이것을 클릭으로 움직이게 할 것이다. 이때 서버와 클라이언트 모두가 작동하게 만들어야 한다. 움직일때 가장 중요한 점은 장애물을 피할 수 있는 능력이 있어야 한다. 이를 감안하여 구현하도록 하자. 플레이어 컨트롤러 클래스로 들어가자. 클릭으로 이동을 구현할때 한번만 클릭하면 그곳으로 이동, 계속 마우스를 누르고 있으면 마우스를 따라 이동하게 구현할 것이다. 변수들을 선언하자. FVector CachedDestination = FVector::ZeroVector; // 클릭 지점 정보float FollowTime = 0.f; // 마우스를 누르고 있는 시간float ShortPressThreshold =.. [실습2] 41. 커스텀 인풋 컴포넌트 만들기 1. 인풋 컴포넌트 생성 인풋액션과 게임플레이 태그를 연결하였다. 이번에는 이 인풋에 콜백함수를 바인딩하도록 하자. 기본적인 이동은 플레이어 컨트롤러 클래스에서 하고 있는데 이제 이 작업을 플레이어 컨트롤러가 아닌 인풋 컴포넌트 클래스에서 진행하여 캡슐화를 이룰 것이다. 플레이어 컨트롤러는 입력을 받는 역할만 할 것이고 인풋 컴포넌트 클래스에서 이 입력을 처리하는 작업을 하는 것이다. 이제 클래스를 구성하자. #include "CoreMinimal.h"#include "AuraInputConfig.h"#include "EnhancedInputComponent.h"#include "AuraInputComponent.generated.h"/** * */UCLASS()class PRACTICE2_API U.. [실습2] 40. 인풋과 게임플레이 태그 연결하기 1. Input Config Data Asset 능력을 시행시키기 위해 키보드나 마우스등의 조작을 해야하고 이 조작을 식별할 수 있어야 한다. 데이터 에셋을 만들어 게임플레이 태그와 향상된 인풋을 연결하여 이를 구분할 수 있도록 할 것이다. 데이터 에셋을 만들어보도록 하자. 이제 이 클래스에서 인풋 액션과 태그를 연결할 구조체를 만들어준다.USTRUCT(BlueprintType)struct FAuraInputAction{ GENERATED_BODY() UPROPERTY(EditDefaultsOnly) const class UInputAction* InputAction = nullptr; UPROPERTY(EditDefaultsOnly) FGameplayTag Input.. 이전 1 2 3 4 5 6 ··· 16 다음