- 어제 작성한 코드 재확인 후 정리
- AI 사망 로직 구현 재정의
- 공격 방식의 다양화 구현
- 공격 범위 재설정
- AI가 경사진곳(계단 등)을 이동할 수 있게 설정
Trace 수정
- 지금 공격을 할때는 Line Trace를 써서 적을 찾아 충돌하는 원리로 작성했기 때문에 손으로 근접공격을 하는 좀비에게는 맞지 않음. 그래서 다른 방식으로 변경해야 할 필요성 느낌.
-> Sphere Trace를 이용하여 선 대신 구체로 변경하면 그 범위내에 있을 시 타격이 가능하므로 AI를 더 입체적으로 구현 할 수 있을 거라 생각.변경 전(Line Trace)
bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Pawn, CollisionParams);변경 후(Sphere Trace)
bool bHit = GetWorld()->SweepMultiByChannel(HitResults, Start, End, FQuat::Identity, ECC_Pawn, FCollisionShape::MakeSphere(SphereRadius), CollisionParams);-> 실험 결과 범위 변경 되는거 확인 (UPROPERTY로 씌워서 범위 수정가능하게 만듦).
- FHitResult에 BoneName에 포함되어 있다고 함.
-> BoneName 별로 데미지를 다르게받는걸로 작성.- 머리(HeadShotDamage) / 몸통(BodyShotDamage) / 팔다리(ArmLegDamage) 추가 후 구현
float ANXNonPlayerCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) { float Health = GetCurrentHealth(); const FPointDamageEvent* PointDamageEvent = static_cast<const FPointDamageEvent*>(&DamageEvent); if (PointDamageEvent) { FName HitBone = PointDamageEvent->HitInfo.BoneName; if (HitBone == FName("head")) // 머리 { DamageAmount = HeadShotDamage; // 헤드샷 데미지 } else if (HitBone == FName("torso")) // 몸통 { DamageAmount = BodyShotDamage; } else if (HitBone == FName("leg")) // 다리 { DamageAmount = ArmLegDamage; } } Health -= DamageAmount; if (Health <= 0.f) { Die(); } return DamageAmount; }처음에 Cast를 썼는데 오류가 발생 ( 엔터티를 초기화 할 수 없다?)
-> 처음보는 문구라 인터넷 서칭..
- DamageEvent가 실제로 FPointDamageEvent 객체가 아닐수도 있다..?
언리얼 커뮤니티에서 찾아보니까 비슷한 문구가 있었음 (솔직히 지금은 봐도 이해가 잘안된다..)
언리얼 커뮤니티 관련 질문
-> DamageEvent의 타입이 FPointDamageEvent가 아닐 경우 Cast는 실패할 수 있다는 원인이 가장 내 문제와 근접해보임 하지만 커뮤니티에도 static_cast를 사용하라는 피드백이 있었기 때문에 DamageEvent가 실제로 FPointDamageEvent 타입이라고 확신하는 것이라고 판단해서 static_cast를 사용해보기로함.결과는 성공적..!