게임프로그래밍 (158) 썸네일형 리스트형 [언리얼] 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축을 에너미.. [언리얼 실습] 69. 플레이어 히트 구현하기 목차GetHit 함수 오버라이드 하기히트 애니메이션 재생 중 공격 방지 및 공격 중 맞으면 굳는 현상 수정죽은 적의 검에 맞는 현상 수정 및 순찰타이머 정지시키기1. GetHit 함수 오버라이드 하기 함수를 오버라이드 해서 사용할 것이다. 포스팅은 안했지만 강의를 진행하면서 베이스 캐릭터라는 상위 클래스를 만들었는데 이곳에서 구현한 함수를 상속받아 사용할 것이다. UCLASS()class PRACTICE_API ABaseCharacter : public ACharacter, public IHitInterface{protected:virtual void GetHit_Implementation(const FVector& ImpactPoint) override;//생략}void ABaseCharacter::G.. [언리얼 실습] 68. 플레이어 캐릭터 히트 구현 목차GetHit 함수 구현하기캐릭터 매시 콜리전 설정 바꾸기에너미 무기 콜리전 활성화 하기에너미가 자기 자신 때리는 것 수정하기1. GetHit 함수 구현하기 플레이어도 타격을 받으면 GetHit 함수를 호출하게 할 것이다. GetHit 함수는 인터페이스에 있으니 이것을 오버라이드 하자. UCLASS()class PRACTICE_API AKnight : public ABaseCharacter{ GENERATED_BODY()public: AKnight(); virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; virtual void GetHit_Implementation(const FVecto.. 이전 1 ··· 6 7 8 9 10 11 12 ··· 16 다음