분류 전체보기 83

Inventory System (1) 플러그인 생성

바이오 하자드 시리즈식의 인벤토리를 구현해보려고 한다. 고민하다가 작업량이 꽤 많을거같아서 OpenWorldRpg와 분리해서 따로 작성하기로 하였다. 플러그인을 활용해서 만들고 후에 이를 다른 게임에 이식할 수 있도록 하기 위해서 위와 같이 새로운 플러그인을 만들었다. 플러그인을 처음 다루어봐서 각종 컴파일 오류로 여러번 파일을 다시 생성하는 등 상당히 우여곡절이 많았다. // Inv_PlayerController.h#pragma once#include "CoreMinimal.h"#include "GameFramework/PlayerController.h"#include "Inv_PlayerController.generated.h"class UInputMappingContext;class UInput..

카테고리 없음 2025.07.05

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 (23) Dodge 구현

Dodge(회피) 애니메이션을 넣고 회피할때마다 스테미나를 소모하며 스테미나가 부족하면 쓸수 없는 기능을 구현해볼 것이다. Dodge 모션을 임포트하다가 꼬여서 기존의 애니메이션이 전부 날아가는바람에 모든 플레이어의 애니메이션을 다시 만들어서 적용하느냐고 꼬박 하루를 날렸다. Mixamo에서 애니메이션을 하나 구해서 임포트 하였다. Attack과 마찬가지로 Dodge가 끝났다는 것을 알리기 위해서 끝에 DodgeEnd를 추가한다. // AttributeComponent.hpublic: UAttributeComponent(); virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* This..

카테고리 없음 2025.06.14

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..