예지의 개발 로그포스 (Yeji's Log Force)

Unity로 게임 개발하기 #3 본문

[Unity] Projects & Study/Simple Platformer Game

Unity로 게임 개발하기 #3

Yeji Heo 2021. 8. 20. 19:23

배경 추가하기


밋밋한 게임에 BackGround를 추가해보자.
opengameart.org 사이트에 들어가면 합법적으로 게임과 관련한 이미지들을 사용이 가능하다.
이곳에서 적당한 배경을 다운받아, 유니티 프로젝트 내의 BackGround폴더에 넣어주었다.



이 이미지를 Hierachy에 끌어서 Scene에 띄울것이다. 
Hierachy에서는 MainCamera안쪽에 배경화면을 넣어주자.
player안에 MainCamera를 넣어 카메라가 player를 따라가게 한 것처럼,
MainCamera안에 BackGround를 넣어 배경이 camera를 따라가게 할 것이다.


depth 조절


배경크기는 Scale조정을 통해 적절히 맞춰주면 된다. 
그런데 BackGround임에도 아래와 같이 그림이 다른 오브젝트를 가리고 있다.



이럴 땐 Sprite Renderer -> Additional Settings -> Order in Layer를 조절해주면 된다.
Order in Layer는 처음에는 모두 0으로 설정되어 있다. 
숫자가 커질수록 앞에 나온다고 생각하면 된다. 
그러므로 BackGround의 Order in Layer를 -1로 설정하여 맨 뒤로 보내주겠다.


밋밋해서 산도 넣어줘 봤다.

 



적을 공격하기(GetComponent이용)


player의 다중 점프를 막기 위해 땅바닥에 발이 붙어 있을 때만 점프 가능하도록 설정했었다.
이는 발쪽에 작은 Box Collider를 추가하여 tag를 사용, 땅과의 충돌을 감지하였다.


이 작은 Collider가 적과 부딪힌다면 공격을 한 것으로 간주하도록 코드를 작성해보자.
기존에 땅과의 충돌을 감지했던 코드 아래쪽에 else if를 통해 조건을 추가한다.


충돌을 감지하면 적이 데미지를 입는 효과를 추가해야 한다.
그런데 적을 다루는 스크립트는 이 스크립트가 아니다. 
이 스크립트에서 적에 대한 정보를 담은 스크립트를 다루려면 GetComponent를 사용한다.
(그 스크립트는 enemy의 component이므로)


EnemySaurus타입의 enemy를 선언하여 가져온 컴포넌트(GetComponent)를 담아준다.
+팁: 커서를 class name에 올린 상태에서 F12를 누르면 그 class로 바로 이동함~.~

이제 enemy가 공격당하면 어떻게 될 지 처리하는 부분을 작성하겠다.
F12를 통해 EnemySaurus스크립트로 이동하고, OnDamage()라는 함수를 만들어 처리한다.

위와 같이 Inspector로 직접 끌어다가 연결하지 않고, BoxCollider변수에 GetComponent를 사용해 연결해줄 수도 있다.
다른 클래스에서 이 함수를 자유롭게 호출해서 쓰도록 접근제한자를 public으로 선언!

 



추가 작업


⦁ 적을 밟았을 때 player가 살짝 점프하는 효과

Enemy와 충돌 시 rigid.AddForce 사용하여 점프하도록 코드 추가 함.


⦁ 적이 죽은 후에는 움직이지 못하게

Player와 충돌 시 isDead = true로 설정하여 return해버리게 수정



 ⦁ 적이 공격 받으면 살짝 놀란…(점프)효과



Game Manager만들기 (Singleton사용하기)


룰을 추가하기 위해 싱글톤 기법(패턴)을 사용해보자!
싱글톤(Singleton)이란 SW design Pattern으로서 

게임 개발에서는‘하나의 자원’을 게임 전체에서 공유하도록 하는 방식이다.


가령, 게임에서 활용되는 점수 등이 여러 곳에서 관리되면 상당히 혼란스러운 상황이 벌어진다. 
그러므로 싱글톤을 통해 게임 어디에서나 접근가능한 단 ‘1개’의 클래스를 만들어 사용한다.

⦁ Empty Object를 하나 생성하고 GameManager라는 Script를 Add



⦁ 코드 작성
Static을 사용하여 간단하게 구현하였다.

게임을 시작하면 GameManager I에 자기 자신을 넣어주는 코드.

+ Awake()는 Start()보다 먼저 진행된다. 

그러면 다른 스크립트에서도 아래와 같이 간단히 사용 가능!



게임 오버


Player가 Damage를 입으면 게임이 끝나고, 재도전을 하도록 해보자.
실행중이던 Scene이 게임오버되면 다시 그대로 그 Scene을 불러올 것이다.
Scene을 Load하기 위해 ‘using UnityEngine.SceneManagement’를 선언해준 후에 작성한다.

싱글톤 부분

 

이후 Character Damage클래스에서 GameOver()를 호출한다.

+ Invoke
Player가 적에게 부딪히면 2초 뒤에 Scene을 Load하도록 하고 싶다.
그래서 시간 지연을 위해 Invoke를 사용해주었다.
 


여기까지 싱글톤을 사용해 보았다. 다만 싱글톤은 양날의 검과 같아서, 

아주 편리한 기능이긴하지만 온갖 곳에서 접근가능하다는 위험성이 있다.

 유의해서 사용하자!


BGM 추가하기


게임에서 정말 중요한 요소인 Sound! 
나는 게임 배경을 다운받았던 사이트의
https://opengameart.org/content/platformer-game-music-pack
에서 마음에 드는 음악을 다운받아 사용하였다.
음악을 다운받으면 Asset폴더에 Music폴더를 생성하여 넣어주고, 오브젝트를 생성한다.


이제 이 사운드를 재생하려면 스피커가 필요하다.
Unity에서는 스피커 역할을 해주는 컴포넌트가 있다.
→ Audio Source 컴포넌트.


이를 BGM의 컴포넌트로 추가하고, 몇 가지 설정을 해준다.


1. AudioClip은 어떤 음악을 재생시킬지를 의미한다.
아까 다운받은 음악을 Drag&Drop해 넣어준다.

2. Play On Awake라는 항목이 보인다.
이는 이 게임오브젝트가 켜지면 Play를 시킬 것이냐는 항목인데,
BGM이므로 당연히 나는 그렇게 할 것이다. 그래서 체크박스에 체크를 해준다.

3. Loop는 말 그대로 음악이 끝나면 다시 재생을 할 것이냐는 항목이다.
여기에도 나는 체크를 해 주겠다.
 


효과음 추가하기

 

BGM만큼이나 게임에 재미를 살려주는 효과음을 추가해보자!

공격할 때 출력할 효과음을
https://opengameart.org/content/funny-comic-cartoon-bounce-sound
여기에서 다운로드 해 BGM과 같은 Music폴더에 넣어주었다.

이후 공격부분이 작성된 스크립트로 이동, 아래와 같이 오디오 관련 변수를 선언하였다.


공격 부분의 코드 내부에 아래와 같이 clip을 대입해주고 Play시켰다.
효과음의 종류가 1개가 아닐 수 있으므로 그때그때 clip을 대입해 줄 수 있도록
아래와 같이 코드를 작성 하였다.


 이제 BGM과 마찬가지로player의 prefab으로 가서 Audio Source컴포넌트를 추가한다.
효과음은 특정 조건(공격 시)에 따라 출력되니 Play On Awake와 Loop는 체크해제한다.


마지막으로 스크립트 컴포넌트에 player prefab과 clip(원하는 효과음)을 할당해주면 된다.

 


#게임을 풍성하게

게임을 더 풍성하게 하기 위하여 Coin(점수코인)을 추가하였다.


Prefab을 Scene에 띄워주고, 점수는 GameManager에서 관리하도록 하였다.


player와 충돌을 감지하여 코인별 점수를 더해주는 방식으로 구현하였다.


 

 








Comments