본문 바로가기
회사 TIL

[TIL] 23.01.05 / 3 x 3 보정 완료, 왜 못했는지 생각하기2

by imagineer_jinny 2023. 1. 5.

TIL (Today I Learned)

 

오늘 해야할 것

  • 3 x 3 퍼즐 구현

 

오늘 한 것

  • 퍼즐 보정 작업

1. 손을 뗐을 때 퍼즐의 위치를 받아온다.

2. 퍼즐의 위치를 확인한다.

3. for문을 돌며 퍼즐의 위치와 가장 가까운 x,y 좌표를 확인한다.

- Sqrt 써서 점과 점 사이의 거리 구해주기

4. 가장 가까운 x,y 좌표로 puzzle의 위치를 보정해준다. 

 

 

  • 퍼즐 보정 작업 2  

1. 이미 퍼즐을 상/하/좌/우로 움직이는 상태이면 다른 방향으로 못가게 막아줘야 한다.

- 예를 들어 '하'로 움직이는 도중에 '우'로 갈 수 없다.

 

- 상/하/좌/우 상태를 만든다.

- 버튼이 최초로 상/하/좌/우로 움직일 때 상태를 변화시켜주고

- 상태에 따라서 움직일 수 있는 방향이 고정된다. 

- 버튼에서 손을 떼기 전에는 상태가 바뀌면 안된다.

- 버튼을 손에서 뗐을 때 상태를 리셋해준다.

 

 

오늘 배운 것

  • 왜 못했는지 생각하기

- 글로 구현할 것을 써놓고 그대로 구현하면 되는데 그렇게 하지 못했다.

- 글로 구현한 후 그림을 그려야겠다는 생각에 그림만 의미없이 많이 그린 이유도 있다.

그림을 그리는 이유는 명확히 구현할 것을 이해하기 위함인데 이미 글로 이해를 했는데 그림을 굳이 다시 그릴 필요가 있는지 잘 생각해보자.

- 기존에 되는 코드 상태에서 고치고 싶으면 코드를 전체적으로 이해한 뒤 생각해보는 것은 좋지만 나는 코드 일부분도 제대로 이해하지 못하고 되는 것에 집착하느라 되는 코드의 앞, 뒤만 바꿔보는 시도를 했다.  -> 최악

- 글로 쓴 코드를 토대로 구현하고 기능을 못하는 코드는 주석처리 하자!

- 글이랑 코드랑 연결이 잘 안된다.

예를 들어 버튼이 상하/좌우로 움직일 때 상태를 변화시켜준다 -> 버튼이 상하/좌우로 움직이는걸 어떻게 표현하지?에서 막혔다. 

상하/좌우 움직인다 => dir를 어떻게 해줘야하나? => dir이 뭐지? => 로그를 찍어보자 => 로그 값으로 잘 모르겠다 => 벡터는 크기와 방향을 가지는데 dir x, y, z 좌표는 각각 뭘 가지고 있지? => 방향은 뭘로 표현하지? => 모르겠다!

  

 

  • 오늘 어려웠던 것

- dir의 늪에 빠져 있을 때 설명을 듣고 이해했다.

- 우선 사전 작업으로 해줘야 할 것은 너무나 당연하지만 잘 안하는 코드를 완전히 이해하는 것.

그렇겠지, 대충 이거겠지가 아니라 왜 이렇게 되는지, dir을 직접 그려볼 생각을 안했다는 것은 깊이 반성해야 한다. 

 

 

void AR1Level1SlidingPuzzle::MovePuzzle()
{
	if (_interact == false)
		return;


	FVector fingerPos = _fingerSocketRef->GetComponentLocation();
	FVector fingerPrevPos = _fingerPrevPos - _puzzle1->GetComponentLocation();
	FVector fingerCurPos = fingerPos - _puzzle1->GetComponentLocation();

	dir = fingerCurPos - fingerPrevPos;
	

	FVector up = GetActorUpVector();

	dir = UKismetMathLibrary::ProjectVectorOnToPlane(dir, up);

	//World -> Local
	dir = _puzzle1->GetComponentTransform().InverseTransformVector(dir); 

	if (GetPuzzleMoveDir() == EPuzzleMoveDir::Default && !_isFirstTouch) 
	{
		if (UKismetMathLibrary::Abs(dir.X) > UKismetMathLibrary::Abs(dir.Y))
		{
			SetPuzzleMoveDir(EPuzzleMoveDir::MoveSide);
		}
		else
		{
			SetPuzzleMoveDir(EPuzzleMoveDir::MoveUpDown);
		}
	}

	if (GetPuzzleMoveDir()==EPuzzleMoveDir::MoveUpDown)
	{
		dir.X = 0;
	}
	else if (GetPuzzleMoveDir() == EPuzzleMoveDir::MoveSide)
	{
		dir.Y = 0;
	}


	_puzzle1->AddLocalOffset(dir);
	
	// 손 위치 갱신	
	_fingerPrevPos = fingerPos;

	_isFirstTouch = false;
}

 

 - 복잡한게 있다고 생각하지 말고 일단 글로 쓴 대로 코드에 그대로 옮겨보는 시도를 해보자.

 

  •  int, double 최댓값
short: 32767 or 0x7fff
int: 2147483647 or 0x7fffffff
streamsize: 9223372036854775807 or 0x7fffffffffffffff
size_t: 18446744073709551615 or 0xffffffffffffffff
float: 3.40282e+38 or 0x1.fffffep+127
double: 1.79769e+308 or 0x1.fffffffffffffp+1023

 

 

내일 진행할 것

  • 3 x 3 구현 마무리....!

 

앞으로 진행할 것

  • 유데미 언리얼 강의 듣기
  • UE5 블루프린트 강의 듣기
  • R1 Project 커리큘럼 - 유데미 강의 들으면서 러프하게 짜기
  • Static Mesh / Skeletal Mesh(애니메이션을 위한) 찾아보기
  • Texture / Material(상위개념)  찾아보기
  • Pico 빌드
  • 서랍, 문 등 다시 잡을 때 손잡이가 앞으로 확 오는 문제 처리하기
  • 롤 하기
  • Gimmick 가이드 완성하기(for 인프런)

 

댓글