TIL (Today I Learned)
오늘 해야할 것
- 3 x 3 퍼즐 구현
오늘 한 것
- 3 x 3 퍼즐 구현중
- 보정을 어떻게 해줄 것인가?
- 지금은 판의 범위 상관 없이 막 움직임
- 원하는 것은 격자 내에서만 움직이고 싶다.
- 네모 영역에 퍼즐이 들어오면 그 영역의 지정된 자리로 퍼즐이 붙는다.
필요한 것
- 네모 영역: 빨간네모칸
- 지정된 자리: 초록점
- 퍼즐이 들어왔는지 어떻게 판단?
현재 잡고 있는 퍼즐의 위치가 네모 영역에 들어오면 퍼즐의 위치를 초록점으로 옮겨준다.
- 네모 영역에 들어오는건 어떻게 판단?
dir과 puzzle의 plane vector를 내적한 값이 45도 이하 && 퍼즐의 중점이 어디에 있나?
퍼즐 중점이 2 영역에 들어오자마자 2로 가는것.
처음 시도 한 것
퍼즐의 중점과 영역의 중점과의 거리가 5랑 같거나 작으면 퍼즐의 중점이 영역의 중점으로 움직인다.
if (_puzzlePos.X > -4.7)
{
//여기서 다시 움직여준다.
_puzzlePos.X = 0.f;
_puzzlePos.Y = -5.f;
_puzzle1->SetRelativeLocation(_puzzlePos);
}
- 판의 각각의 중점 정보를 입력해주고 이걸 받아와서 자동 보정을 해주자.
TArray<TArray<FVector>> _boardCenterPosInfo
= {
{FVector(-9.6, -15.3,0),FVector(0, -15.3,0),FVector(9.6, -15.3,0)},
{FVector(-9.6, -5,0),FVector(0, -5,0),FVector(9.6, -5,0)},
{FVector(-9.6, 4.6,0),FVector(0, 4.6,0),FVector(9.6, 4.6,0)},
{FVector(-9.6, 14.3,0),FVector(0, 14.3,0),FVector(9.6, 14.3,0)}
};
if (_puzzlePos.X > -4.7)
{
//여기서 다시 움직여준다.
_puzzlePos = _boardCenterPosInfo[1][1];
_puzzle1->SetRelativeLocation(_puzzlePos);
}
1. 손을 뗐을 때 퍼즐의 위치를 받아온다.
2. 퍼즐의 위치를 확인한다.
3. for문을 돌며 퍼즐의 위치와 가장 가까운 x,y 좌표를 확인한다.
- Sqrt 써서 점과 점 사이의 거리 구해주기
4. 가장 가까운 x,y 좌표로 puzzle의 위치를 보정해준다.
오늘 배운 것
- 보정된 움직임 왜 못했는지 생각하기
- 이미 기능이 작동되는 코드는 의심하고 싶지도 않고 건드리고 싶지도 않았던 마음이 컸다.
- 그래서 기존 코드를 건드리지 않는 선에서 바꿔주려고 애쓰고 + 이미 잘 되는 코드는 왜 돌아가는지 자세히 생각하지 않은게 큰 원인이었다.
- 그리고 Local, World 좌표로 다 맞춰줘야 한다는 사실은 알겠는데 비교해주는 대상들끼리만 맞추면 되는거 아닌가? 라고 마음대로 생각해버렸다.
- 기존 코드에서는 dir에 AddWorldOffset을 해줬다.
나머지는 다 local 처리를 하는데 dir은 world라도 이상하다는 생각을 안했다. 이미 되는 코드가 있었으니까!
- 아예 안보더라도 차례대로 논리적으로 생각할 필요는 있었다.
- 움직이는게 이상하면 움직임을 주는 코드들을 더 살펴볼 필요가 있었는데 내가 짠 조건만 틀렸을 것이라고 생각했다.
- 1. AddWorldOffset과 AddLocalOffset, InverseTransformVector
InverseTransformVector: Do backward operation when inverse, translation -> rotation -> scale
설명은 저런데 월드->로컬좌표 변환에 쓰임
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 (UKismetMathLibrary::Abs(dir.X) > UKismetMathLibrary::Abs(dir.Y))
{
dir.Y = 0;
}
else
{
dir.X = 0;
}
_puzzle1->AddLocalOffset(dir);
내일 진행할 것
- 3 x 3 구현 마무리....!
앞으로 진행할 것
- 유데미 언리얼 강의 듣기
- UE5 블루프린트 강의 듣기
- R1 Project 커리큘럼 - 유데미 강의 들으면서 러프하게 짜기
- Static Mesh / Skeletal Mesh(애니메이션을 위한) 찾아보기
- Texture / Material(상위개념) 찾아보기
- Pico 빌드
- 서랍, 문 등 다시 잡을 때 손잡이가 앞으로 확 오는 문제 처리하기
'회사 TIL' 카테고리의 다른 글
[TIL] 23.01.06 / 언리얼 디버깅 사용 방법 (0) | 2023.01.08 |
---|---|
[TIL] 23.01.05 / 3 x 3 보정 완료, 왜 못했는지 생각하기2 (0) | 2023.01.05 |
[TIL] 23.01.03 / 3 x 3 prepos, pos (0) | 2023.01.04 |
[TIL] 23.01.02 / 3 x 3 퍼즐 시작 (0) | 2023.01.03 |
[TIL] 22.12.30 / 언리얼 빌드 Development vs Shipping, 단축키 ctrl + shift + r (0) | 2023.01.02 |
댓글