void Rotation()
{
if (rotPos.Length == 0) return;
rot++;
if (rot > ROTATION.ROT270) rot = ROTATION.ROT0;
block.localPosition = rotPos[(int)rot % 2];
block.localRotation = Quaternion.Euler(0, 0, int.Parse(rot.ToString().Substring(3)));
}
설정한 rotPos 값 element 0 (0,0)/ element 1 (0,-1.9)
이런 함수로 테트리스의 회전을 구현했는데 두번째 회전까지는 위치 보정이 잘 되다가 나머지 때 보정이 이상하게 되네요
al6uiz
February 12, 2025, 12:51am
3
void Rotation()
{
if (rotPos.Length == 0) return;
rot++;
if (rot > ROTATION.ROT270) rot = ROTATION.ROT0;
block.localPosition = rotPos[(int)rot % 2];
block.localRotation = Quaternion.Euler(0, 0, int.Parse(rot.ToString().Substring(3)));
}
GPT의 답변
문제의 원인은 다음과 같습니다:
rotPos[(int)rot % 2]
에러
rot
는 ROTATION
이라는 Enum 값이며, 이를 int
로 변환한 후 % 2
를 사용하여 rotPos
배열에서 위치 보정을 하고 있습니다.
ROTATION
이 ROT0, ROT90, ROT180, ROT270
네 가지 상태를 가진다고 가정하면, 내부적으로 값이 0, 1, 2, 3일 가능성이 높습니다.
% 2
연산을 하면 결과는 0, 1, 0, 1
이 반복되며, rotPos[0]
또는 rotPos[1]
를 참조하게 됩니다.
문제 발생 지점
rotPos[(int)rot % 2]
에서 rotPos
의 요소는 (0,0)
, (0,-1.9)
두 개뿐입니다.
그러나 테트리스 블록의 회전은 보통 4개의 상태(0, 90, 180, 270도)를 가집니다.
rotPos[(int)rot % 2]
는 0도와 180도에서 같은 값(rotPos[0]
), 90도와 270도에서 같은 값(rotPos[1]
)을 사용하게 됩니다.
즉, 180도와 270도 회전 시, 위치 보정이 올바르지 않을 수 있습니다.
올바른 위치 보정을 위한 수정
void Rotation()
{
if (rotPos.Length < 4) return; // 회전 배열의 요소를 4개 이상으로 보장
rot++;
if (rot > ROTATION.ROT270) rot = ROTATION.ROT0;
block.localPosition = rotPos[(int)rot]; // 0, 1, 2, 3을 올바르게 참조
block.localRotation = Quaternion.Euler(0, 0, int.Parse(rot.ToString().Substring(3)));
}
해결 방법
rotPos
배열을 4개(0, 90, 180, 270도)로 설정해야 합니다.
rotPos = new Vector2[] {
new Vector2(0, 0), // 0도
new Vector2(0, -1.9), // 90도
new Vector2(1.9, 0), // 180도 (예시 값)
new Vector2(0, 1.9) // 270도 (예시 값)
};
rotPos[(int)rot]
로 참조하여 올바른 위치 보정이 되도록 수정합니다.
이제 블록이 4방향 모두에서 정확하게 회전할 것입니다!
1 Like
열거문의 ROT문자열을 자르고 남는 문자를 숫자로 반환해서 z값으로 활용을 한다
라고 강의에서 알려줬는데 이해를 못하겠어요…
tkm
February 12, 2025, 3:18am
6
아하… 참고로 열거형의 문자열 작업은 매우 느린 작업이므로 가능하면 사용하지 않는게 좋아요
ariel
February 12, 2025, 10:32am
7
안녕하세요!
보여주신 코드만으로 해결방법을 특정하기는 어렵습니다만, 아래가 원인인지 체크해보시면 좋을 것 같습니다.
회전 오브젝트의 피벗이 잘못되었다
transform의 rotation을 직접 조작하고 있다면 회전 오브젝트의 중심축이 잘못 위치하지는 않았는지 확인해보세요. 이 이미지 가 도움이 될 것 같습니다.
회전 시에 테트리미노의 position을 움직일 필요가 없다
제가 강의 내용을 알지는 못하지만, 테트리미노 회전 시 임의로 position을 움직일 필요가 없을 겁니다…? 무언가 잘못되지는 않았는지 확인해보시면 좋을 것 같습니다. 위치를 조정함으로써 되려 어긋나는 것일 수도 있습니다.