본문 바로가기

게임프로그래밍/실습1

(79)
[언리얼 실습] 80. 소울과 골드에 실제 속성 더하기 목차소울과 골드 습득시 캐릭터 속성에 추가에너미가 소울을 드랍하게 하기1. 소울과 골드 습득시 캐릭터 속성에 추가 캐릭터의 속성은 Attribute 클래스에서 담당하고 있고 이곳에 골드와 소울의 양을 저장할 변수를 만들 것이다. UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )class PRACTICE_API UAttributeComponent : public UActorComponent{ GENERATED_BODY()public: UAttributeComponent(); virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction..
[언리얼 실습] 79. 픽업 인터페이스 & 소울 픽업 효과 목차픽업 인터페이스 구현소울 획득시 효과 주기1. 픽업 인터페이스 구현 소울을 획득하는 기능을 구현할 것이다. 소울뿐만 아니라 골드도 획득할 수 있어야 하며 인터페이스를 만들어 이를 구현할 것이다. 인터페이스를 만들자. class PRACTICE_API IPickupInterface{ GENERATED_BODY() // Add interface functions to this class. This is the class that will be inherited to implement this interface.public: virtual void SetOverlappingItem(class AItem* Item) = 0;}; 순수가상함수를 만들었다. 아이템 클래스에는 OnSphereOverlap() 함수..
[언리얼] 77. 플레이어 데스 몽타주 재생하기 목차플레이어 Dead 상태로 바꾸기애니메이션 블루프린트 수정하기1. 플레이어 Dead 상태로 바꾸기 UPROPERTY(BlueprintReadOnly)EDeathPose DeathPose; 에너미 클래스에 있던 DeathPose 를 베이스 캐릭터로 옮기자. 이제 이 변수는 에너미뿐 아니라 플레이어도 쓸 것이다. int32 ABaseCharacter::PlayDeathMontage(){ const int32 Selection = PlayRandomMontageSection(DeathMontage); if (Selection (EDeathPose::EDP_MAX) && Selection > -1) { DeathPose = static_cast(Selection); } return Selection;} 이제..
[언리얼 실습] 76. HUD 변수 초기화 & 체력바 업데이트 목차 오버레이 초기화 하기 체력바 업데이트 하기 함수 수정 준비1. 오버레이 초기화 하기 현재 오버레이를 사용하고 있고 이곳에서 체력과 스테미나 골드, 소울을 보여주고 있다. 이 값들을 초기화 하는 법을 알아보자. 오버레이에서 사용하고 있는 변수들은 캐릭터와 관련된 변수들이고 그렇기에 캐릭터 클래스에서 접근할 것이다. 캐릭터 클래스의 BeginPlay 함수로 들어가자.APlayerController* PlayerController = Cast(GetController());if (PlayerController){ ASlashHUD* SlashHUD = Cast(PlayerController->GetHUD()); } 다음과 같이 하면 HUD 클래스를 가져올 수 있다. SlashHUD 에는 오버레이 변수가 ..
[언리얼 실습] 75. HUD 세팅 목차게임모드 블루프린트 클래스 만들기HUD 블루프린트 클래스 만들기C++ 부모 클래스 만들기1. HUD 만들기 현재 위젯을 만들기는 했는데 이것을 화면에 보여줄 방법이 없다. HUD 클래스를 만들어서 이를 구현해 볼 것이다.HUD 클래스를 만들고 적용하려면 게임모드가 있어야 한다.   게임모드베이스를 부모 클래스로 하고 블루프린트 클래스를 만들자.  월드 세팅에서 게임모드 오버라이드를 블루프린트 클래스로 바꿔주면 된다.2. HUD 블루프린트 클래스 만들기 HUD 블루프린트 클래스를 만들자.  c++ 에서 구현하기 전에 먼저 블루프린트 클래스에서 해보려고  한다.  위와 같이 노드들을 연결해준다. 이제 이 블루프린트 클래스를 게임모드의 기본 HUD 클래스로 바꾸자.  게임을 시작하면 오버레이가 정상적으로 ..
[언리얼 실습] 74. 오버레이 위젯 만들기 목차위젯 만들기C++ 부모 클래스 만들기부모 클래스 바꾸기1. 위젯 만들기 플레이어의 체력을 구현했고 이제 이것을 보여줄 위젯이 필요하다. 위젯 블루프린트를 만들고 루트위젯을 유저 위젯으로 설정하자. 위젯 블루프린트에 들어간뒤 상태창을 이미지로 가져올 것이기 때문에 이미지 요소? 를 드래그하다. 디테일 패널에서 브러시 항목에 우리가 쓸 이미지를 집어 넣고 Size To Content에 체크를 한다.    이제 이 안을 체력과 스테미너 기타 요소들로 채우자. 체력바와 스테미너바는 Progress Bar로 만들 것이다.  프로그래스바를 가져왔으면 이름을 HealthBar로 바꾸고 이미지를 채운뒤 Appearance는 흰색 또는 무색으로 바꾼다.  그리고 위치를 대강 맞게 옮긴뒤 순서를 바꾸자.  Hierar..
[언리얼 실습] 73. 플레이어가 피해를 입게 하기 목차 플레이어 피해 입히기1. 플레이어 피해 입히기 플레이어도 피해를 입게 해보자. virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser) override; 에너미에 존재하는 TakeDamge 함수를 가져와 선언하자. float AKnight::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser){ HandleDamage(DamageAmount); retu..
[언리얼 실습] 72. 모션 워핑 공격 완성하기 목차워프 위치 고치기모션 부드럽게 바꾸기1. 워프 위치 고치기 현재 에너미가 모션 워핑으로 이동할때 플레이어가 너무 가까운 위치에 있으면 무기에 맞지 않을때가 있다. 그렇기 때문에 워프 위치를 플레이어의 위치보다 살짝 뒤쪽으로 하여 그러한 문제가 생기는 것을 막아보려고 한다. C++에서 이 작업을 해보자. UCLASS()class PRACTICE_API ABaseCharacter : public ACharacter, public IHitInterface{ GENERATED_BODY()protected:UFUNCTION(BlueprintCallable)FVector GetTranslationWarpTarget();UFUNCTION(BlueprintCallable)FVector GetRotationWarpT..
[언리얼 강의] 71. 모션워핑을 통해 적이 공격할 때 플레이어 바라보게 하기 목차Motion Warping이벤트 설정하기공격 시작 중 플레이어에게 맞아도 바로 공격하는 문제 수정하기1. Motion Warping 현재 에너미는 캐릭터의 위치와는 상관없이 전방 방향으로만 공격한다. 이부분을 고쳐 에너미가 플레이어를 향하게 해볼 것이고 루트 모션 애니메이션과 모션 워핑을 활용해 이를 구현할 것이다.  모션 워핑을 사용하기 위해서는 플러그인을 사용해야 한다. 플러그인을 적용하려면 에디터를 껐다 켜야하니 저장을 잘 해놓자. 이제 에너미의 블루프린트 클래스로 들어간다.  모션 워핑 컴포넌트를 추가해주자. 그다음 공격 몽타주로 들어가자.   노티파이 스테이트에서 모션 워핑을 추가해준다.  노티파이의 길이를 조절할 수 있는데 저 길이 동안 모션 워핑을 진행하게 된다. 모션 워핑을 작동하는 법..
[언리얼 실습] 70. 방향성 히트 리액션 수정하기 목차타격자 기준으로 히트 방향 설정하기버그 수정하기1. 타격자 기준으로 히트 방향 설정하기 현재 방향성 히트를 구현하고 있는데 피격 지점을 기준으로 방향을 설정한다. 이것의 문제점은 회전 공격 같이 측면을 때리는 경우 정면에서 공격을 해도 측면에 피격이 일어나 일반적으로 생각하는 반응이 나오지 않는다. 그렇기에 이를 피격지점이 아닌 타격자와 피격자의 위치를 기준으로 계산하게 바꿔보자 현재 방향성 타격은 다음과 같이 구하고 있다.void ABaseCharacter::DirectionalHitReact(const FVector& ImpactPoint){ // Forward = U const FVector Forward = GetActorForwardVector(); // ImpactPoint의 Z축을 에너미..