본문 바로가기

전체 글

(166)
[실습2] 5. 인풋 매핑하기 1. 인풋 매핑하기 컨텍스트를 만들고 이걸 통해 로컬플레이어 서브시스템 클래스까지 만들었다. 이제 인풋 액션을 매핑하는 법을 알아보도록 하자. virtual void SetupInputComponent() override; 해당 함수는 폰이나 캐릭터 클래스의 인풋을 설정하기 위한 함수이다. 이를 오버라이드 하여 사용하자. #include "EnhancedInputComponent.h"void AAuraPlayerController::SetupInputComponent(){ Super::SetupInputComponent(); UEnhancedInputComponent* EnhancedInputComponent = CastChecked(InputComponent);} 플레이어 컨트롤러 클래스에는..
[실습2] 4. 커스텀 플레이어 컨트롤러와 향상된 인풋 1. 인풋 액션과 컨텍스트 만들기 향상된 인풋 기능을 이용해서 캐릭터의 이동을 구현해보겠다. 향상된 인풋을 이용하기 위해서는 인풋액션과 인풋 매핑 컨텍스트가 필요하다.  인풋 액션을 만들자. 이동 액션을 먼저 만들 것이다. 밸류타입을 백터2D로 설정한다. 이제 이것을 컨텍스트에 연결하면 된다.  액션과 키보드 입력을 매핑해준다. 키보드 D의 입력은 X방향으로 이동한다. 액션의 가장 기본이 되는 부분이기 때문에 무언가 건드릴 필요가 없다. A는 D와 반대방향으로 이동한다. 모디파이어를 추가하여 네거티브 밸류를 받을 수 있어야 한다. A키의 경우 Y와 Z축에는 관심이 없다. X축만 선택한뒤 이것을 Negate하자. W키의 경우 Y축을 우선으로 값을 받아야 한다. YXZ 축으로 Swizzle 하자. Swizz..
[실습2] 3. 애니메이션 블루프린트 만들기 1. 플레이어 애니메이션 블루프린트 만들기  먼저 플레이어의 애니메이션 블루프린트를 만들자.  위와 같이 연결해준다. 이제 Main State를 설정해주도록 하자.  휴식, 걷기, 달리기는 블랜드 스페이스를 이용하여 구현하고 있고 이를 완성하기 위해서는 스피드를 구해야 한다. 이벤트 그래프에서 이를 구하도록 하자 오버라이드 함수를 만들어 준다.  Get Pawn Owner의 리턴 값을 플레이어의 캐릭터 클래스로 캐스팅 하고 이를 변수로 승격하여 저장한 뒤,  무브먼트 컴포넌트를 가져와 이를 변수로 만들어 준다. 이제 블루프린트 업데이트 함수에서 계속해서 캐릭터의 속도를 가져오도록 하자.  이런식으로 캐릭터의 스피드를 계속해서 업데이트 해준다. 스테이트로 돌아가 스피드를연결해주면 된다.  2. 에너미 템플..
[실습2] 2. 캐릭터 클래스 세팅 1. 무기 매시 만들기 무기는 에너미와 캐릭터 모두에 쓰일 것이다. 그렇기 때문에 베이스 클래스에서 정의할 것이다. UPROPERTY(EditAnywhere, Category="Combat")TObjectPtr Weapon; 웨폰 매시를 저장할 포인터를 만들었으니 실제로 저장하면 된다. AAuraCharacterBase::AAuraCharacterBase(){ PrimaryActorTick.bCanEverTick = false; Weapon = CreateDefaultSubobject("Weapon"); Weapon->SetupAttachment(GetMesh(), FName("WeaponHandSocket")); Weapon->SetCollisionEnabled(ECollision..
[실습2] 1. 캐릭터 클래스 만들기 1. 베이스 캐릭터 클래스 만들기 캐릭터의 베이스가 될 클래스를 만들 것이다. 에너미와 플레이어 모두에게 공통되는 속성이 있을 것이기 때문에 베이스 클래스를 만들고 이곳에서 에너미와 플레이어 클래스를 파생시킬 것이다.   클래스를 만들었으면 첫 빌드를 진행하여 C++ 프로젝트를 만들도록 하자. 베이스 캐릭터 클래스는 실제로 사용하지 않을 것이다.  UCLASS(Abstract)class PRACTICE2_API AAuraCharacterBase : public ACharacter{ GENERATED_BODY()public: AAuraCharacterBase();protected: virtual void BeginPlay() override; }; UCLASS 에 Abstract 메타 지정자를 추가하자. ..
[언리얼 실습] 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() 함수..
[언리얼 실습] 78. 플레이어가 죽을 시 에너미 공격 멈추기 목차에너미 공격 멈추기1. 에너미 공격 멈추기 현재 플레이어가 죽더라도 에너미가 계속해서 공격을 한다. 일부 게임에서는 캐릭터의 생존 여부와 상관없이 계속해서 공격하는 게임도 있긴 하지만 현재는 기능을 구현하는 게 중심이기 때문에 더 이상 공격을 못하게 고쳐보려고 한다. 비주얼 스튜디오로 들어가자.void ABaseCharacter::Attack(){} 현재 베이스 캐릭터의 공격 함수는 비어있는데 이것을 채워볼 것이다. 공격하는 대상 파악하고 체력이 얼마남았는지를 알면 공격을 진행할지 말지를 알 수 있다. 공격 대상이 누구인지 캐스팅해서 알 수 도 있겠지만 캐스트는 비용이 많이 들기 때문에 태그를 확인해서 이 작업을 진행하려고 한다. void ABaseCharacter::Die(){ Tags.Add(FN..
[언리얼] 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 에는 오버레이 변수가 ..