이전 글 보기
https://mountain-noroo.tistory.com/85
피직스 머티리얼
랜더링에 사용되는 머티리얼 이외에도 물리적인 작용을 위한 재질인 피직스 머티리얼도 존재한다.
피직스 머티리얼은 머티리얼에도 추가해 사용할 수 있고
랜드스케이프의 레이어 인포에서도 레이어별로 설정 가능하다.
랜드스케이프에 피직스 머티리얼을 적용하면 캐릭터가 지나가는 바닥이 무엇인지에 따라 다른 소리를 낼 수 있다.
PhysicalMaterial을 상속받아 C++ 클래스 생성.
그리고 머티리얼을 사용하기 위해서는
우클릭 -> 피직스 -> 피지컬 머티리얼로 클래스로부터 머티리얼을 생성해주어야 한다.
발자국 소리
현재 어떤 바닥인가만을 확인하기 위해 Landscape에만 충돌판정이 나는 trace Channel을 추가
애니메이션에서 발이 바닥에 닿는 타이밍에 RightStep, LeftStep 노티파이를 추가하였다.
여담이지만 노티파이를 몽타주에만 추가할 수 있는 줄 알았는데 애니메이션 파일에 들어가서도 추가할 수 있더라
// 발 위치 소켓의 시작지점과, 땅을 뚫고 내려간 위치, Trace 끝 지점
FVector vSockStartPos = pPlayer->GetMesh()->GetSocketLocation(*_strSockName);
FVector vSockEndPos = vSockStartPos + FVector(0.f, 0.f, -100.f);
그럼 이제 노티파이가 발생하는 부분으로 가자.
발의 소켓 위치를 가져와 아래로 100만큼 레이를 쏜다.
// 충돌 결과를 받을 Result 구조체
FHitResult hitresult = {};
// 충돌 옵션 설정 Parameter 구조체
FCollisionQueryParams param = {};
param.bReturnPhysicalMaterial = true; // Trace 충돌 성공시, 해당 물체의 물리재질 받아오기 옵션
param.AddIgnoredActor(pPlayer); // Trace 무시할 액터 등록
// LineTrace 진행, ECC_GameTraceChannel6 은 Trace_Landscape 채널
bool bHit = GetWorld()->LineTraceSingleByChannel(hitresult, vSockStartPos, vSockEndPos, ECC_GameTraceChannel6, param);
충돌을 판정하는 부분.
PhysicalMaterial을 받아오도록 옵션을 켜두었고
혹시나 플레이어와 부딪히지 않도록 플레이어 액터를 제외.
if (bHit)
{
UPhysicalMaterial_Landscape* pPMT = Cast<UPhysicalMaterial_Landscape>(hitresult.PhysMaterial);
if (!IsValid(pPMT))
return;
USoundBase* pSound = pPMT->GetSound();
if (IsValid(pSound))
{
UGameplayStatics::PlaySoundAtLocation(GetWorld(), pSound, vSockStartPos);
}
}
충돌 결과에서 피지컬 머티리얼을 받아온다.
정상적이라면 이 피지컬 머티리얼에는 발자국소리의 사운드가 저장되어있어야 한다.
그렇다면, 소리를 출력하자.
레벨 스트리밍
최근 오픈월드 게임들은
모든 월드가 미리 준비되어 있는 것이 아니라
캐릭터가 이동함에 따라 특정 구역을 생성해 내는 기법을 많이 씀
레벨을 생성하고, 레벨 창을 열어서 퍼시스턴트 레벨 아래에 생성한 레벨을 끌어다 놓는다.
뷰포트에서 액터를 선택하고
서브 레벨을 우클릭 -> 선택된 액터를 레벨로 이동을 누르면
해당 액터만 선택한 서브 레벨로 옮길 수 있다.
물론 뷰포트 상에서는 똑같아 보인다.
어떤 액터가 어떤 레벨에 있는지 눈으로 보기 위해서는
빨간 동그라미 친 곳에서 레벨 컬러를 지정하고
뷰포트의 표시 -> 고급 -> 레벨 컬러를 클릭하면 색으로 구분된 월드를 볼 수 있다.
게임을 실행하면 서브 레벨로 이동한 액터가 보이지 않는다.
퍼시스턴트 레벨 이외에는 게임 실행 시 로드되지 않기 때문.
그래서 LevelStreamingVolume이라는 액터를 설치한다.
이 액터는 일종의 트리거 박스로
이 공간 안에 들어오면 연동한 서브 레벨을 로드하는 기능을 한다.
레벨의 디테일 버튼 (위의 연필 버튼)을 누르면 레벨 디테일을 띄울 수 있다.
스트리밍 볼륨을 추가해 주면 연동 끝.
그러나 레벨 스트리밍 볼륨은 언리얼 엔진에서 기본 제공되는 액터인 만큼 불편함이 커서 잘 쓰지는 않는다.
대표적인 이유는 트리거 되는 기준이 캐릭터 메시가 아닌 카메라이기 때문.
스트리밍 볼륨을 빠져나가자 마자 언로드 돼버리는 것도 한몫하고,
게다가 박스 형태의 트리거 박스밖에 만들지 못하니 쓸데없는 것까지 로딩되기도 한다.
스트리밍 볼륨 직접 만들기
이러한 스트리밍 볼륨의 단점을 보완하여 비슷한 기능을 하는 자체 제작 스트리밍 볼륨을 만들어 본다.
영역에 들어갈 때, 나갈 때 트리거되는 대신
닿으면 레벨이 로드되는 박스, 닿으면 레벨이 언로드 되는 박스를 만들어 트리거 되게 한다.
트리거박스를 가진 블루프린트 클래스를 하나 만들고
오버랩 시작 시에 Load 또는 UnLoad 한다.
레벨 로드 뒤 보이도록 Make Visable After Load를 체크.
Streaming Type이라는 Enum을 만들어서 Load인지 UnLoad인지를 구분하였는데
C++로 만들지 않아도
우클릭 -> 블루프린트 -> Enum으로 생성 가능.
추가로 이동 할 서브 레벨을 띄워놓고 랜드스케이프 모드로 들어가 컴포넌트를 누르고 이동을 누르면
랜드스케이프 컴포넌트 또한 이동할 수 있다.
'언리얼 > Assortrack UE5' 카테고리의 다른 글
[언리얼] 학원 33일차: 2D게임 카메라, 타일맵 (1) | 2023.10.24 |
---|---|
[언리얼] 학원 32일차: 2D게임 (1) | 2023.10.23 |
[언리얼] 학원 29일차: 머티리얼 파라미터 콜렉션, 폴리지 (1) | 2023.10.17 |
[언리얼] 학원 28일차: 랜드스케이프 (1) | 2023.10.16 |
[언리얼] 학원 25일차: 포스트 프로세스, 스텐실, 나이아가라 (1) | 2023.10.11 |