언리얼엔진/언리얼 C++

(충돌)마우스 하이라이트와 추적과 공격

season97 2024. 10. 22. 19:01

 개인적인 공부를 위해 포스팅 하는 글입니다.




# 적으로 쓸 임시 엑터 생성

지금은 에디터에서 그냥 클릭 해본 상태인데. 인게임에서도 마우스 커서를 가져다 올렸을 때 해당 기능이 되길 원한다.

ㆍ 인터페이스를 상속받는 클래스를 하나 만들어준다.

ㆍ 다중상속은 C++에서 지원은 하나 별로 권장하진 않는다.. 하지만 인터페이스로 추상적으로 되어있는 클래스는 다중상속을 받아 구현해도 별 문제가 없다.

ㆍ 해당기능은 몬스터든 플레이어든 둘 다 작동되길 원하느 그냥 캐릭터 클래스에서 상속을 받아서 구현부를 작성해줬다.

ㆍ 뭐 일단은 별거없이 bool로 분기점만 나눠둔 상태

 

#R1PlayerController

ㆍ 컨트롤에 관련된 것들은 PlayerController 클래스에서 해주고 있으니 거기에 해당 변수를 추가해 줬다.

ㆍ 마우스에 따라 외곽선이 생기는건 필연적으로 Tick으로 연산할 수 밖에 없으니 그와 관련된 함수를 2개 파줬다.

 

잊지 말고 Super:: 해주고

void AR1PlayerController::TickCursorTrace()
{
	if (bMousePressed)
	{
		return;
	}
	FHitResult OutCursorHit;
	if (GetHitResultUnderCursor(ECollisionChannel::ECC_Visibility, true, OUT OutCursorHit) == false)
	{
		return;
	}

	AR1Character* LocalHighlightActor = Cast<AR1Character>(OutCursorHit.GetActor());
	//커서가 누구를 주시하고 있느냐... 로컬 히트가 null이면 마우스가 몬스터를 주시하고 있지 않는 상황. 
	//Cast는 다이나믹 캐스트같은것이므로 실패시 nullptr을 반환함
	if (LocalHighlightActor == nullptr)
	{
		//1. 하이라이트가 있었는데 마우스가 빠져서 없어지는 상황
		if (HighlightActor)
		{
			HighlightActor->UnHighlight();
		}
	}
	else
	{
		if (HighlightActor)
		{
			//있긴 있었는데, 빈공간에서 생긴게 아닌 있던애에서 다른애로 바뀐 상황
			if (HighlightActor != LocalHighlightActor)
			{
				HighlightActor->UnHighlight();
				LocalHighlightActor->Highlight();
			}

			//반복문에 안들어온다면 동일한 애 이므로 무시
		}
		else
		{
			//원래 아무도 없었고 새로운 타겟
			LocalHighlightActor->Highlight();
		}

	}

	HighlightActor = LocalHighlightActor;

}

ㆍ 로직에 대한 포스팅은 주석으로 대체

 

앤진으로 돌아와서

이렇게 세팅하면

ㆍ 커서는 캡처가 안돼서 대체...ㅎㅎ 암튼 잘 작동한다

 

 

※ 그럴싸한 리소스를 넣는다면 더 잘뽑히겠다

 


# 추적과 공격

ㆍ 기존 코드에 이제 Tick에서 업데이트 되고있는 타겟에 대한 정보를 추가해 줬다.

ㆍ 이제 적을 향해 커서를 찍으면 아무 기능도 작동하지 않는다. 또한 마우스를 누르고있는 상태에서 다른곳을 드래그했다 때도 마찬가지로 아무 기능도 작동하지 않는 상태로 만들어 두었다.

ㆍ 틱 함수에 추가할 함수를 하나 더 만들어줬다.

ㆍ 근데 PlayerController 클래스에서 Player를 좀 많이 사용하는 것 같으니 캐싱받을 수 있는 변수를 하나 만들어서 BeginPlay 에서 할당해주자.

 

잘 된다. 이제 실제 공격이 되게끔 그냥 몽타주를 만들어서 재생시켜 보자

 

여기 들어가면되겠다.

ㆍ 눌렀을때 떘을때에 대한 자세한 로직 처리도 추후 필요하겠다. 일단 몽타주만 재생시켜주자

 

 

#스킬쓰는데 이동하지 않기... 이런 상태에 관련된 것들은 따로 enum을 이용해 관리하는게 좋다. 

ㆍ 따로 클래스를 파준건 얘를 include했을때 데이터가 크기 않길원하기 떄문. 아무것도 상속받지 않은 클래스로 만들어서 다 지워주고 enum만 생성해준다.

ㆍ 움직이는 중엔 공격하면 안된다.

 

# 그이후엔 그냥 로직이겠다. 

대충 이런 느낌인데 로직이 너무 길어서 자세한 포스팅은 생략

 

※ 핵심은 상태를 분리해주고 그 상태에 맞게 행동하는 로직이라는 것. 

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

Post Process  (0) 2024.10.23
데미지 처리와 애니메이션 노티파이  (0) 2024.10.23
(충돌) C++에서 충돌과 델리게이트  (1) 2024.10.21
(충돌) 프리셋과 트레이스  (0) 2024.10.21
충돌의 기초  (0) 2024.10.21