본문 바로가기

게임프로그래밍/실습1

(79)
[언리얼 실습] 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..
[언리얼 실습] 51. 데스 포즈 유지하기 목차죽었을 때 유지할 애니메이션 만들기스테이트 머신 만들기캐릭터의 죽음 자세를 구분할 열거형애니메이션 블루프린트에서 열거형으로 상태 구분하기멀티스레드 활용하기열거형에 맞는 데스애니메이션 재생하기1. 죽었을 때 유지할 애니메이션 만들기 현재 에너미가 죽으면 데스 애니메이션이 재생은 되지만 애니메이션 상태가 유지되지는 못한다. 당연한 것이 에너미의 애니메이션 블루프린트는 에너미가 죽었는지 살았는지 알 방법이 없기 때문이다. 이것을 알려줘 에너미가 죽은 상태를 유지하도록 해보자. 가장 먼저 죽었을 때 데스애니메이션이 끝나고 캐릭터가 가지고 있을 애니메이션을 만들 것이다. 데스 애니메이션에 들어가 가장 마지막 프레임을 이용해서 새로운 애니메이션을 만들 것이다. 상단의 Create Asset -> Create A..
[언리얼 실습] 50. 사망시 애니메이션 재생하기 목차체력이 0이 되면 데스 애니메이션 재생하기 1. 체력이 0이 되면 데스 애니메이션 재생하기 에너미에 체력이 존재하고 이 체력이 다하면 데스 애니메이션을 재생할 것이다. 가장 먼저 캐릭터가 살아있는지 아닌지 여부를 알려주는 함수를 Attribute 클래스에서 만들 것이다. class PRACTICE_API UAttributeComponent : public UActorComponent{// 생략public: bool IsAlive(); }bool UAttributeComponent::IsAlive(){ return Health > 0.f;}  이제 캐릭터의 생존여부를 알 수 있게 되었으니 캐릭터가 Hit를 했을 때 Hit 애니메이션을 재생해야할지 데스 애니메이션을 재생해야할지 구분할 필요가 있다. 에..