#23: 인벤토리 아이템 정보창, 속공과 강공의 데미지 타입
카테고리 없음

#23: 인벤토리 아이템 정보창, 속공과 강공의 데미지 타입

인벤토리 아이템 정보창

  • 아이템 정보창은 다음과 같이 동작하도록 정의했다.
    • 아이템에 마우스가 들어오면 화면 중앙에 나타난다.
    • 아이템에 마우스가 나가면 사라진다.
    • 아이템 정보창은 그때 그때 Create하지 않고 한번 만들어두고 여러번 재활용하는 방식으로 사용한다.
  • 아이템 정보창에 쓸 텍스트는 인벤토리 구현 때 생성한 ItemObject에 저장했다. 저장하는 변수는 3개다.
    1. Item Name : 아이템의 이름
    2. Item Type : Weapon, Food 같이 아이템의 분류
    3. Item Info : 아이템에 대한 설명
  • Item Widget 생성 시 실행 노드
  • Item Widget에 마우스가 들어왔을 때 실행 노드
  • 결과

속공과 강공의 데미지 타입

  • 공격의 메커니즘은 다음과 같이 설계했다.

    1. 플레이어가 마우스를 눌러 속공 또는 강공을 실행한다.
    2. 이 때, 강공격이라면 WeaponIsSlowAttacking을 True로 바꿔서 지금 강공격 중임을 알려준다.
    3. WeaponOnAttackCollisionOverlapBegin에서 ApplyDamage를 실행한다. IsSlowAttacking에 따라 다른 DamageTypeClass를 건네준다.
    4. 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;
      ...
    }