언리얼 - C++ 프로젝트 32

OpenWorldRpg (28) 활 무기 시스템 구현 3

활 방향에 따른 캐릭터의 애니메이션 수정, 크로스헤어 HUD 추가, 화살의 방향 계산, 물체 및 적과 오버랩시 이벤트, 화살 궤적 이펙트 및 각종 사운드 추가등을 구현해볼 것이다. 위와 같이 캐릭터의 위를 향하는 자세, 중간, 아래 3가지를 캐릭터의 본을 조정하여 생성하고 저장한다. 애니메이션에서 에임 오프셋을 생성하여 위에서 만든 3가지의 애니메이션을 블렌드한다. 캐릭터의 방향(위아래)에 따라 변화하는 애니메이션이므로 캐릭터의 Pitch를 계산해야한다. ABP에서 위와 같이 Pitch를 계산하고 변수로 저장한다. Pitch 변수를 가져와 위에서 만든 AO_Bow 애니메이션에 변수로 넣어준다. 상체만 변화하므로 UpperBody에 넣는다. 다음으로 크로스헤어 HUD를 위와 같이 간단히 만든다. 활을 당..

OpenWorldRpg (27) 활 무기 시스템 구현 2

활을 조준하고 발사하도록 구현해볼 것이다. 먼저 새 입력을 추가하여 Released로 트리거를 추가한다. 누르고 있으면 활을 점점 더 쎄게 당기기위한 입력이다. 회전 속도를 조절하여 활 조준시 더 빠르게 회전하도록 하였고 BPBow의 EnumState를 추가하였다. 활을 당길때 타이머를 추가하여 최대시간을 변수로 저장하였다. 당기기 해제시에는 타이머를 초기화한다. 활 발사시에 Arrow가 스폰되도록하고 발사 애니메이션 몽타주를 재생한다. BPArrow를 만들어서 Projectile Movement를 추가한다. 활을 적게 땡기면 발사되는 힘이 적게 적용되고 중력은 크게 발생하도록 하였다. 활을 많이 땡길시 힘이 크게 적용되고 중력은 적게 적용되도록 하였다. 활 상태를 설정하는 이벤트도 추가하였다. 활도 활..

OpenWorldRpg (26) 활 무기 시스템 구현 1

새로운 무기로 원거리 무기인 활을 추가해볼 것이다. BP_Weapon의 자손블프를 만들어서 활 에셋을 넣어준다.활은 왼손에 장착하므로 BowSocket을 새로 추가한다. // Weapon.h UPROPERTY(EditAnywhere, Category = "Weapon Properties") int32 WeaponType = 1;public: FORCEINLINE UBoxComponent* GetWeaponBox() const { return WeaponBox; } FORCEINLINE int32 GetWeaponType() const { return WeaponType; } // SlashCharacter.cppvoid ASlashCharacter::EquipWeapon(AWeapon..

OpenWorldRpg (25) 적 종류 추가

여러 적을 추가해 볼 것이다.과정은 앞에서 했던 것과 동일하므로 글로 요약만 해보면 다음과 같다. 자손 ABP를 만들고 IdleWalkRun BlendSpace, DeadPose, Death 애니메이션을 만든다.스켈레톤 트리에서 WeaponSocket을 만들고 자손 BP_Weapon을 만들어 박스 콜리전 크기를 맞게 조절한다.Attack Montage , HitReact Montage, Death Montage를 만든다.Attributes에서 Health 등을 조절한다. ABP에서 위와 같이 AttackEnd, EnableBoxCollision, DisableBoxCollision을 추가해주어야한다. 위를 바탕으로 2종류의 적을 추가하였다. 기존의 적처럼 잘 동작한다. 다음에는 월드맵 제작을 좀 더 ..

OpenWorldRpg (24) Enemy 탬플릿

여러 종류의 적을 만들기 위해서 표준화된 ABP 탬플릿을 만들어 볼 것이다. 먼저 부모클래스가 될 ABP_Enemy를 새롭게 만들고 위처럼 여러 변수들을 만들어 할당한다. InitializeAnimation이벤트에 Enemy와 CharacterMovement를 넣어준다. UpdateAnimation함수에는 틱마다 업데이트를 해야하는 EnemyState, GroundSpeed, DeathPose를 할당한다. 스테이트 머신을 추가한다. Main State에 IdleWalkRun과 Dead를 추가한다. 2D BlendSpace를 사용할 상황을 대비해서 Blendspace XY로 할당한다. Dead에는 DeathPose를 기반으로 여러 사망 자세를 할당하도록 한다. 자손블프에서 각 사망 자세를 넣기..

OpenWorldRpg (22) 골드, 경험치 픽업생성

골드와 경험치를 픽업할 수 있도록 만들고 획득하면 HUD에 표시되도록 만들 것이다. 경험치를 획득하는 픽업을 위한 나이아가라를 아래와 같이 간단히 만들었다. 픽업을 위한 인터페이스를 만들어서 캐릭터에 넣어줄 것이다. // PickupInterface.h#pragma once#include "CoreMinimal.h"#include "UObject/Interface.h"#include "PickupInterface.generated.h"// This class does not need to be modified.UINTERFACE(MinimalAPI)class UPickupInterface : public UInterface{ GENERATED_BODY()};class SLASH_API IPickupInt..

OpenWorldRpg (21) 플레이어 사망 애니메이션

플레이어의 사망 애니메이션을 추가해볼 것이다. 먼저 적에게 있던 사망 애니메이션 함수를 플레이어와 적 공통으로 사용하기 위해서 BaseCharacter로 아래와 같이 옮겼다.// BaseCharacter.cppvoid ABaseCharacter::Attack(){ if (CombatTarget && CombatTarget->ActorHasTag(FName("Dead"))) { CombatTarget = nullptr; }}void ABaseCharacter::Die(){ Tags.Add(FName("Dead")); PlayDeathMontage();}int32 ABaseCharacter::PlayRandomMontageSection(UAnimMontage* Montage, const TArray& Se..

OpenWorldRpg (20) 플레이어 HUD

플레이어의 HUD를 만들고 바인딩하여 적의 공격을 맞았을 때 체력이 깎이도록 구현해볼 것이다. WBP 블프를 위와 같이 간단히 구성하였다. 다음으로 아래와 같이 SlashOverlay C++파일을 만들고 WBP의 부모클래스로 설정한다.// SlashOverlay.h#pragma once#include "CoreMinimal.h"#include "Blueprint/UserWidget.h"#include "SlashOverlay.generated.h"/** * */UCLASS()class SLASH_API USlashOverlay : public UUserWidget{ GENERATED_BODY()public: void SetHealthBarPercent(float Percent); void SetSta..

OpenWorldRpg (19) 적의 공격 구현 및 워프모션

적의 공격을 구현하고 언리얼 5에서 새로 생긴 워프모션을 넣어서 적의 공격이 플레이어에게 유도되도록 구현해볼 것이다. 적의 공격 애니메이션을 여러개 구해서 적절한것을 몇개 골라 애니메이션 몽타주를 만들었다. 플레이어가 맞을 시 비틀거리는 애니메이션 재생을 추가하였고 맞는 방향에 따른 비틀거림이 이상한 방향으로 가는 경우가 많아서 단순하게 적과 플레이어의 위치에따라 멀어지는 방향으로 비틀거리도록 하였다. 위 과정은 적에게 한 과정과 동일하여 생락하겠다. 플러그인을 들어가서 WarpMotion 플러그인을 추가한다. BaseCharacter 블프에서 MotionWarp 컴포넌트를 추가한다.위와 같이 플레이어와 마찬가지로 공격시에만 박스 콜리전 활성화를 위해서 노티파이를 할당하였고 소리를 추가하였다. 몽타주에서..

OpenWorldRpg (18) 리펙터링 및 코드 정리

코드가 전체적으로 중구난방이라 리펙터링과 함수순서 등을 최대한 하여 사용자로 하여금 보기 편하게 정리하였다. BaseCharacter를 추가하여 적과 캐릭터가 공통적으로 가지는 함수들을 옮긴 후 둘의 부모클래스로 변경하였다. // BaseCharacter.h#pragma once#include "CoreMinimal.h"#include "GameFramework/Character.h"#include "Interfaces/HitInterface.h"#include "BaseCharacter.generated.h"class AWeapon;class UAttributeComponent;class UAnimMontage;UCLASS()class SLASH_API ABaseCharacter : public ACh..