Unity STUDY

[Unity 2D] 유니티 2D게임 각종 오브젝트 생성 및 움직임 구현

yongdiary 2025. 3. 20. 23:23

2D게임 만들기

오늘은 2D게임을 만들어볼 것이다. 일단 유니티 허브를 실행해준다.

실행 후 위의 이미지에 새 프로젝트를 클릭한다. 

 

그럼 다음과 같은 화면이 나온다.

 

여기서 Universal 2D를 클릭해 원하는 이름으로 프로젝트 생성 클릭 후 로딩을 기다린다.

 

로딩이 됐다면 다음과 같은화면이 나온다.

 

 

이게 유니티 기본화면이다. 간단하게 설명해주겠다.

 

위의 이미지에 빨간 박스는 Hierarchy(계층)창으로 오브젝트 확인,생성 및 제거 등을 할 수 있고 모든 오브젝트들을 계층구조로 볼 수 있는 곳이다. 

 

이번엔 Project 창이다. 이 창은 프로젝트에 관한 파일들이 들어있다.원하는 이미지나 색깔을 가져오거나 만들 수 있다. 3D 모델링 오브젝트, 이미지 파일, C# 파일, 사운드등 리소스할 수 있다.

 

하이브리드에 존재하는 걸 관찰하는 창이라고 생각하면 편할 것 같다.

 

맨 오른쪽에 있는 Inspecter(감시)은 오브젝트 좌표 모양, 색깔 등등  게임 오브젝트의 속성들을 여려가지 세부조정을 할 수 있는 창이다.

 

다음은 Scene View,Game View입니다. 위쪽창은 Scene View는 위쪽 빨간색 창으로 안에 있는 주황색 박스는 단축키 Q,W,E,R,T,Y를 사용해 바꿀 수 있으며 각종 도구들이니 꼭 알아놔야한다.

 

아래는 Game View로 개발 진행중인 게임을 미리 실행해볼 수 있는 창이다. 스마트폰 크기에 맞춰서 실행할 수도 있다. 가운데 상단의 주황색 박스로 시작하고 멈추기가 가능하다.

 

여기까지 알았다면 이제 기본적인 세팅을 시작할 것 이다.

 

 

   일단 프로젝트 뷰에서 Assets폴더에 위와 같은 폴더를 만들어둔다. 안해도되긴하지만 작업에 편의를 추가해준다.

 

그리고 개발에 사용할 이미지를 다운해준다 

나는 수업에서 제공해준 이미지를 사용하지만 

 

유니티 Asset Store 

 

Unity 에셋 스토어

게임 제작을 위한 베스트셀러 에셋을 만나 보세요. 다양한 2D/3D 모델, SDK, 템플릿, 툴로 구성된 유니티의 카탈로그를 활용하여 게임 개발의 속도를 높일 수 있습니다.

assetstore.unity.com

위의 주소로 가면 본인이 원하는 이미지들을 다운해 게임에 적용할 수 있다.  

 

이미지를 넣었다면 어떻게 오브젝트로 옮겨야할까? 간단하다.

프로젝트 뷰에 있는 파일을 Hierarchy(하이어라키)뷰에 넣으면 생성된다. 

 

car의 이미지가 Scene 뷰에 보이지만 지금은 그냥 이미지일 뿐이다. 이동을 시킬 수 있는 코드를 짜주자. 

 

Scripts  폴더 에 우클릭을 하고 위의 순서대로 누르면 된다.

 

그럼 C#이 보일텐데 여기서 이름을 Forever_MoveH로 변경 후 클릭하면 비쥬얼 스튜디오로 넘어간다.

 

비쥬얼 스튜디오를 실행했다면 다음 이미지와 같은 코드를 실행한다.

 

해석을 해보자면

 

내가 만든 클래스인 Forever_MoveH를 유니티에서 제공하는 클래스 MonoBehaviour을 상속시켜준다.

 

속도라는 변수를 생성하고 초기값을 1로 설정한다. public을 사용함으로써 Inspecter창에서 수정 가능하게 만든다.

 

FixedUpdate()는 유니티에서 제공하는 메서드이다. 정기적으로 호출된다.

 

this는 이 스크립트가 붙을 오브젝트를 말한다.

transform은 오브젝트의 위치,회전,크기를 다루는 컴포넌트이다.

Translate()는 오브젝트를 특정 방향으로 이동시키는 메서드이다.

speed/50은 x축으로 특정 속도값을 50으로 나눈만큼 이동시키라는 뜻이고 ,0,0 은 순서대로 y축 z축 방향으로 0 즉 이동시키지 말라는 뜻이다.

 

 

코드를 작성했다면 기존에 만들어둔 Car오브젝트에 드래그해 옮겨준다

 

그리고 상단의 시작버튼을 누르면

코드한대로 움직이는 모습을 볼 수 있다.

 

이렇게 코드를 사용해서 오브젝트를 움직여봤다. 그렇다면 유니티 함수 중엔 중요함수가 뭐가 있을까?

함수 이름 설명
Start() 처음에 호출, 변수 및 컴포넌트 등을 초기화 할 때 사용
Update() 계속.지속적으로 호출, 불규칙적인 호출, 키보드 정보만 처리
FixedUpadate() 일정 시간 마다 호출됨, 규칙적인 호출, 실제적인 물리적인 움직등을 처리
OnCollisionEnter2D()
OnTriggerEnter2D()
충돌하면 호출되는 함수(충돌되는 시점 호출: 충돌+물리적 피드백 발생)
충돌하면 호출되는 함수(충돌되는 시점 호출: 충돌만 체크), IsTrigger 속성 체
OnMouseDown() 마우스가 터치가 되면 호출됨
LastUpdate() 여러가지 그리기를 수행한 다음마지막에 호출되는 함수 

 

이렇게 다음과 같은 함수가 있다.

 

이중에서 반복되는 함수는 Update(),FixedUpdate() 함수가 존재한다.이 두개의 차이점을 알려주겠다.

 

  • Update()

- 이 함수는 1 프레임(1초에 60~80회정도 실시되는 애니메이션 1회 그리기)마다 계속 호출이 됨.

- 컴퓨터의 사양이나 그떄의 처리 속도에 따라 변화한다. 즉 일정하지 않다. 그래서 물리 효과가 적용되지 않은 오브젝트의 키 입력을 받을때나 사용된다.

- 이동, 애니메이션 ,입력 처리등에 사용된다.

 

  • FixedUpdate()

-  1초에 실행되는 횟수가 정해져 있다. 기본 값은 0.02초 간격으로 호출한다.

-  물리 효과가 적용된 오브젝트를 조정할 때 사용된다.

-  물리엔진 관련 업데이트는 반드시 이 함수에서 수행해야한다.

 

다시 돌아와서. 이번엔 수직 이동을 해볼 것이다. 일단 다시 스크립트 파일에 Forever_MoveV.cs를 생성한다.

생성했다면 위의 그림과 같은 코드를 작성한다。

 

기존과 같이 드래그 하고 car을 클릭하면 Inspector뷰인데 여기서 기존에 했던 H의 체크박스를 풀어주고 실행해본다.

 

그럼 위의 영상처럼 수직이동하는걸 확인할 수 있다. 

 

다음은 회전이다.

 

Images 폴더에서 이미지하나를 생성해준다. 나는 flower_1 이미지로 해보겠다. 

 

이미지를 생성한 후 스크립트 폴더에 Forever_Rotate.cs를 만들어 주고

다음과 같이 코딩한 후 꽃에 드래그해준다.

여기서 Rotate는 회전을 시키는 메서드이다. 

 

그리고 실행하면

 

위와 같은 영상이 나온다 내 car가 대각으로 가는 이유는 Move H와 Move V를 동시에 켜서 그렇다.

 

여기서 하나 알아야할 점이 있는데 유니티는 왼손 좌표계를 사용한다.

 

이게 뭐냐면

X축 : 시계방향

Y축 : 반시계방향

Z축 : 반시계방향

이란 뜻이다.

 

지금까지 지속되는 회전을 만들었다면 때때로도 만들어볼 것이다.

 

일단 아무런 이미지를 또 생성해준다. 나는 다른 모양의 차를 만들것이다.

 

그리고 Sometimes_Turn.cs를 만들어주고

다음과 같은 코드를 작성해준다. 

 

count가 maxcount와 같아지면 if를 실행한다. 그리고 count를 0으로 만들어서 초기화를 시켜준다.

 

!!! 참고로 코드 작성할때 오타 정말정말 주의해야한다. 글쓴이도 오타 하나 못 찾아서 30분동안 고생한적이 있다.. 웬만한 오류는 유니티에서도 확인할 수 있다.

이렇게 angle 에 e를 뺀 상태로 저장후 유니티에 가보면 

 

유니티 하단에 이미지와 같이 오류가 뜨고 더블클릭하면 자세히 볼 수 있으며 비쥬얼스튜디오로 넘어간다. 

 

다시 돌아와서. 다음과 같이 코드를 짜고 실행시키면

 

 

위의 이미지와 같이 실행되는 걸 볼 수 있다.

 

이번엔 때때로 반전이다. 스크립트 파일을 생성하고 Sometimes_Flip.cs를 만들어준다.

다음과 같이 코드를 짜준다.

위의 코드를 해석하면

private는 접근할 수 없는 선언이다. 즉 false를 다른 값으로 바꾸지 못한다. bool은 TrueFalse냐를 묻는 즉,참과 거짓 둘중에 하나만 가질 수 있는 데이터 타입이다.

flipFlag는 이미지를 뒤집을지 말지 결정하는 변수인데 기존값을 false로 두며 초기에는 뒤집지 않는다는 뜻이다.

 

flipFlag = !flipFlag;는 값을 반대로 바꾸는 것이다 즉, false를 true로 바꾼다.

 

GetComponent는 게임 오브젝트에 붙어 있는 컴포넌트를 가져오는 명령어이다.

SpriteRenderer은 이미지를 화면에 보여주는 컴포넌트이다.

flipXX축을 기준으로 반전 시킨다는뜻이다. 

 

그리고 초록색차에 기존 때때로 회전을 뺴고 반전을 넣어주면

 

위의 영상과 같은 반전이 나온다.

 

 

오늘은 이렇게 기본적인 유니티 코딩을 해봤다. 처음해봐서 그런지 재미도 있고 게임의 구조를 점점 알아가기도한다. 정말 감탄했던건 디테일을 챙기는 게임들은 사소한거 하나하나 코딩으로 만들텐데 얼마나 대단한지 새삼 느끼게되는 공부였다. 앞으로 또 공부한걸 올리고, 내가 막혔던 부분 설명이 필요한 부분은 최대한 하면서 글을 써보겠다.