인벤토리 아이템 정보창
- 아이템 정보창은 다음과 같이 동작하도록 정의했다.
- 아이템에 마우스가 들어오면 화면 중앙에 나타난다.
- 아이템에 마우스가 나가면 사라진다.
- 아이템 정보창은 그때 그때 Create하지 않고 한번 만들어두고 여러번 재활용하는 방식으로 사용한다.
- 아이템 정보창에 쓸 텍스트는 인벤토리 구현 때 생성한 ItemObject에 저장했다. 저장하는 변수는 3개다.
Item Name
: 아이템의 이름Item Type
: Weapon, Food 같이 아이템의 분류Item Info
: 아이템에 대한 설명
- Item Widget 생성 시 실행 노드
- Item Widget에 마우스가 들어왔을 때 실행 노드
- 결과
속공과 강공의 데미지 타입
공격의 메커니즘은 다음과 같이 설계했다.
- 플레이어가 마우스를 눌러 속공 또는 강공을 실행한다.
- 이 때, 강공격이라면
Weapon
의IsSlowAttacking
을 True로 바꿔서 지금 강공격 중임을 알려준다. Weapon
은OnAttackCollisionOverlapBegin
에서ApplyDamage
를 실행한다.IsSlowAttacking
에 따라 다른DamageTypeClass
를 건네준다.Enemy
는 데미지 계산을 할 때, DamageTypeClass를 검사해서 강공격이라면 1.5배의 데미지를 계산한다.
Weapon.cpp
void AWeapon::OnAttackCollisionOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { UClass* DamageType; if (IsSlowAttacking) DamageType = USlowAttackDamageType::StaticClass(); else DamageType = UFastAttackDamageType::StaticClass(); if (IsSlowAttacking) UE_LOG(LogTemp, Warning, TEXT("Slow!")); if (IsEnemyWeapon == false) { AEnemy* Enemy = Cast<AEnemy>(OtherActor); if (Enemy) { UGameplayStatics::ApplyDamage(Enemy, AttackDamage, Enemy->GetController(), HoldingActorPtr, DamageType); } } else { AMainCharacter* Main = Cast<AMainCharacter>(OtherActor); if (Main) { UGameplayStatics::ApplyDamage(Main, AttackDamage, Main->GetController(), HoldingActorPtr, DamageType); } } }
Enemy.cpp
float AEnemy::TakeDamage(...) { ... DamageAmount = DamageEvent.DamageTypeClass == UFastAttackDamageType::StaticClass() ? DamageAmount : DamageAmount * 1.5f; ... }