본문 바로가기

Unreal/개인플젝

공방. 충돌

오늘은 아침에 공방을 구현했다.

 

내 머릿속의 공방 기획.

1. 조건 : 서로 충돌(Radius 조절 가능)

- Unit 일 경우 : 즉사

- Summoner일 경우 : 체력이 깎이고, HP Bar에 표기됨.

 

2. 구현

- 충돌

- 공격 이벤트 전달(UMLEvent::OnAttack으로 이미 만들어 두었다.)

- 스탯 (Team 타입, HP, 공격력, 방어력만 있어도 됨)

- 위젯컨포넌트(체력바)

 

 

 

일단 이렇게 적군 Summoner 를 레벨에 배치한다.

얘는 보스가 될 것이다. 

적군 Summoner가 적군 Unit들을 스폰하고, 서로 충돌 이벤트 발생하면 공격 이벤트 broadcast 해줄것이다.

(카메라 조절을 안해놔서 임의의 각도로 찍었다. 카메라 조절도 필요함...!)

 

카메라 조절 안하면 상당히 비장하게 찍힌다. 디렉셔널라이트만 배치해서 그런가?

 SKyLight가 왜 안먹는지 모르겠다. @@ 빛은 어려어ㅜ

 

 

프리셋은 직접 만들어도 되긴 하지만, 기본레벨과 캐릭터들밖에 없는 게임이니까(아직 프로젝타일 등 없음)

OverlapOnlyPawn으로 설정해줘서 서로간의 충돌만 인식하도록 했다.

MLCharacter.cpp

AMLCharacter::AMLCharacter()
{
...
	if (AttackCapsule == nullptr)
	{
		AttackCapsule = CreateDefaultSubobject<UCapsuleComponent>(TEXT("AttackCapsule"));
		AttackCapsule->SetCapsuleRadius(AttackRadius);
		AttackCapsule->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
		AttackCapsule->SetCollisionProfileName(TEXT("OverlapOnlyPawn"));
		AttackCapsule->OnComponentBeginOverlap.AddDynamic(this, &AMLCharacter::OnBeginOverlap);
	}
...
}




void AMLCharacter::OnBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if (AMLCharacter* OtherCharacter = Cast<AMLCharacter>(OtherActor))
	{
		UMLEventSystem::Get(GetWorld())->OnAttackEvent.Broadcast(GetUID(), OtherCharacter->GetUID());
	}
}

 

이벤트 시스템에 서로 충돌한 캐릭터들 UID만 담아서 이벤트를 발동시켜준다.

 

그러면

1. 캐릭터 풀에서 해당UID 찾아서

2. 해당하는 캐릭터들에게 공격당함 이벤트 전달

->캐릭터 내부에서 자신의 스탯 판단하여 사망/체력감소 등 판정

 

하는 로직을 돌린다.

1~2는 공방시스템으로 따로 묶어주는게 종속성을 생각하면 좋겠다. 일단 사망하는거 보고~! 구현하기

 

 

 

그런데 아뿔사 실수했다.

스포너로 스폰해야 나의 캐릭터풀에 캐릭터가 담기는데

내 캐릭터는 그냥 defaultPawn스폰 로직으로, 적군Summoner는 레벨에 배치하는 방식으로 했더니

캐릭터풀에 담기지 않는다.

 

스폰 로직부터 바꿔준다.~

PlayerStart 배치하고

Tag Enemy일 경우에는 적군

Tag Player 일 경우에는 아군 Summoner를 스폰할 것이다.

그리고 아군 스포너에 빙의한다.

 

 

PlayerStart에는 PlayerStartTag라는 친구가 있다. 레벨에 배치 뒤 Player, Enemy 를 각각 설정해준다.