이전 글 보기
https://mountain-noroo.tistory.com/87
플러그인
편집->플러그인
플러그인을 추가하거나 추가한 플러그인 확인
콘텐츠 브라우저 우측의 세팅에서 플러그인 콘텐츠를 표시할 수 있다.
페이퍼 2D
아마 기본적으로 추가되어 있겠지만 없으면 플러그인으로 다시 들어가서 체크한다.
프로젝트 세팅 -> 플러그인 -> 페이퍼 2D로 가면 해당 창이 뜬다.
스프라이트 아틀라스 그룹 활성화를 하자
스프라이트 아틀라스
필요한 텍스처들을 한 장의 텍스처로 만들어 드로우 콜을 하나로 줄인다.
페이퍼 2D->스프라이트 아틀라스 그룹
아틀라스 텍스처의 크기를 설정해주자.
페이퍼 2D->스프라이트
스프라이트를 만들고 소스 텍스처를 고른다.
그리고 고급을 열어 아틀라스 그룹에 방금 만든 아틀라스를 추가하면
해당 아틀라스를 사용하는 스프라이트가 만들어진다.
원래 이 텍스처를 사용하던 곳으로 가서 스프라이트로 교체해 준다.
눈에 보이는 것은 없지만 스프라이트 아틀라스를 사용하여 최적화에 도움을 주게 된다.
스프라이트 추출
스프라이트 액션-> 스프라이트 추출
미리 준비된 아틀라스에서 스프라이트를 추출할 수 있다.
Auto로 추출하면 스프라이트가 공간에 딱 맞게 컬링 된다.
이 스프라이트는 그리드에 맞춰 배치되어 있기 때문에 Grid로 추출
플립북
애니메이션으로 만들 스프라이트들을 선택하고 플립북 생성을 선택한다.
그럼 애니메이션으로 만들어지는데
피봇이 맞지 않는 문제가 있을 수 있다.
이 때는 우측 하단의 스프라이트 중에서 수정할 스프라이트를 편집한다
피벗 포인트를 수정해 주고
필요하다면 UV(스프라이트의 위치), 치수(사이즈)도 수정한다.
PaperCharacter
캐릭터가 Character 클래스를 상속받듯, 2D 캐릭터는 PaperCharacter클래스를 상속받아야 한다.
물론 이도 Character 클래스에서 상속받은 클래스이다.
플립북 재생
UENUM(BlueprintType)
enum class EPLAYER2D_STATE : uint8
{
IDLE,
MOVE,
ATTACK,
JUMP,
FALL,
HIT,
DEAD,
NONE,
};
UENUM(BlueprintType)
enum class EPLAYER2D_DIR : uint8
{
LEFT,
RIGHT,
};
재생 기능을 넣기에 앞서
캐릭터의 현재 상태를 지정하기 위한 enum 값을 만들었다.
USTRUCT(Atomic, BlueprintType)
struct FFlipbookInfo
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
EPLAYER2D_STATE State;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
EPLAYER2D_DIR Dir;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
UPaperFlipbook* Flipbook;
};
그리고 구조체도 하나 만들어
이러한 상태, 방향일 때 이 플립북을 재생해야 한다는 정보를 알려준다.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Info, meta = (AllowPrivateAccess = "true"))
TArray<FFlipbookInfo> FlipbookInfoArr;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Info, meta = (AllowPrivateAccess = "true"))
EPLAYER2D_DIR CurDir;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Info, meta = (AllowPrivateAccess = "true"))
EPLAYER2D_STATE CurState;
2D 캐릭터 클래스에 모든 플립북 정보(위 구조체)에 대한 배열과,
현재 방향, 현재 상태를 가리키는 프로퍼티를 작성한다.
bool ACharacter2D_Base::ChangeState(EPLAYER2D_STATE _NextState)
{
if (CurState == _NextState)
return false;
CurState = _NextState;
switch (CurState)
{
case EPLAYER2D_STATE::IDLE:
break;
case EPLAYER2D_STATE::MOVE:
break;
case EPLAYER2D_STATE::ATTACK:
break;
case EPLAYER2D_STATE::JUMP:
break;
case EPLAYER2D_STATE::FALL:
break;
case EPLAYER2D_STATE::HIT:
break;
case EPLAYER2D_STATE::DEAD:
break;
}
PlayFlipbook(CurState, CurDir);
return true;
}
상태값을 변경할 수 있도록 함수를 하나 파 주었다.
스위치 문은 추후 필요한 일이 생길 수 있기 때문에 미리 만들어 두었다.
현재 상태와 다른 상태가 들어왔을 경우 true, 같을 경우 false를 리턴할 것이다.
void ACharacter2D_Base::PlayFlipbook(EPLAYER2D_STATE _CurState, EPLAYER2D_DIR _CurDir
, bool _bLoop, int32 _StartFrame)
{
for (int32 i = 0; i < FlipbookInfoArr.Num(); ++i)
{
if (_CurState == FlipbookInfoArr[i].State && _CurDir == FlipbookInfoArr[i].Dir)
{
if (IsValid(FlipbookInfoArr[i].Flipbook))
{
GetSprite()->SetFlipbook(FlipbookInfoArr[i].Flipbook);
GetSprite()->SetPlaybackPositionInFrames(_StartFrame, false);
GetSprite()->SetLooping(_bLoop);
GetSprite()->Play();
}
return;
}
}
}
대망의 플립북 재생을 담당하는 함수이다.
플립북 인포 배열을 순회하며 현재 상태, 방향에 맞는 플립 북을 찾으면 해당 플립 북을 재생한다.
GetSprite로 PaperCharacter의 스프라이트를 가져와 플립북 애니메이션을 재생할 수 있다.
https://docs.unrealengine.com/5.1/en-US/API/Plugins/Paper2D/PAPER2UPaperSpriteComponent/GetSprite/
SetFlipbook으로 실행 할 플립북을 지정하고
SetPlaybackPositionInFrames, SetLooping을 통해 시작 할 프레임과 루프 여부를 지정할 수 있다.
모든 설정이 완료되면 Play로 실행.
에디터에서 변경시 바로 적용
#if WITH_EDITOR
virtual void PostEditChangeProperty(FPropertyChangedEvent& _PropertyEvent) override;
#endif
#if WITH_EDITOR
void ACharacter2D_Base::PostEditChangeProperty(FPropertyChangedEvent& _PropertyEvent)
{
Super::PostEditChangeProperty(_PropertyEvent);
PlayFlipbook(CurState, CurDir);
}
#endif
에디터에서 프로퍼티를 변경하였을 때 호출이 되는 함수로
#if 구절을 통해 EDITOR에서만 호출 되도록 하였다.
'언리얼 > Assortrack UE5' 카테고리의 다른 글
[언리얼] 학원 33일차: 2D게임 카메라, 타일맵 (1) | 2023.10.24 |
---|---|
[언리얼] 학원 30일차: 피지컬 머티리얼, 레벨 스트리밍 (0) | 2023.10.18 |
[언리얼] 학원 29일차: 머티리얼 파라미터 콜렉션, 폴리지 (1) | 2023.10.17 |
[언리얼] 학원 28일차: 랜드스케이프 (1) | 2023.10.16 |
[언리얼] 학원 25일차: 포스트 프로세스, 스텐실, 나이아가라 (1) | 2023.10.11 |