250x250

Xtra의 그 무엇

블로그 이미지
욕심많아 진도 느린 Xtra입니다.
by Xtra
  • Total hit
  • Today hit
  • Yesterday hit

728x90
728x90

선 요약

후 사설

 

 

 

요약

   이동식

const FRotator YawRotation(0, TestAngle, 0);
if (Value <= 0.1f)
{
TestAngle -= 0.1f;
if (TestAngle <= 0.f) TestAngle = TestAngle + 360.f;
}
if(Value >= -0.1f)
{
TestAngle += 0.1f;
if (TestAngle >= 360.f) TestAngle = TestAngle - 360.f;
}
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, Value);

   워프식

FVector NewLocation = FVector(0, 0, 100);
FVector Radius = FVector(10000, 0, 0);

if(AngleAxis_P == true)
AngleAxis+=0.1f;

if(AngleAxis_M == true)
AngleAxis-= 0.1f;

if (AngleAxis > 360.f)
AngleAxis = 0.1f;

if(AngleAxis < 0.f)
AngleAxis = 359.9f;

FVector RotateValue = Radius.RotateAngleAxis(AngleAxis, FVector(0, 0, 1));

NewLocation.X += RotateValue.X;
NewLocation.Y += RotateValue.Y;
NewLocation.Z = this->GetActorLocation().Z;

SetActorLocation(NewLocation);

   이 방법외에도 다른 방법이 존재할것이 분명하나 나는 일단 모른다. 검색해도 안나온다.

   요 2일간 도달한 결과이고 나는 이 둘중 워프식을 선택했다.

   제목 처럼 검색했을때 내가 원하는 결과가 나오지 않아 이 글을 작성한다.

 

 

 

 

 

 

 

 

사설

 정말 매우 간단하게 게임을 하나 만들려고 했다. 꽉 막혀서 인공지능이나 공부하려던 그 날 당일 매우 좋은 아이디어가 나와서 작업을 하다가 그 아이디어가 내 세계관을 모든 막힌 혈을 풀어서 세계관 설정하다가 결과물을 급히 보여야 하는 일이 생겨서 매우 간단한 게임을 하나 만들려고 했는데...

 

 맵을 루프할 필요가 있었다.

 그래서 맵을 앞뒤로 복사해서 끝에서 끝으로 워프시키는 방법으로 루프 할지 원형의 맵을 만들어서 빙글 빙글 돌려서 루프할지 잠시 고민하다가 언리얼에서 복사 붙여넣는 방법이 잘 상상이 되지 않아 원형 맵을 도는쪽이 쉬울것이라 판단했다. 그래서 작업을 시작했는데...

 내 생각하고는 상당히 다른 코딩이 되었다.

 유니티때 작업했던것과 너무나 달라서 굉장히 피곤하다. math함수를 왜 먹히지 않은건지 모르겠다.

 

 

 

 워프식과 이동식에는 충돌 판전에 있어서 큰 차이점이 있다.

 워프식은 사물을 관통한다. 0.1단위로 세밀하게 나누면 충돌은 하나 충돌하는 물체가 고정이라면 해당 물체 위로 올라간다.

 이동식은 충돌을 자연스럽게 하나 충돌하는 시간으로 이동이 지연이되면 본래의 코스를 이탈한다.

 

 시작은 워프식으로 시작했다. 사실 검색했을때 나온정보는 워프식 밖에 없었다. 이동식은 내 나름대로 코드를 숙지해서 작성한것이다. 워프식으로 했을때 발생하는 충돌의 문제를 해결하기 위해서 각 사물의 충돌 판전을 세분화하고 그 결과를 달리 하려고 했는데 이동식으로 하면 그럴 필요 없지 않나 싶어서 시도해보기로 했다. 결과는 이동식 또한 보정해야 하는 요소가 많았기 때문에 어느쪽으로 하든 번거롭고 조건을 부여하는 것 만으로 해결이 되는 워프식이 더 낮은 레벨의 기술을 요하기 때문에 괜한 고생만 한것이 되었다.

 

 혹시나 필요한 사람이 있을까봐 설명하겠다.

이동식

c++로 게임을 생성하면 캐릭터cpp에 다음 같은 함수명이 보일것이다.

void AAvoidPoopBRCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
PlayerInputComponent->BindAxis("MoveRight", this, &AAvoidPoopBRCharacter::MoveRight);
PlayerInputComponent->BindTouch(IE_Pressed, this, &AAvoidPoopBRCharacter::TouchStarted);
PlayerInputComponent->BindTouch(IE_Released, this, &AAvoidPoopBRCharacter::TouchStopped);
}

// 빨간 부분이 코드의 함수와 이름이 같다는 것 그리고 이 함수의 이름이 편집->프로젝트 세팅->입력에 가면 바인딩 항목에 동일하게 적혀 있다는 것을 확인했다. float Value는 바인딩에 설정된 값이 넘어 오는 것이라 생각된다.
void AAvoidPoopBRCharacter::MoveRight(float Value)
{
if ((Controller != nullptr) && (Value != 0.0f))
{
const FRotator Rotation = Controller->GetControlRotation();

//캐릭터가 어떤 방향에서도 전진하기에 나는 정면을 정하는 값이 있을거라 생각했고 딱 보기에 이거였다.
const FRotator YawRotation(0, TestAngle, 0);

//정면의 각도 방향을 키가 입력하는 동안 지속적으로 변화를 주면 캐릭터는 당연히 한바퀴 돌게된다.
if (Value <= 0.1f)
{
TestAngle -= 0.1f;
if (TestAngle <= 0.f) TestAngle = TestAngle + 360.f;
}
if(Value >= -0.1f)
{
TestAngle += 0.1f;
if (TestAngle >= 360.f) TestAngle = TestAngle - 360.f;
}

//각도에 따른 이동값을 계산하고 캐릭터에게 적용하는 것이 아래 두줄이라고 보면된다. 자세히는 안알아봤다.
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, Value);
}
}

 나는 엔진에서 캐릭터가 이동 중이다라고 인식 할 수 있는 조건이 정확하게 무엇인지 모르는에 이동 중이라 인식되고 있는 부분의 코드를 수정해서 그에 편승했다. 그러니 이것은 이동 중인 캐릭터 상태를 가지고 있을 것이고 이동식이라 표현했다.

 충돌 결과도 앞서 적은 이동식과 동일하다.

 

 

 

워프식

왼쪽을 입력했을때 P가 true 오른쪽으로 입력했을때 M이 true가 된다. 이 값은 블루 프린터로 작성했다.

tick이벤트이니 시간 간격에 따라 작동하고 언리얼에서 지원하는 이동 기능이 남아 있어도 작동에는 문제 없으나 나는 삭제했다. 이 경우 이동 관련 애니메이션의 작동을 직접 설정 할 필요가 있다... 매우 후회가 되는 부분이다...

void AAPBR_Character::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);

//캐릭터가 중심으로 하는 좌표 0,0,100에서 x거리 10000만큼 떨어진 위치에서 빙글빙글 돈다.
FVector NewLocation = FVector(0, 0, 100);
FVector Radius = FVector(10000, 0, 0);

//각도가 변하는 속도가 곧 이동 속도이다.
if(AngleAxis_P == true)
AngleAxis+=0.1f;

if(AngleAxis_M == true)
AngleAxis-= 0.1f;

if (AngleAxis > 360.f)
AngleAxis = 0.1f;

if(AngleAxis < 0.f)
AngleAxis = 359.9f;

FVector RotateValue = Radius.RotateAngleAxis(AngleAxis, FVector(0, 0, 1));

NewLocation.X += RotateValue.X;
NewLocation.Y += RotateValue.Y;
//Z값이 이렇게 하지 않으면 점프를 뛸 수 없다. XY와 동일한 방식으로 하면 높이가 고정되기 때문이다.
NewLocation.Z = this->GetActorLocation().Z;

//add가 아니기 때문에 워프이다. add하고 싶었지만 그 기능을 하는 함수를 찾지 못했다. 또 해당 기능의 함수를 찾는 다 한들 새로운 방법의 이동식이 될 뿐이고 내가 해결해야 하는 문제를 여전하기 때문에 더 알아볼 필요가 없었다.
SetActorLocation(NewLocation);
}

 

 

키 입력 없이 하는 방법은 각도 값의 증가를 조건 없이 하면 된다. 아래 영상 처럼말이다.

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

 

카메라가 각도에 따라 캐릭터를 바라보는 블루 프린트이다.

 조건과 환경에 따라서 메시의 상대적 회전 콤바인은 없어도 된다.

 

 키 입력은 블루 프린트이다.

누르고 있을 때만 true이며 누르고 있을 때만 이동한다.

 

 캐릭터 블루 프린트 전체 모습니다.

 

 

 

 

728x90
728x90
AND

ARTICLE CATEGORY

전체 카테고리 (941)
게임 개발 (10)
기획 파트 (23)
그래픽파트 (73)
思-네트워크 (112)
프로그래밍 (74)
2020 ~ 24 잡탕 (393)
2010 ~ 19 잡탕 (197)
만화 연재 (14)
소설 연재 (12)
기타 연재 (0)
네오스 VR (18)
그란 카 리버리 (15)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ARCHIVE