[85. Refining Gameplay #1]

 

동시에 두 마리의 몬스터와 전투를 하다가 한쪽 몬스터가 먼저 죽었는데 그게 타게팅된 적이라면 남은 적은 자동으로 타게팅되지 않아서 체력바가 안나오는 문제가 있다.

타게팅을 플레이어가 아닌 적쪽에서 감지 범위에 들어올 때 설정해주기 때문이다.

그래서 이미 감지 범위 안에서 전투중이었다면 업데이트가 안 될 것이다.

 

GetOverlappingActors(TArary<AActor*> &OverlappingActors, TSubclassOf<AActor> ClassFilter = nullptr) const

 

위와 같은 좋은 함수가 있다.

겹침 판정을 주는 액터들을 TArray 레퍼런스에 넘겨주는데 두번째 인자에 해당하는 클래스만 넘겨준다.

TSubclassOf<AEnemy>를 넘겨주면 AEnemy만 컨테이너에 담아준다.

 

그것으로 최소거리인 액터를 구해서 타게팅을 바꾸고 체력바도 다시 표시해주면 될 것이다.

 

// Enemy.cpp
void AEnemy::BeginPlay()
{
    GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
    GetCapsuleComponent()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
}

 

덤으로 적의 메시와 캡슐 컴포넌트가 카메라의 충돌을 무시하게 하면 카메라가 더이상 적에게 밀려서 의도하지 않은 움직임을 보이지 않을것이다.

 

[86. Refining Gameplay #2]

 

기존의 Pickup 클래스는 오로지 코인 하나만 증가시키는 클래스였으나 이제는 체력을 회복시키는 물약도 사용할 수 있게 확장시킬 것이다.

어떤 아이템을 획득했을 때 코인의 보유량을 증가시키거나 체력을 회복시키는 등 각자의 기능이 다르기 때문에 기존과는 조금 다르게 기능 구현을 C++이 아닌 블루프린트에서 해줄 것이다.

 

UFUNCTION(BlueprintImplementableEvent)
void OnPickupBP(class AMain* Target);

 

해당 속성은 구현을 블루프린트에서 하겠다는 의미이다. C++에서 정의가 불가능하다.

 

void APickup::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    OnPickupBP(Main);
}

 

정의를 하지 않아도 코드에서 함수를 사용할 수 있다.

코인은 획득시 코인개수를 증가시키고 포션은 획득시 체력을 회복시키기 때문에 각자의 블루프린트 이벤트그래프에서 해당 기능을 구현해주면 된다.

 

[87. Weapon Trails]

 

공격하여 무기를 휘두를 때 아무런 이펙트가 없으면 밋밋하다. 공격 모션의 특정 구간에 궤적을 그려주면 조금 더 멋있을 것이다.

이것 역시 노티파이를 이용해서 구현할 수 있는데 기존과는 다르게 "노티파이 스테이트" 를 사용한다.

 

보라색으로 표시된 부분이 노티파이 스테이트인데 시작점과 끝점이 존재하고 그 구간만큼만 실행된다.

Trail의 경우 이름 그대로 흔적을 남겨준다.

애님 트레일이 들어있는 파티클을 정해준 스켈레탈 메시의 소켓 위치를 따라서 흔적을 그려준다.

 

 

[88. Spawn Volume Improved]

 

예전에 만들어둔 스폰 볼륨에 몬스터만 스폰 되는것이 아니라 포션이나 코인 등등 다른 오브젝트도 스폰이 가능하게 변경하면 좋을 것이다.

 

BeginPlay->SpawnOurActor 노드를 바로 연결시켰을 경우 초기화 순서로 인해 값이 제대로 안나올 수 있다.

아주 짧은 딜레이를 줘서 해결할 수 있다.

 

 

SpawnActor로 월드에 스폰시킨 액터는 컨트롤러가 없어서 중력 적용이나 이동을 전혀 하지 못하기 때문에 따로 붙여주어야 한다. (참고: https://blog.naver.com/luicypher/220757861973)

SpawnDefaultController로 기본 컨트롤러를 붙여주고 따로 만든 컨트롤러가 있다면 GetController와 Cast를 통해서 바꾸어주면 된다.

 

멤버 변수를 AActor 타입으로 바꿔주었기 때문에 몬스터가 아닌 코인이나 물약같은 Item 타입도 스폰시킬 수 있게 되었다.

 

추가로 에디터에서 스폰 볼륨을 클릭하기 어렵다면 Billboard 컴포넌트를 추가시켜서 쉽게 컨트롤 할 수 있다.

 

 

[정리]

 

  • BlueprintImplementableEvent(또는 BlueprintNativeEvent) 속성을 이용해서 함수의 다형성을 활용할 수 있다. 하나의 클래스를 사용하면서도 오버라이딩이 가능해진다.
  • SpawnActor로 생성된 액터는 컨트롤러가 없어서 따로 추가를 시켜주어야 한다.

'언리얼 엔진 > UE4 C++' 카테고리의 다른 글

[UE C++] Level Changing and Saving the Game #2 -完-  (0) 2022.09.16
[UE C++] Level Changing and Saving the Game #1  (0) 2022.09.15
[UE C++] Combat #9  (0) 2022.09.14
[UE C++] Combat #8  (0) 2022.09.14
[UE C++] Combat #7  (0) 2022.09.13

+ Recent posts