본문 바로가기

게임프로그래밍

(141)
[언리얼 실습] 61. 공격 사거리 안으로 들어오면 공격상태로 만들기 목차공격 상태로 바꾸기1. 공격 상태로 바꾸기 이제 추격(Chasing)을 하다가 거리가 더욱 가까워저 공격 사거리 안으로 들어오면 공격 상태로 바꿔보려고 한다. 이때 공격 기능의 경우는 나중에 좀 더 있다가 추가할 것이다. 가장 먼저 공격 사거리를 정해야할 것이다. 에너미 헤더파일로 들어가자. UPROPERTY(EditAnywhere)double AttackRadius = 150.f; 공격 사거리를 알았으니 이미 존재하는 CheckCombatTarget() 함수에서 캐릭터와의 거리마다 에너미가 할 행동을 지정해주자. void AEnemy::CheckCombatTarget(){ if (!InTargetRange(CombatTarget, CombatRadius)) { CombatTarget = nullp..
[언리얼 실습] 60. 에너미의 순찰, 추격, 공격 상태 구분하기 목차 Enum으로 캐릭터 상태 구분하기 거리가 멀면 다시 순찰하게 하기1. Enum으로 캐릭터 상태 구분하기 에너미에게 열거형으로 상태를 지정해 해당 상태에 맞는 행동을 하게 하려고 한다. 열거형을 모아둔 CharacterType 파일이 있고 이곳에서 새로운 열거형을 만들자. UENUM(BlueprintType)enum class EEnemyState : uint8{ EES_Patrolling UMETA(DisplayName = "Patrolling"), EES_Chasing UMETA(DisplayName = "Chasing"), EES_Attacking UMETA(DisplayName = "Attacking")}; 이제 에너미 클래스에서 이 열거형을 바탕으로 상태를 지정해주자. EEnemyState ..
[언리얼 실습] 59. 에너미가 플레이어 발견시 반응하기 목차Pawn Sensing Component캐릭터 발견시 함수 호출하기1. Pawn Sensing Component 이제 에너미가 플레이어를 발견하면 추적하게 하고 싶다. 에너미가 캐릭터를 보기 위해서는 Pawn Sensing Component가 필요하다. C++에서 이를 만들어보자. UPROPERTY(VisibleAnywhere)class UPawnSensingComponent* PawnSensing; 이것을 이제 실제 생성자에서 만들어주어야 한다. PawnSensing = CreateDefaultSubobject(TEXT("PawnSensing"));PawnSensing->SightRadius = 4000.f;PawnSensing->SetPeripheralVisionAngle(45.f); Vision..
[언리얼 실습] 58. 패트롤 대기 시간 추가하기 목차 타이머 만들기 타이머에 맞춰서 에너미 패트롤 시키기1. 타이머 만들기 타이머를 만들기 위해서는 FTimerHandle 구조체가 필요하다. 타이머핸들은 타이머를 관리하는 데 사용되는 구조체라고 한다. class PRACTICE_API AEnemy : public ACharacter, public IHitInterface{// 생략private:FTimerHandle PatrolTimer; // 타이머 핸들void PatrolTimerFinished(); // 콜백함수} 타이머 핸들과 타이머가 다 되면 실행할 함수를 선언해주었다. 이제 함수를 정의해보자.void AEnemy::PatrolTimerFinished(){ if (EnemyController && PatrolTarget) { FAIMoveR..
[언리얼 실습] 57. 에너미 실제로 패트롤 시키기 목차서론함수 리팩터링하기에너미 패드롤 시키기1. 서론 현재 우리에게는 에너미가 패트롤 할 위치(액터)를 저장할 배열을 가지고 있다. 이를 활용해 에너미가 실제로 패트롤을 하게 구현해보자.  c++에서 이를 구현하기 전에 혹시 까먹을 수도 있으니 배열들을 먼저 채워주었다.2. 함수 리팩터링하기 이제 패드롤 기능을 구현할 것이다. Tick함수에서 구현할 것인데 해당 함수를 한번 봐보자. void AEnemy::Tick(float DeltaTime){ Super::Tick(DeltaTime); if (CombatTarget) { const double DistanceToTarget = (CombatTarget->GetActorLocation() - GetActorLocation()).Length(); if..
[언리얼 실습] 56. 에너미 패트롤 하기. 목차에너미 패트롤 시키기1. 에너미 패트롤 시키기 에너미가 일정 위치를 지속적으로 순찰하는 기능을 만들어 보려고 한다. 패트롤 타겟을 여러개 만들고 이 타켓들을 순찰하게 하고 싶은데 그러기 위해서 이 타켓들을 배열에 담아서 보관해야 한다. C++에서 이 작업을 해보자. 에너미 클래스에 변수를 선언할 것이다. // 현재 순찰중인 타켓UPROPERTY(EditInstanceOnly, Category = "AI Navigation")AActor* PatrolTarget;// 타켓 배열UPROPERTY(EditInstanceOnly, Category = "AI Navigation")TArray PatrolTargets; PatrolTarget은 현재 에너미가 향하고 있는 목표이다. CombatTarget이 nu..
[언리얼 실습] 55. 블랜드스페이스를 통해 에너미의 속도에 따른 애니메이션 구현하기 목차블랜드 스페이스 만들기에너미 속도 구하기에너미가 이동할때 바라보는 방향 조절하기1. 블랜드 스페이스를 이용해 에너미의 이동 애니메이션 구현하기 애니메이션 블루프린트에서 캐릭터의 속도를 구하고 그때마다 적절한 애니메이션을 연결 시켜주어 걷기와 정지 애니메이션을 구현할 수도 있지만 이번에는 블랜드 스페이스를 이용해 이것들을 구분해보려고 한다.  속도 하나의 값만 가지고 애니메이션을 혼합할 것이기 때문에 1D 블랜드 스페이스로 만들어주자.  블랜드 작업은 이전 포스팅에서도 해봤으니 간단하게 하게 포스팅해보려고 한다.  최대 축 크기는 300 (에너미의 최대 속도)로 한다.  그리고 애니메이션들을 적절히 배치하자. Idle, Walk, Run 순으로 배치하였다. Walk의 경우 120의 값에 배치하였다. 나..
[언리얼 실습] 54. 네비게이션 매시 만들기 목차내비게이션 매시내비게이션 실시간 업데이트 하기내비게이션 매시 경계 간격 조절하기1. 내비게이션 매시 에너미의 움직임을 순수하게 c++로 만들어 구현할 수도 있겠지만 이 경우에 매우 복잡하고 어려운 알고리즘을 필요로 할 것이다. 다행히도 언리얼 엔진에서는 이러한 알고리즘을 제공해 주고 우리는 그저 그 알고리즘을 가져다 쓰기만 하면 된다. 언리얼에 존재하는 내비게이션 시스템을 이용하기 위해서는 내비게이션 매시가 필요하다.  Place Actors 에서 nav Mesh를 검색하면 내비게이션 매시를 찾을 수 있다. 이 액터를 배치해 보자.  언리얼에서 제공해 주는 내비게이션 기능은 오로지 이 볼륨 안에서만 작동한다. 키보드로 P키를 누르면 이 볼륨으로 생성된 내비게이션 매시를 볼 수 있다. AI는 오직 이 ..
[언리얼 실습] 53. 원할 때만 체력바가 보이게 하기 목차 최초에 체력바 안보이게 하기 타격시 체력바 보이게 하기 일정 거리에서 벗어나면 체력바 안보이게 하기 에너미 사망시 체력바 안보이게 하기1. 최초에 체력바 안보이게 하기 에너미 생성시 현재 체력바가 같이 보이는데 이부분을 수정하여 전투상태가 들어가야 체력바가 보이게 수정할 것이다. 그렇게 하기 위해서는 가장 처음에는 체력바가 보이지 않게 해야한다. BeginPlay() 함수로 들어가자. void AEnemy::BeginPlay(){ Super::BeginPlay(); if(HealthBarWidget) { HealthBarWidget->SetVisibility(false); }} 이제 타격을 받으면 체력바가 보이게 해볼 것이다.2. 타격시 체력바 보이게 하기 이제 에너미가 플레이어에게 타..
[언리얼 실습] 52. 에너미 사망시 이것저것 수정하기 목차캡슐 충돌 해결하기죽은 후 일정시간 뒤 사라지게 하기1. 캡슐 충돌 해결하기 현재 에너미가 죽더라도 캡슐 컴포넌트가 남아있어 계속 충돌하는 문제가 있다. 이를 해결하자. 비주얼 스튜디오로 들어가 에너미의 죽음을 다루는 곳으로 가보자.  void AEnemy::Die(){// 생략GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);} 캡슐컴포넌트를 불러와서 콜리전 설정을 한다. 이렇게 하면 간단하게 충돌문제를 해결할 수 있다.2. 죽은 후 일정시간 뒤 사라지게 하기 현재 에너미가 죽으면 영원히 남아있다. 실제 게임에서는 최적화 측면에서 이렇게 계속 남아있는 것은 좋지 않다. 그러니 사망 후 에너미를 없애도록 하자. Die..