Unity Chapter 4-3. 소코반 게임 만들기 : 레벨 디자인

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 4. 소코반 게임 만들기 : 레벨 디자인

  • 맵을 제작해 봅시다 👀

벽 만들기

image

  1. Hierarchy - 3D Object - Cube 오브젝트 만들기. 이 큐브를 벽으로 만들어 볼 것이다.
    • “Horizontal Wall” 큐브
    • “Vertical Wall” 큐브
    • 이렇게 2개의 큐브로 각각 가로 세로 벽을 만들 것이다.
  2. 씬 기즈모의 정중앙 큐브를 한번 눌러 원근감 없는 2D 시점처럼 만들자.
  3. Transform 컴포넌트의 scale을 값을
    • “Horizontal Wall” 큐브의 경우 x = 5 로 바꿔 가로 길이를 늘려주고
    • “Vertical Wall” 큐브의 경우 z = 5로 바꿔 세로 길이를 늘려준다.
  4. 벽 배치
    • 보기 편하게 씬 기즈모의 y방향 원뿔 눌러주기
    • 위에서 아래로 보아 편하게 벽을 배치할 수 있도록. - ✨Ctrl키를 누른 상태에서 오브젝트를 옮기면 1단위로 평행이동 시킬 수 있다.✨
    • 오브젝트의 위치는 오브젝트의 정 중앙을 기준으로 하기 때문에 1단위로 벽을 이동시켜도 벽이 바닥(plane)을 0.5만큼 튀어나오게 된다.
      • 알아서 Transform 컴포넌트에서 위치 조절하기! plane을 벗어나지 않도록.
  5. 아무튼 큐브들 scale값, position값 다양하게 해서 벽을 만들어 보자.
  • 플레이어 오브젝트(공)이 벽을 뚫지 못하는 이유
    • Collider라는 디폴트 컴포넌트가 붙어 있어 충돌을 처리해주기 때문에.


오브젝트도 부모, 자식으로 묶을 수 있다.

image

지저분하게 많은 이 벽 오브젝트들을 “Layer”라는 이름의 빈 오브젝트를 만들어 자식으로 전부 드래그 하여 넣어주었다.


플레이어가 밀어 줄 박스들을 만들자.

  1. 큐브 오브젝트를 만들어준다.
  2. 이름을 ItemBox로 지정한다.
  3. 위치를 바꿔준다.
  4. Material을 적용해 색깔을 입혀준다.
  5. Rigidbody 컴포넌트를 붙여준다.
    • 플레이어와 충돌시 밀리게끔 만들어야 한다.
    • 4번까지의 상태에서 플레이를 누르면 플레이어(공)으로 ItemBox 큐브 오브젝트를 밀 수 없다. 즉 그냥 벽처럼 처리 된 것.
    • 왜냐하면 ItemBox는 현재 Rigidbody 컴포넌트가 붙어 있지 않아서 어떠한 물리 법칙도 적용되지 않기 때문에 - 이제 Rigidbody 컴포넌트를 붙여준 후 플레이 해보면 플레이어로 밀었을때 Itembox가 밀리는 것을 볼 수 있다.
  6. scale값은 x, y, z모두 0.9로 하였다
    • 1.0으로 하면 벽에 꽉껴서 안움직일 수 있어서


메인카메라 시점과 Clear Flag 변경

  • Main Camera
    • 현재 플레이어가 보게 될 화면.
    • 오브젝트이다.
      • 씬 창에서 위치를 바꿔 플레이어가 보게 될 시점을 변경할 수 있다.
    • 진짜 그냥 촬영하는 카메라라고 생각하면 됨.
    • 메인 카메라 오브젝트의 Transform 컴포넌트에서 position, rotation, scale 값을 조절해 플레이어가 볼 시점을 잘 만져보자.
    • 메인 카메라 오브젝트의 Camera 컴포넌트에서 Clear Flag값을 Solid Color로 변경해준다.
      • Clear Flag 값은 오브젝트가 아무것도 없는 빈 공간을 어떻게 채울 것인지를 설정하는 속성
        • 디폴트로 Skybox값으로 되어 있기 때문에 빈 공간은 하늘로 채워졌던 것!
        • solid color로 바꿔 빈 공간은 특정 색깔로 채워주도록 하자. 색깔도 바꿔주자.


Itembox가 회전을 하지 않게 하고 싶을 때

  • Player 오브젝트로 Itembox 오브젝트를 밀면 잘 밀리긴 밀리지만 Itembox의 대각선 방향으로 밀면 Itembox가 회전해 버린다.
    • Rigidbody가 붙어 있으니 물리 법칙이 적용되어 당연히 벌어지는 현상.
  • 밀리긴 밀리되 직선 방향으로만 밀리게 하고 회전하여 밀리게 하고 싶진 않을 때 어떻게 해야할까?
    • Itembox의 Inspector창에서 Rigidbody 컴포넌트에서 Constraints를 설정하면 된다.
      • Constraints
        • Free Position : 특정 방향으로 움직이지 않게끔 제약을 줌
          • x를 선택했다면 이제 x축 방향으로는 힘을 안 받음. 안 밀림.
        • Free Rotation : 특정 방향으로 회전하지 않게끔 제약을 줌
      • Itembox가 점프 하지 않도록 position.y를 freeze 시켰고 아예 회전하지 않도록 x,y,z 모두 freeze시켰다.
      • Player도 물리적인 힘을 받아 점프하지 않도록 position.y를 freeze 시킨다.


Prefab

  • Prefab
    • 재사용이 가능한
    • 파일로서 존재하는
    • 미리 만들어져 있는 오브젝트
  • Hierarchy에 있는 원하는 오브젝트를 드래그 해서 Project 창의 /Assets에 드롭 하면 해당 오브젝트를 Prefab 파일로 만들 수 있다.
  • 이제 Prefab으로 만들면 언제 어디서든 Hierarchy창으로 드래그앤 드롭하여 똑같은 오브젝트를 찍어낼 수 있다.
  • Prefab으로부터 찍어져서 탄생한 오브젝트들은 Hierarchy창에서 파란 글씨로 표시된다.
  • Itembox를 Prefab으로 만들어 3개 찍어내고 위치를 각각 잘 배치해주자.
  • Prefab으로 찍어낸 오브젝트의 어떤 사항을 변경한 후 Apply눌러주면 동일한 종류의 모든 Prefab에 모두 다 적용된다.
    • Inspector창 상단에 overrides를 누르면 Apply all이 나온다.


최종 목적 지점을 표시해주는 오브젝트를 만들자

Player오브젝트가 Itembox 하나를 최종 목적 지점까지 옮기면 1라운드 따는거고 3개 전부 다 옮기면 게임 승리 !

  • 최종 목점 지점을 나타낼 오브젝트를 만들어주자
    1. 큐브 오브젝트 생성
      • 이름은 EndPoint
    2. scale은 0.5 0.5 0.5로 절반 작게
    3. rotation은 60 60 60 으로 다이아몬드처럼 보이게
    4. Material을 만들어 색을 입히고
    5. 1~4까지 진행한 부분을 다시 Prefab으로 만들자.
    6. ✨ 좌표계는 Global로 해준다.
      • Local인 상태일 때 position을 다 원점으로 맞춘 후에 Global로 바꿔주자.
      • Local로 해두면 회전축이나 위치축이 자기 자신이 기준.
      • 그래서 회전 시키거나 하면 자신의 회전축을 기준으로 하기 때문에 맵을 벗어나 버릴 수도 있다. - Global로 해주어 기준을 게임 세상으로 해주자.
    7. Collider 컴포넌트의 Is Trigger을 체크해준다.
      • Collider는 오브젝트가 물리적인 표면을 갖게 해주며 <물리적으로 오브젝트끼리 표면에 충돌이 일어났을 때를 감지하고 이를 처리하는 컴포넌트다.
      • Is Trigger
      • 체크 해주면 ✨물리적인 표면은 없애고 여전히 충돌은 감지해준다
      • 즉 충돌이 일어나면 그 충돌은 감지하지만 물리적인 표면은 없어지기 때문에 뚫고 지나갈 수 있다. 충돌 처리가 없어져서.
        • 눈엔 보이진 않는 투명 오브젝트를 두고 Is Trigger를 활성화 시켜주면 여기를 지나가면(충돌하면) 건물이 무너지는 이벤트가 발생한다던지 이런식의 연출이 가능함 - 이제 ItemBox가 Endpoint를 뚫고 지나간다.

image


오늘의 고난

Itembox에 Rigidbody를 붙여주고 y축 위치를 freeze 시키면 아무리 Player로 Itembox를 밀어도 움직이지 않아서 당황했었다. 밀어도 움직이지 않았던 이유는 … Itembox y방향 위치가 음수여서 반은 plane 아래로 파묻힌 상태였기 때문이다. y를 freeze 시키지 않으면 Rigidbody의 물리 작용에 의해 게임 시작하자마자 plane을 바로 완전히 뚫고 나와 y = 0 위치가 되지만 내가 y를 freeze 시켜주었으니 y값을 움직일 수 없어 여전히 plane에 몸의 반이 파묻혀 있는 상태라 플레이어 오브젝트로 아무리 밀어도 Itembox가 움직이지 않았던 것이다 😰 간단하게 y축 위치를 0 으로 해주어 문제를 해결하였다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기