Notice
Recent Posts
«   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
Tags more
관리 메뉴

MyWorld

[Unity : C#] 슈팅 게임 기획 및 개발 본문

Unity 유니티 컨텐츠 개발

[Unity : C#] 슈팅 게임 기획 및 개발

vBest 2021. 11. 13. 16:50

unity를 처음 배우고 슈팅 게임을 제작해 보았다. 

외계인이 침공해서 막다는 내용으로 기획했다.

 

프로젝트 zip파일 다운

https://drive.google.com/file/d/1TyXD0p1F_TyDPG3_gP3MUXDV9thDBNeU/view?usp=sharing 

 

ShootingFlight.zip

 

drive.google.com

 

#1 컨셉 소개

지구를 위협하는 외계인이 화성에 출현함으로 인해 인간이 선제공격을 한다는 컨셉의 슈팅 게임을 만들고자 했습니다.게임에서 외계인 군단이 플레이어 방향으로 계속 생성되어 다가오면 플레이어가 마우스로 위치를 조준하여 스페이스 바를 누르는 입력을 통해 미사일을 발사하는 기능을 구현하고자 했습니다. 그리 고 외계인을 50번 격퇴하면 승리하고 50번 격퇴하기 전에 플레이어의 HP 0이 되면 패하는 게 임을 만들고자 했습니다. 그리고 terrain 3D 공간에 깔고 모래 질감을 칠해서 전투 배경이 화성 같은 느낌을 주고자 했습니다.그리고 카메라의 빛 색도 조금 바꿔서 우주 같은 느낌을 연출했습니다. terrain 위쪽으로 하 늘이 보이는 부분에는 큐브에 우주 이미지를 입히고 파노라마적으로 보이게 변형했습니다. 게임의 진행 순서는 다음과 같습니다. 첫 씬에서는 타이틀이 보이고 스토리를 볼 수 있는 스토리 모드와 바로 게임을 즐길 수 있는 아케이드 모드 버튼을 만들어주었습니다. 만약 스토리 모드를 택 한다면 차례로 스토리를 알려주는 씬, 게임 수행 매뉴얼을 알려주는 씬이 차례로 나오며 그 뒤에 나오는 스타트 씬의 스타트를 누르면 게임이 실행되도록 했습니다. 게임의 승패 결과에 따라 다른 결과 씬이 나오도록 했고 결과 씬에 게임 종료 버튼 그리고 다시 게임을 실행시키는 다시 시도하 버튼을 만들었습니다.

#2 주요 기능 구현 방식 소개 (1~7)

기능 1. 마우스 포인터 위치로 플레이어의 전투기가 움직이도록

 

플레이어인 전투기가 계속 마우스 위치로 가야 하기 때문에 PlayerContoller 스크립트의 Update 함수에 다음과 같이 썼습니다.

전투기 오브젝트에 이 스크립트를 적용해서 카메라에서 마우스 포지션의 x, y좌표를 받아와서 그 위치로 위치를 계속 변경할 수 있게 했습니다.

기능 2. 플레이어의 스페이스바 입력을 통한 미사일 prefab 생성

 

일단 미사일을 생성되어야 위치에 prefab으로 만들어주고 나서 BullletFireCtrl 스크립트에 임 오브젝트로 받아와 등록시켜주고 플레이어의 스페이스바 입력을 받을 때마다 객체 생성을 하게 했습니다.

기능 3. 미사일이 앞으로 나아가도록 하는 기능

미사일 prefab에 BulletMoveFoward 스크립트를 적용했습니다. 그래서 스페이스 바 터치를 받으 면 생성하자마자 speed 변수만큼의 속력으로 앞으로 발사되도록 했습니다.

기능 4. 외계인 생성과 움직임

외계인을 prefab으로 만들고 외계인 prefab EnemyMoveFoward 스크립트를 적용했습니다. 진하는 코드는 미사일이 전진하는 코드와 같습니다.

대신 객체 생성 시에 위치를 바꿔서 플레이어와 마주 보는 방향에서 나오게 했습니다. 그리고 생 성되는 위치를 지정해주기 위해서 4개의 빈 오브젝트로 외계인이 생성될 위치를 지정했습니다. 리고 다른 새로운 오브젝트를 생성해서 EnemyGenerator 스크립트를 적용했습니다.

EnemyGenerator 스크립트에서 prefab 오브젝트를 받아오고 오브젝트로 지정해둔 생성 될 위치 네 군데를 배열로 받아왔습니다. 그리고 생성되는 시간 간격인 interval 변수를 지정해줬습니다.생성을 위해 IEnumerator를 이용했습니다. 이는 coroutine 함수인데 함수를 몇 번에 나눠서 실행할 수 있어서 interval 만큼 기다리게 했다가 배열의 for each 문으로 지정된 4군데 위치에서 다시 생성하는 방식으로 이용했습니다. 이 반복문 안에서 방향을 back 방향으로 설정해서 플레이어와와 마주 보는 방향에서 외계인이 다가오도록 만들었습니다.

기능 5. 무한히 생성되는 외계인, 미사일 prefab 삭제해주는 기능

 

두 개의 box를 보이지 않게 만들고 collider is tigger를 체크해주고 rigidbody를 무중력 상태로 설정해준 뒤 화면 밖 경계 위치쯤에 box를 두고 Remover 스크립트를 적용했습니다.

 

Remover 스크립트에서 3D에서 충돌을 감지하는 함수들을 이용해 prefab들이 box에 충돌할 때 Destroy 삭제해 줬습니다.

 

 

기능 6. 외계인과 플레이어가 충돌 Hp 감소하는 것을 보여주는 text UI

 

오브젝트를 생성해서 HPManager 스크립트를 적용해 줬습니다.

HPManager 스크립트에서 플레이어의 HP 15인 정적 변수로 설정했습니다. 그리고 text UI를 생 성해서 HPUdate 스크립트를 적용했습니다. Update 함수에서 매 순간 받아오는 Hp가3 이하가 되면면 빨간색으로 보이게 했습니다.

 

플레이어와 외계인이 부딪혀서 Hp가 깎이는 기능은 플레이어에 다음 스크립트를 적용해서 구현했습니다.습니다.

 

외계인에 태그를 걸어서 만약 부딪힌 오브젝트 태그가 적이라면 Hp 1씩 깎았고 대미지를 입는 소리가 나게 했습니다. 그리고 0 되는 경우에 패한 엔딩 씬으로 넘어가게 했습니다.

 

기능 7. 외계인과 미사일이 충돌 Score 증가하는 것을 보여주는 text UI


위와 똑같은 방법으로 기능을 구현했습니다. 빈 오브젝트를 생성해서 ScoreManager 스크립트를 적용해 줬습니다.

ScoreManager 스크립트에서 score를 정적 변수로 설정했습니다. 그리고 Update 함수에서 점수가 50점이 되면 이긴 엔딩 씬으로 전환되게 했습니다. 그리고 text UI를 생성해서 ScoreUpdate 스크 립트를 적용했습니다.

순간 score 받아와서 text UI에서 보이게 했습니다.

외계인과 미사일이 충돌 시 score가 증가하게 하려고 Alien EnemyCrash 스크립트를 적용했습 니다. 스크립트에서 외계인의 수명을 3으로 정하고 미사일의 데미지 정도를 1 정했습니다.

EnemyCrash 스크립트에서도 onTriggerEnter로 충돌을 판정하고 만약 충돌한 오브젝트의 태그가 “bullet”이고 외계인의 hp 0 이상이라면 미사일의 데미지인 1 만큼을 빼주었습니다. 그리고 3 수명이 미사일에 3번 맞아서 0이 되면 적이 파괴되는 소리가 나면서 score 변수에 1을 더해주었습니다.습니다 후에는 외계인을 파괴했습니다.

 

#3   밖의 기능 구현 방식 소개

기능 1. 전환하는 기능


씬 전환을 위한 함수들이 정의된 SceneChange 스크립트를 만들고 빈 오브젝트를 생성해 적용해 줬습니다. 다른 스크립트에서 호출하거나 버튼에 함수를 등록해서 씬 전환이 되게 했습니다. 씬 전 외에도 프로그램을 종료시키는 함수도 만들었다. 마지막 결과 창에서 Quit 버튼에 적용했습니다.

기능 2. 사운드 호출 기능

사운드를 호출하려면 사운드를 재생하는 함수가 필요하다고 생각했습니다. 외계인과 부딪혀서 Hp 깎일 , 그리고 외계인을 마리 없앨 때마다 소리가 나게 하기 위해서 각의 상황에 적용 할 두 개의 빈 오브젝트를 만들고 DieSoundManager, DamageSoundManager 라고 이름을 바꾸 같은 이름의 스크립트들을 만들어주었습니다.

 

 

 

스크립트에서 AudioClip을 만들고 이 스크립트들이 적용된 빈 오브젝트에 사운드 소스를 추가해 주 고 스크립트에도 등록해 줬습니다. AudioSource를 변수로 선언하고 각 클래스 타입의 객체를 선언 했고 Start 함수에서 오디오 소스를 받아와 AudioSource를 변수에 넣어줬습니다. 이렇게 소리가 재생되는 함수를 만들 준비를 하고 public void 소리 재생 함수들을 각각 만들어주고 오디오 스 변수명.playOneShot(오디오 클립 변수명); 이라는 코드로 각 각의 소리를 재생할 수 있도록 했습니다.이 사운드 호출 함수들을 이용하기 위해 다음과 같이 음원이 재생돼야 하는 상황에 클래스 명.생성해둔 인스턴스.인스턴스의 사운드 재생 함수(); 코드를 작성해서 사운드 재생 함수를 호출했 습니다.

 

기능 3. 조준 위치를 알기 쉽게 해주는 HUD


미사일이 생성되는 위치의 앞쪽에 HUD 헤드업 디스플레이를 생성하기 위해 3D 오브젝트인 plane에 투명하게 보일 수 있게 material을 적용하고 그 위에 HUD 영상을 적용해서 루프를 켜서 무한히 재생되게 했습니다.

게임 최종 시연

책상 정리 좀 하고 찍을걸..ㅎㅎ