[Unreal] 15.머티리얼_잔상, 캐릭터 선택
본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다
머티리얼_CPP
아웃라인 컨트롤
마우스 오버 등을 했을 때, 머티리얼 값의 변화를 주거나 머티리얼 인스턴스를 대체하는 포스트 프로세스 작업
Fresnel 노드
가운데 부분은 비고 엣지 부분에 베이스가 존재하는 모양 구현 가능
잔상 효과 등을 구현할 때 사용가능
- 사용 방법
- 기본 머티리얼에서 블루프린트로 틀을 잡고
- 머티리얼 인스턴스를 액터의 머티리얼 엘리먼트로 대체
- 머티리얼 인스턴스의 값을 조절해가며 원하는 값 만들기
잔상 효과 스킬 구현
포즈를 복제하고 미리 만들어둔 프레즈넬 머티리얼에 그대로 집어 넣은 후, 해당 포즈를 동작할 수 있게 만들어 주는 개념
- 구현 플로우
- 인풋
- IA에 스킬 인풋 액션 추가
- PlayerCharacter에 IA 선언 및 초기화, 키 Bind
OnSkill()에 액션 가상함수 스킬 애니메이션 호출Skill()- 자식 캐릭터인 로그에서
Skill()함수 오버라이딩- 스킬카운트, 타이머 (타이머 핸들 클래스 이용)를 변수로 선언
- 0.1초에 한번씩 카운트를 증가시키는 타이머 만들고, 20번 카운팅되면 타이머 멈추고, 0으로 카운트 초기화
SkillTimer()UFUNCTION()으로 제작- Spawn Actor로 고스트 인스턴스 생성
SetLifeSpan()함수를 이용해 몇 초 뒤에 사라지게 생성자에서 설정 가능
- 잔상 효과를 만들어 내는
AGhost클래스 (컨트롤러 빙의가 필요없기 때문에 단순히 액터 클래스로 만들어도 됨) 생성- 로그에서 머티리얼 가질수 있게
UMaterialInterface머티리얼 에셋 불러와서 Object 할당 - 메쉬를 미리 카피해 놓는
CopyMesh()함수 PoseableMeshComponent.h헤더 추가 : 카피 포즈 함수 사용을 위함CopyPoseFromSkeletalComponent(): 현재 프레임에서 동작되고 있던 애니메이션 포즈를 복제해서 고스트 메쉬에 그대로 집어넣고, 해당 포즈를 동작하게 만들어 준다- 반복문을 돌아가며 모든 머티리얼을 다이나믹 머티리얼 인스턴스로 만든다
- TArray로 모든 머티리얼을 배열로 만들고, 위 다이나믹 머티리얼 인스턴스를 담아둔다
- 생성자에서 설정한
SetLifeSpan값에 따라mOpacityTimer를 만들어서 사라질 시간에 맞게 Opacity 값 조절하게 함 Tick()함수에서 미리 잡아둔 배열의 값의 SetParameterValue 값(머티리얼 인스턴스에서 만들어둔 Opacity 노드)을 변경한 Opacity값 (deltaTime 만큼 빠진 값)으로 변경하여 불투명도를 0(완전 투명)으로 만들면서 잔상효과 조금 더 리얼하게 조정 가능
- 로그에서 머티리얼 가질수 있게
- 인풋
로그
출력로그에 로그 띄울 수 있게하려면 GameInfo 등에 전처리기 매크로 선언
- GameInfo.h
... DECLARE_LOG_CATEGORY_EXTERN(UE20241, Warning, All); ... - GameInfo.cpp
... DEFINE_LOG_CATEGORY(UE20241); ...
캐릭터 선택
마우스로 플레이할 직업을 선택 가능하게 구현
캐릭터 선택 제작 순서
- 마우스 오버로 직업 선택이 가능하게 할
SelectCharacter액터 생성- 스켈레탈 메쉬와 충돌처리가 가능하게 해줄 박스 컴포넌트 생성
- 캐릭터 선택창에서 사용할 새로운 게임모드
SelectGameMode생성- DefaultPawnClass nullptr로 초기화
- 기본으로 생성할 폰인
SelectPawn폰 생성- 카메라 컴포넌트 추가
- 플레이어 자동빙의 Player0 번으로 설정
BeginPlay()에서 컨트롤러의 마우스 커서 보이게, InputMode를 InGame과 UI 모두 선택 가능한 모드로 변경- mMesh는 NoCollision, mBody의
SetCollisionProfileName을 플레이어로 변경
- 콜리전_트레이스 채널 추가
- Picking (기본 반응 : Ignore) : 마우스로 체크하고자 하는 것들 처리 가능하게 셋팅
Tick()함수에서GetHitResultUnderCursor()Picking 채널으로 설정해준 액터와 충돌이 됬는지 확인- 충돌이 됬다면
SelectCharacter.h
- 스켈레탈 메쉬 생성, 루트로 지정,
bVisualizeComponent설정 - 각 액터를 월드에 배치 후, 메쉬를 지정해 주기
SelectCharacter.cpp
SelectPawn.cpp
void ASelectPawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FHitResult result;
bool Collision = GetController<APlayerController>()->GetHitResultUnderCursor(
ECollisionChannel::ECC_GameTraceChannel6, false, result);
if (Collision) // 마우스 충돌이 있다면
{
ASelectCharacter* Select = Cast<ASelectCharacter>(result.GetActor()); // 충돌 지점의 Actor를 받아오고 SelectCharacter Class로 캐스팅한다
if (IsValid(Select)) // 마우스 오버 했을 때, 캐릭터가 있다면
{
Select->OnSelect(true); // 해당 캐릭터의 OnSelect 함수 호출
}
else // 마우스 오버 해제한 경우
{
if (IsValid(mSelect)) // 아까 찾은 캐릭터가 있다면
mSelect->OnSelect(false); // 해당 캐릭터의 OnSelect false로 변경 (테두리 렌더링 효과 해제)
}
mSelect = Select; // 이전에 클릭한 캐릭터를 현재 mSelect로 갱신 (다시 마우스 오버했을 때, 찾기위해)
}
else // 마우스 충돌이 없는 경우
{
if (IsValid(mSelect))
{
mSelect->OnSelect(false); // 이전 선택의 캐릭터의 OnSelect를 false로 변경
}
mSelect = nullptr; // 이전 선택 nullptr로 변경
}
}