티스토리 뷰

목차

1. 큐브가 없으니 큐브를 먼저 만들자

  1.1 Unity로 1x1 큐브 만들기

    1.1.1 Cube에 Color 입히기

  1.2 Rotation 구현

  1.3 2x2 큐브로 확장

  1.4 Random Shuffle 구현

  1.5 3x3 큐브로 확장

 

2. 큐브가 있으니 강화학습으로 맞춰보자

 

-------------------------------------------------------------------

1.3 2x2 Cube로 확장하기

 

이번 포스팅에서는 1x1x1 Cube를 2x2x2 Cube로 확장하여 Rotation을 구현해보겠습니다.

 

이전 포스팅에서 우리는 하나의 Cube를 Rotation 시켜보았습니다. 영상을 참고하시거나 이전 포스팅을 보시면 될 것 같습니다.

OnebyOneRubiksPuzzle - SampleScene - PC, Mac & Linux Standalone - Unity 2019.3.6f1 Personal _DX11_ 2020-06-19 00-55-37.mp4
3.84MB

1.3.1 2x2 Cube 생성

그럼 오늘은 이 Cube를 확장시켜 2x2x2 Cube를 만들어 보겠습니다. 각각의 Cube의 중심점은 나중에 편의를 위해 원점을 대칭으로 만들어 주도록 하겠습니다. 아래 그림을 참고하시면 될 것 같습니다. 그러면 각 Cube의 중심 좌표는

(-0.5, -0.5, -0.5), (-0.5, -0.5, 0.5), (-0.5, 0.5, -0.5), (-0.5, 0.5, 0.5),

(0.5, -0.5, -0.5), (0.5, -0.5, 0.5), (0.5, 0.5, -0.5), (0.5, 0.5, 0.5) 가 됩니다. 원점 대칭으로 만들어 주는 이유는 나중에 Rotation 및 Cube 선택의 편의를 위해 그렇게 하였습니다.(뒤에 설명 나와요!)

2x2 Cube 원점

그러면 간단한 for문을 이용해서 2x2x2 Cube를 만들어보겠습니다!

이전 Code와 달라진 점은 MakeACube 함수에서 for문을 사용해서 Cube를 생성해 준 것과 CubeInit 함수에 count가 추가되어 각 Cube에 index 설정을 해주었습니다.

2x2x2 큐브 생성 Code

이 Code를 넣고 Button 이름도 2x2로 바꿔준 뒤 실행하면 아래 그림과 같이 2x2x2 Cube가 제대로 생성되는 것을 확인할 수 있습니다! (오늘 포스팅도 끝!!!)

실행 결과

1.3.2 전체 Rotation

근데 여기서 방향키를 눌러 Rotation을 시키면 당연히 안되는걸 확인할 수 있겠죠?

Rotation 실행 결과... Cube 하나 어디갔나

그래서 전체를 하나의 GameObject List로 묶어주고 전체를 한번에 Rotation 하는 Code로 수정해보겠습니다. 아래 Code와 같이 전체 Cube를 하나로 묶어주는 GameObject List를 추가하여 singleCube들을 Add 해주도록 하겠습니다.

single Cube를 List로 쌓기

그 다음 기존 Rotation Code를 아래와 같이 수정하여 UnionCube List 원소를 전부 돌면서 각 원소의 Child까지 모두 찾아 Rotation 해주도록 합니다. 이 때 우리는 원점을 기준으로 Cube를 만들어주었기에 Rotation 기준도 원점이 되고 축을 변경하지 않고 이전과 같이 두면 됩니다!

Rotation Code

이렇게 실행시키면 Rotation이 잘 되는 것을 확인하실 수 있습니다.

 

1.3.2 Line 선택 및 Line Rotation

 

다음은 Line 선택 및 선택한 Line만 Rotation 시켜보도록 하겠습니다.(드디어 큐브인척 할 수 있겠다!)

우리는 2x2 큐브를 만들고 있기 때문에 아래 그림과 같이 총 4개의 Line을 선택할 수 있습니다. 각자 편하신대로 Line 선택하는 Key를 설정해주시면 되는데 저는 QW를 세로축 AZ를 가로축 선택으로 정하였습니다.

Line 선택 Key 설정

이 다음에 키보드 입력에 따른 Line을 찾는 Code를 추가해줄텐데요! Line을 찾는 방법은 여러가지가 있겠지만, 저는 Cube가 전체 외형은 안변한다는 성질을 이용해서 singleCube의 CenterPosition을 활용하였습니다.

아래 Code를 보시면 모든 Cube중에 제가 원하는 Line의 Position을 가지는 Cube를 골라 LineCube에 넣어주었습니다.

Line 선택 Code

또한, lineSelectSign이라는 것도 추가해주었는데 이 변수는 나중에 세로 Line을 선택한 뒤에 가로로 회전하는 것을 방지해주기 위해 추가하였습니다. 상수선언은 Code 맨 위에 static class로 빼주어야 합니다.

방향 상수 설정
방향에 따른 예외처리

그리고 큐브가 돌고 있을 때 다른 입력이 들어와서 명령이 섞이면 이상하게 돌게됩니다. 그런 일을 방지하고자 runningFlag를 두어서 큐브가 회전을 하고 있을 때는 방향 및 Line선택이 불가능 하게 해줍니다.

runningFlag가 false일때만 키보드 입력으로 rotation 방향 및 Line 선택

rotation 방향이 정해졌을 때 2가지 경우로 나눠지는데 Line이 선택이 되어있다면 Line만 rotation 하게 되고, Line이 선택되어 있지 않다면 전체 Cube를 rotation 하게 됩니다. 아래 Code의 주석을 보시면 더 편하게 이해하실 수 있을겁니다.

전체 Update Code

중요한 Code는 다 짚어본 것 같고, 중간중간 빠진 Code가 있기 때문에 전체 Code를 올려드릴테니 보시면서 자신에게 맞는 Cube를 만들어보시면 될 것 같습니다!

TwobyTwoCube.cs
0.01MB

이 Code를 제대로 숙지하고 구현하시면 아래 영상과 같이 자유롭게 Cube를 돌리게 될 수 있습니다! 야호!

TwobyTwoRubiksCube.mp4
4.11MB

다음 포스팅에서는 Cube를 Random으로 섞는 기능을 구현해보겠습니다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함