초보 코린이의 성장 일지

UE4 Fist, Camera Shake 본문

언리얼

UE4 Fist, Camera Shake

코오린이 2023. 5. 11. 17:11

마지막 무기인 Fist를 추가해 볼 것이다. 구조가 짜여져 있기 때문에 추가하는데 그리 많은 작업이 소요되지 않는다.

1. Sword를 복사해서 Fist로 이름을 변경해준다.

1. 양손, 양발에 충돌체를 붙일것이므로, 위 사진처럼 Sphere를 4개 추가해준다.

1. 무기나 무언가를 장착시키거나 몸에 붙일때는 AttachActorToComponent를 주로 쓰곤 한다.

2. Owner과 Mesh 2개는 고정적으로 필요하고, 이제 소켓이름이 필요한데 이를 C++에서 처리해 줄 것이다.


중요한 부분이 하나 있다. AttachActorToComponent가 BP에서는 Attach할 어떠한 객체를 여러개 지정하면, 앞에서부터 순차적으로 들어가서  잘 붙게된다. 하지만 C++에서는 for문을 돌려서 여러가지 객체를 Attach를 시키게 된다면, 먼저 들어간 객체 하나가 AttachComponent로 넘어가면서 Attach된다 그럼 뒤에있는 나머지 객체들에 순서가 하나씩 앞당겨 지면서 이상한 위치에 붙거나 누락되서 몇가지 객체만 붙게되는 현상이 발생한다.

 

더보기
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CAttachment.generated.h"

// 충돌 On, Off
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAttachmentBeginCollision);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAttachmentEndCollision);

// Begin, End
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FAttachmentBeginOverlap, class ACharacter*, InAttacker, AActor*, InAttackCuaser, class ACharacter*, InOther);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FAttachmentEndOverlap, class ACharacter*, InAttacker, class ACharacter*, InOther);

UCLASS()
class U2212_06_API ACAttachment : public AActor
{
	GENERATED_BODY()

public:	
	ACAttachment();

protected:
	virtual void BeginPlay() override;

protected:
	UFUNCTION(BlueprintCallable, Category = "Attach")
		void AttachToCollision(FName InCollisionName);

protected:
	// BP에서 접근할수도 있고, 충돌체가 몇개 나올지 모르므로 배열로 받는다.
	UPROPERTY(BlueprintReadOnly, Category = "Game")
		TArray<class UShapeComponent*> Collisions;
};
#include "Weapons/CAttachment.h"
#include "Global.h"
#include "GameFramework/Character.h"
#include "Components/SceneComponent.h"
#include "Components/ShapeComponent.h"

ACAttachment::ACAttachment()
{
	CHelpers::CreateComponent(this, &Root, "Root");
}

void ACAttachment::AttachToCollision(FName InCollisionName)
{
	for (UShapeComponent* collision : Collisions)
	{
		if (collision->GetName() == InCollisionName.ToString())
		{
			// 이름과 동일한 곳을 찾아서 붙였다면,
			collision->AttachToComponent(OwnerCharacter->GetMesh(), FAttachmentTransformRules(EAttachmentRule::KeepRelative, true), InCollisionName);

			// 끝
			return;
		}
	}

}

1. 우선은 이름과 동일한 소켓(Collision될 객체)을 찾았다면, Attach 시켜준다.

 1. 동일하게 For문을 돌려서 Attach 시켜준다.

1. Fist로 변경해준다.

1. Player로가서 Fist를 등록시켜준다.

1. 보이는거와 같이 for문을 돌려서 그대로 Attach 시키면 하나씩 밀리면서 Attach가 제대로 되질 않는걸 확인할 수 있다.

1. 이걸 해결하기 위해 역순으로 Reverse for문을 돌려주면 해결할 수 있다.

1. 완벽하게 Attach 되었다.


1. Player로가서 Fist Mode로 전환해줄 수 있게 코드를 작성해준다.

2. 장착까지 완료된다.


 

1. Hammer 스테이트 머신을 복사하여, Fist로 변경해주고 포즈도 변경해준다.

2. BlendState에서 브랜드 애니메이션을 넣어준다.

3. 캐시포즈를 추가해주고 블랜드 포즈에 연결해준다.


1. 몽타주에 알맞게 노티파이를 설정해준다.


1. DoActionDatas, HitDatas에 몽타주와 설정값들을 넣어주고, 총 3번에 공격이 있으므로, 3번의 Hit까지 만들어준 후 알맞게 설정해준다.

2. 이제 Fist 액션이 잘나오고 충돌과 Hit가 잘 되는걸 볼 수 있다.


1. CameraShake를 만들어준다.

2. 좌우위아래 값을 설정하여 흔들리는 효과를 주게 된다.


1. 노티파이로 사용할 클래스를 하나 생성해준다.

더보기
#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimNotifies/AnimNotify.h"
#include "CAnimNotify_CameraShake.generated.h"

UCLASS()
class U2212_06_API UCAnimNotify_CameraShake : public UAnimNotify
{
	GENERATED_BODY()

private:
	UPROPERTY(EditAnywhere, Category = "CameraClass")
		TSubclassOf<class UMatineeCameraShake> CameraShakeClass;

public:
	FString GetNotifyName_Implementation() const override;

	void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) override;

	
};
#include "Notifies/CAnimNotify_CameraShake.h"
#include "Global.h"
#include "GameFramework/Character.h"
#include "GameFramework/PlayerController.h"
#include "Camera/CameraShake.h"

FString UCAnimNotify_CameraShake::GetNotifyName_Implementation() const
{
	return "CameraShake";
}

void UCAnimNotify_CameraShake::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation)
{
	Super::Notify(MeshComp, Animation);
	CheckNull(MeshComp);
	CheckNull(MeshComp->GetOwner());

	ACharacter* character = Cast<ACharacter>(MeshComp->GetOwner());
	CheckNull(character);

	APlayerController* controller = character->GetController<APlayerController>();
	CheckNull(controller);

	controller->PlayerCameraManager->StartCameraShake(CameraShakeClass);
}

1. CmaeraShake를 추가해준다.

1. 마지막 몽타주에 Shake 넣어서 확인해준다.

 

https://www.youtube.com/watch?v=WpShCFfFrPg 

 

'언리얼' 카테고리의 다른 글

UE4 Weapon Plugin (2)  (0) 2023.05.30
UE4 Weapon Plugin  (0) 2023.05.26
UE4 Hit Effect, Status Component, Hammer  (2) 2023.05.10
UE4 HitData, Effect, Sound, HitStop  (0) 2023.05.09
UE4 AnimNotify, ComboState, TakeDamage  (0) 2023.05.08
Comments