* 부모에 영향을 받지 않게 스프라이트의 스케일 부분을 절대 스케일로 변경한다.
계층 구조이기 때문에, 캡슐 밑에 자식으로 스프라이트 오브젝트가 있어서 캡슐 컴포넌트의 스케일을 줄이면 스프라이트 오브젝트도 줄어든다.
2DGame 폴더 -> Input -> IA_Move 생성
* 2D 이기 때문에, 값 타입을 Axis 1D(float) 으로 설정
2DGame 폴더 -> Input -> IA_Jump 생성
값 타입을 bool 으로 설정
2DGame 폴더 -> Input -> IMC_Character2D 생성
1. IA_Move
(1)
방향키 <- (좌)
Modifiers => Negate
Trigger => Down
(2)
방향키 -> (우)
Trigger => Down
2. IA_Jump
스페이스
Trigger => 눌림
Character2D_Base IMC, Move, Jump 액션 바인딩 C++ 작성
void ACharacter2D_Base::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
UEnhancedInputComponent* InputCom = Cast<UEnhancedInputComponent>(PlayerInputComponent);
if (nullptr == InputCom)
return;
if (!MoveAction.IsNull())
{
InputCom->BindAction(MoveAction.LoadSynchronous(), ETriggerEvent::Triggered, this, &ACharacter2D_Base::MoveFunc);
}
if (!JumpAction.IsNull())
{
InputCom->BindAction(JumpAction.LoadSynchronous(), ETriggerEvent::Triggered, this, &ACharacter2D_Base::JumpFunc);
}
}
BPC_Link 입력 설정
Character2D_Base 에 Move, Jump 함수 제작
UCLASS()
class UNREAL_3TH_API ACharacter2D_Base : public APaperCharacter
{
GENERATED_BODY()
// Input Action
public:
void MoveFunc(const FInputActionInstance& _Instance);
void JumpFunc(const FInputActionInstance& _Instance);
}
==========================================================================================
void ACharacter2D_Base::MoveFunc(const FInputActionInstance& _Instance)
{
//LOG(Player, Log, TEXT("Move"));
float fInput = _Instance.GetValue().Get<float>();
// 입력 키에 따른 캐릭터 상태 및 방향 변경
if (1 == fInput)
{
ChangeState(EPLAYER2D_STATE::MOVE, EPLAYER2D_DIR::RIGHT);
}
else if (-1 == fInput)
{
ChangeState(EPLAYER2D_STATE::MOVE, EPLAYER2D_DIR::LEFT);
}
// 캐릭터 이동
AddMovementInput(FVector(1.f, 0.f, 0.f), fInput);
}
void ACharacter2D_Base::JumpFunc(const FInputActionInstance& _Instance)
{
//LOG(Player, Log, TEXT("Jump"));
Jump();
}
Character2D_Base 의 Tick 함수에서 Velocity 가 0 일 때, Idle State로 전환
void ACharacter2D_Base::Tick(float _DT)
{
Super::Tick(_DT);
if (GetMovementComponent()->Velocity.IsZero())
{
ChangeState(EPLAYER2D_STATE::IDLE, CurDir);
}
}
* 애니메이션 속도가 빠르거나 느리다면 Flipbook 들어가서 디테일에 초당 프레임 조절하기.
정적 카메라(카메라 강제 고정)
=> 특정 트리거를 지나가면 cctv 화면 전환하는 것처럼 카메라 view가 전환되는 방식.
https://docs.unrealengine.com/5.0/ko/using-a-static-camera-in-unreal-engine/
스태틱 카메라 사용하기
스태틱 카메라를 사용하여 여러 플레이어 시점을 블렌딩하는 방법에 대한 하우투 가이드입니다.
docs.unrealengine.com
액터 배치 -> 카메라 액터 추가
디테일 -> 카메라 세팅
투영 모드 Orthographic
* 편집 -> 에디터 개인설정 -> preview 검색 -> 카메라 프리뷰 크기 3 으로 키움!
Character2D_Base 에 카메라 액터 멤버변수 추가
class UNREAL_3TH_API ACharacter2D_Base : public APaperCharacter
{
GENERATED_BODY()
private:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Component, meta = (AllowPrivateAccess = "true"))
UCameraActor* CamActor;
}
BPC_Link 에 생성된 CamActor 멤버 변수 선택
Character2D_Base 의 BeginPlay 에서 카메라 시점 옮겨보기
* 시점을 이동시킬 때 쓸 수 있는 함수가 controller 가 가지고 있다.
void ACharacter2D_Base::BeginPlay()
{
Super::BeginPlay();
// 카메라의 시점 옮겨보기
if (IsValid(CamActor))
{
// 5초에 걸쳐서 시점 이동
pController->SetViewTargetWithBlend(CamActor, 5.f);
}
}
* 카메라 클릭 -> 우클릭 -> CameraActor 파일럿 (Ctrl + Shift + P) 클릭
=> 현재 이 카메라가 바라 보는 시점을 볼 수 있다.
Lock 걸고 싶은 지점에 Trigger Box 생성해서 카메라 전환
타일맵 생성
2DGame 폴더 -> TILE 텍스쳐 우클릭 -> 스프라이트 액션 -> 타일 시트 생성
TILE 폴더 생성해서 TILE_TileSet 넣기
우클릭 -> 페이퍼 2D -> 타일맵 생성 -> TileMap
TileMap 을 눌러서 TILE_TileSet 을 넣어준다.
TILE_TileSet
타일 1칸 64px * 64px
충돌처리를 하고 싶다면 박스 추가를 눌러서 저장
* 콜리전 데이터를 누르면, 박스 추가를 했기 때문에 셰이프에 BOX 가 생성되어 있다.
이를 삭제하면, 충돌(?)이 사라지게 된다.
* TileMap -> 채우기 버튼 누르면 전체 그림판의 페인트처럼 다 채워진다.
수풀 -> 충돌체 X , 돌 -> 충돌체 O / 디테일 -> 콜리전 -> 콜리전 두께
* 콜리전 두께가 어느 정도 두꺼워야지만 캐릭터가 그 위로 올라설 수 있다.
* 캐릭터 Blueprint (BPC_Link) 가 사용하는 기본 재질 광원 적용되게 변경
셰이딩 모델 Unlit -> Default Lit 로 변경해서, 광원 연산 받을 수 있게 설정하고 이미시브 컬러 -> 베이스컬러로 변경
'언리얼 5' 카테고리의 다른 글
231026 시네마틱 시퀀서 연출 (0) | 2023.10.26 |
---|---|
231025 언리얼을 활용한 2D Game 제작 (카메라 락 트리거) (0) | 2023.10.25 |
231023 언리얼을 활용한 2D Game 제작 (0) | 2023.10.23 |
231018 물리 엔진 (사운드 재생) / 레벨 스트리밍 (0) | 2023.10.18 |
231017 랜드스케이프 (0) | 2023.10.17 |