UE4 PhysicalMaterial 설정 및 검색에 대한 메모

개요



UnrealEngine 의 물리 머티리얼 (PhysicalMaterial) 의 설정과 취득에 관한 메모입니다.
단순한 콜리전(SimpleCollision)과 복잡한 콜리전(ComplexCollision)의 경우가 있는 것 같습니다.

업데이트 내역




날짜
내용


2021/02/26
표면형의 추가 설정에 대해 추가


환경



Windows10
Visual Studio 2017
UnrealEngine 4.22

참고



다음을 참고로 해 주셔서 감사합니다.
물리적 머티리얼 사용자 가이드
ueHow - HitResult
UE4의 대규모 배경 제작 사례(콜리전편)

물리 머티리얼



콘텐츠 브라우저에서 피직스 -> 물리 머티리얼로 만들 수 있습니다.


물리적 머티리얼 획득 - 라인 트레이스에서 블록 히트 획득



라인 트레이스를 사용하여 충돌을 검사합니다. 결과가 HitResult로 돌아옵니다.
다른 트레이스 계열도 거의 함께 보인다.



C++ 코드라면 다음과 같습니다.
FVector _St;
FVector _Ed;
FHitResult HitResult;
TArray<AActor*> ActorsToIgnore;

// _Stから_EdまでのライントレースをしてぶつかったSimpleCollisionを取得する
UKismetSystemLibrary::LineTraceSingle(GetWorld(), _St, _Ed, UEngineTypes::ConvertToTraceType(ECollisionChannel::ECC_Visibility),
false, ActorsToIgnore, EDrawDebugTrace::None, _HitResult, true);


HitResult는 다음과 같은 멤버를 가지며 PhysMat에서 물리적 머티리얼을 얻을 수 있습니다.


C++ 코드라면 다음과 같습니다.
// 物理マテリアルを取得する例
auto _PhysMat = _HitResult.PhysMaterial;
if (_PhysMat != nullptr) {
 // アセット名を表示
 UE_LOG(LogTemp, Log, TEXT("%s"), *_PhysMat->GetName());
}

물리적 머티리얼 설정



SimpleCollision용 설정



단순한 콜리전의 경우는, 컴퍼넌트의 [Collision] -> [Phys Material Override] 에 물리 머티리얼을 설정하는 것으로 취득을 할 수 있습니다.
공란의 경우에 취득을 하면(자) 엔진의 DefaultPhysicalMateral 가 돌아오는 것 같습니다.



스태틱 메시로 설정하는 경우 Simple Collison Physical Material로 설정합니다.


ComplexCollision용 설정



복잡한 충돌의 경우 머티리얼의 [Physical Material] -> [Phys Material]로 설정합니다.



이 경우 ComplexCollision에 대해 HitResult를 검색하기 위한 추적도 수행하지 않으면 검색할 수 없습니다.
(LineTraceSingle() 의 경우는, 제5 인수 bTraceComplex 를 true 로 한다)

[Return Material on Move] 설정 정보



콜리전의 설정 [Return Material on Move]에 대해서입니다만, 이 체크를 넣지 않으면 HitResult 로 PhysicalMaterial 를 취득할 수 없을까 생각했습니다만, 바닥 등의 정적인 것에 대해서는 체크 불필요한 것 같습니다.



PhysicalMaterial 클래스의 상속에 대해서



물리적 머티리얼 클래스를 상속하여 필요한 멤버를 추가할 수 있습니다.

이하, float 를 하나 추가하고 있을 뿐의 코드 예입니다.

MyPhysicalMaterial.h
#pragma once

#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "UObject/Object.h"
#include "Engine/EngineTypes.h"
#include "EngineDefines.h"
#include "PhysxUserData.h"
#include "Vehicles/TireType.h"
#include "PhysicsEngine/PhysicsSettingsEnums.h"
#include "Physics/PhysicsInterfaceCore.h"
#include "PhysicalMaterials/PhysicalMaterial.h"
#include "MyPhysicalMaterial.generated.h"

class UPhysicalMaterial;

UCLASS(BlueprintType, Blueprintable, CollapseCategories, HideCategories = Object)
class TEST_API UMyPhysicalMaterial : public UPhysicalMaterial
{
    GENERATED_UCLASS_BODY()

public:
    // 追加パラメータ
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AddParam")
    float       AddParam;

};


cpp는 생성자에서 추가 매개 변수를 초기화하고 있습니다.

MyPhysicalMaterial.cpp
// コンストラクタ
UMyPhysicalMaterial::UMyPhysicalMaterial(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    Friction = 1.0f;
    AddParam = 1.5f;
}


물리적 머티리얼을 만들 때 상속된 MyPhysicalMaterial 클래스를 선택할 수 있습니다.


물리적 설정 정보



표면형 추가 설정



[프로젝트 설정] -> [엔진/물리] -> [Physical Surface]
에서 커스텀 표면형을 설정할 수 있습니다.



여기에서 설정한 표면형이 물리 머티리얼 에셋의 フィジカルプロパティSurfaceType 로 설정할 수 있게 됩니다.



요약



콜리전의 모양에 따라 설정이 바뀌기 때문에 처음에는 잘 정보를 얻을 수 없어 혼란스러웠습니다. 정리해 보면 이해할 수 있습니다.
그리고는 물리 머티리얼의 설정이 되어 있는지 어떤지를 간단하게 확인할 수 있는 방법이 필요한 곳입니다. (뷰의 표시 전환 근처에서 할 수 있도록)

좋은 웹페이지 즐겨찾기