유니티로 테트리스 코딩을 하는데 문제가 생겼어요

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)

이런 함수로 테트리스의 회전을 구현했는데 두번째 회전까지는 위치 보정이 잘 되다가 나머지 때 보정이 이상하게 되네요

혹시 이렇게 코드 작성하신 이유가 있을까요?

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] 에러

  • rotROTATION이라는 Enum 값이며, 이를 int로 변환한 후 % 2를 사용하여 rotPos 배열에서 위치 보정을 하고 있습니다.
  • ROTATIONROT0, ROT90, ROT180, ROT270 네 가지 상태를 가진다고 가정하면, 내부적으로 값이 0, 1, 2, 3일 가능성이 높습니다.
  • % 2 연산을 하면 결과는 0, 1, 0, 1이 반복되며, rotPos[0] 또는 rotPos[1]를 참조하게 됩니다.

:pushpin: 문제 발생 지점

  • 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)));
}

해결 방법

  1. 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도 (예시 값)
};
  1. rotPos[(int)rot]로 참조하여 올바른 위치 보정이 되도록 수정합니다.

이제 블록이 4방향 모두에서 정확하게 회전할 것입니다! :rocket:

1 Like

열거문의 ROT문자열을 자르고 남는 문자를 숫자로 반환해서 z값으로 활용을 한다
라고 강의에서 알려줬는데 이해를 못하겠어요…

감사합니다 한번 시도해볼게요

아하… 참고로 열거형의 문자열 작업은 매우 느린 작업이므로 가능하면 사용하지 않는게 좋아요

안녕하세요!
보여주신 코드만으로 해결방법을 특정하기는 어렵습니다만, 아래가 원인인지 체크해보시면 좋을 것 같습니다.

  1. 회전 오브젝트의 피벗이 잘못되었다
    transform의 rotation을 직접 조작하고 있다면 회전 오브젝트의 중심축이 잘못 위치하지는 않았는지 확인해보세요. 이 이미지가 도움이 될 것 같습니다.
  2. 회전 시에 테트리미노의 position을 움직일 필요가 없다
    제가 강의 내용을 알지는 못하지만, 테트리미노 회전 시 임의로 position을 움직일 필요가 없을 겁니다…? 무언가 잘못되지는 않았는지 확인해보시면 좋을 것 같습니다. 위치를 조정함으로써 되려 어긋나는 것일 수도 있습니다.