Projects/Unity 게임 제작

[5] 슈팅 게임 제작 (1)

gapsoo 2023. 7. 4. 09:16

[5].1 프로젝트 생성과 환경설정
[5].2 플레이어 이동제작
[5].3 총알 이동 제작

 


[5].1 프로젝트 생성과 환경설정

더보기

⚙️이번에 진행할 내용은 2020 버전(이상) 유니티가 필요합니다.

✔️Android Build Support 체크 후 다운로드 진행

 

 

 

🔶 슈팅 게임 프로젝트 생성하기

  • Unity Hub 실행

Unity Hub 프로젝트생성

 

  • 템플릿은 3D로 지정
  • 프로젝트 이름을 ShootingGame으로 지정
  • 생성 버튼을 클릭하여 프로젝트 생성

ShootingGame 이름으로 프로젝트 생성

 

 

  • ShootingGame 으로 프로젝트가 만들어지면 유니티가 실행된다.

ShootingGame 으로 열린 유니티에디터

 

 

 

🔶 제작 환경 설정하기 - 씬 설정

  • Scene 뷰를 lso 모드로 변경하고 기즈모를 클릭하여 화면이 Back 뷰가 되도록 설정

cene 의 원근모드를 직교모드로 변환
기즈모를 클릭하여 Back 화면으로 전환

 

 

 

 

🔶 제작 환경 설정하기 - 카메라 설정

  • 씬에는 반드시 하나 이상의 Main Camera 가 존재
  • 카메라에는 카메라 콤포넌트가 붙어 카메라의 역할을 한다

(왼) 씬에 있는 Main Camera    (오)Main Camera 의 컴포넌트

 

 

  • Main Camera 의 Position 을 그림과 같이 세팅
  • Projection 을 Orthographics 으로 설정

Main Camera 의 Position 속성과 Projection 설정

 

 

 

🔶 제작 환경 설정하기 -  조명 설정

Directional Light 의 Light 컴포넌트 비활성화

  • 하이어라키 창에서 Direction Light 를 선택
  • Light 컴포넌트를 비활성화 해준다.

 

 

(왼)Lighting 창 열기           (오)Lighting - Audio Generate 옵션 끄기

  • [window - Rendering - Lighting] 창을 열어준다.
  • Lighting 창이 열리면 Scene 탭의 맨 하단의 Auto Generate 옵션을 비활성화 해준다.

 

 

(왼)Lighting – Environments Lighting 변경     (오)Lighting – Ambient Color 값을 white 로 변경

  • Environment 항목에서 Environment Lighting 의 Source 를 Color 로 변경
  • 이때 나타나는 Ambient ColorRGB 값을 모두 255로 수정하여 흰색으로 지정

 

 

 

🔶 제작 환경 설정하기 -  해상도 설정

  • Game 창에서 해상도 변결을 위해 툴바의 해상도 관련 드롭다운 메뉴를 열어 [+} 버튼을 눌러준다.
  • 해상도를 640 x 960 으로 가로, 세로 값을 지정한다.

Game 창 해상도 변경

 

 

640 x 960 해상도 화면

 

 

 


[5].2 플레이어 이동 제작

🔶 플레이어 게임 오브젝트

  • 하이어라키창에서 [+] 버튼을 눌러 [3D Object - Cube]를 생성하고 이름을 Player로 변경한다.
  • Transform 값은 그림처럼 지정한다.

씬에 Cube 를 생성
Transform 값 초기화와 만들어진 Player 객체

 

 

 

🔶 Scripts 폴더 추가

  • 프로젝트(Project) 창에서 + 버튼을 눌러 Folder 를 선택하고 이름을 Scripts 로 변경

Scripts 폴더 생성

 

 

 

🔶 PlayerMove 스크립트 생성

  • [+] 버튼을 눌러 Scripts 폴더 내 C# Script 를 만들어주고 이름은 PlayerMove 로 지정
  • PlayerMove 라는 파일 이름과 아래 그림처럼 클래스 이름이 완전히 같아야 한다.

파일이름과 클래스 이름이 반드시 동일해야 한다.

 

 

 

 

🔶 PlayerMove 스크립트 할당

  • PlayerMove 스크립트를 드래그하여 하이어라키의 Player 객체에 드롭

PlayerMove 스크립트를 Player 에 할당
PlayerMove 스크립트가 컴포넌트로 추가된 상태

 

 

 

🔶 플레이어 이동 시키기 1

  • PlayerMove.cs 에 아래 코드를 작성하고 저장
  • Unity로 돌아가 실행 결과를 확인한다.
  • 스크립트를 수정하여, 왼쪽, 위, 아래로도 이동할 수 있도록 스크립트를 수정하여 본다.
  • 코드의 Vector3.right 를 Vector3.up, Vector3.down 으로 교차하면 된다.

🖥️ PlayerMove.cs 플레이어 이동 코드

public class PlayerMove : MonoBehaviour
{ 
	void Update()
	{
		transform.Translate(Vector3.right * 5 * Time.deltaTime);
	}
}

 

 

 

🔶 플레이어 이동 시키기 1 - Vector

  • Vector 는 크기와 방향을 갖고 있다. 
  • 사칙연산 중 더하기, 빼기, 곱하기(내적, 외적) 이 가능하다.
  • 크기는 그림에서 파란색, 방향은 빨간색 화살표로 표시

Vector 크기와 방향

 

 

 

🔶 플레이어 이동 시키기 1 - Vector 더하기

  • Vector 는 모든 힘의 합을 표현
  • 오른쪽 화살표 키와 위쪽 화살표 키를 누르면 대각선으로 가는 방향을 만들어 낼 수 있다.
  • 골프게임, 당구, 앵그리버드, 포트리스 같은 게임을 제작하는데 사용할 수 있다.

 

Vector의 더하기

 

 

 

🔶 플레이어 이동 시키기 1 - Vector 빼기

  • 원하는 지점으로 가는 방향을 찾아낼 때 유용하게 사용
  • Direction = B - A 의 의미는 A가 B로 가고자 하는 방향을 찾는 수식

Vector 빼기

 

  • 전역변수를 활용하여 Speed 속성을 외부에 노출
  • 이렇게 노출된 속성은 유니티 에디터에서 수정이 가능

🖥️ PlayerMove.cs에 speed 속성 추가

public class PlayerMove : MonoBehaviour
{
	// 플레이어가 이동할 속력
	public float speed = 5;
	void Update()
	{
		transform.Translate(Vector3.right * speed * Time.deltaTime);
	}
}

외부로 노출된 speed 속성

 

 

 

🔶 플레이어 이동 시키기 1 - 라이프사이클 함수 (Life Cycle Fucntion)

  • 유니티 객체의 생애주기
  • 표에서처럼 태어남은 Start, 살다가는 Update, 죽다는 OnDestory 함수로 매칭된다.
  • 유니티에서의 이벤트 함수에는 접두어로 On을 붙여준다.
  태어남 살다가 죽다
발생 횟수 1 계속 1
발생 일시 확인 여부 0 0 X
유니티 함수 Start Update OnDestroy

라이프 사이클

 

 

 

🔶 플레이어 이동 시키기 1 - deltaTime

  • delta 는 변화된 것을 뜻한다.
  • 그림에서 중간의 구간들은 PC에서 초당 처리할 수 있는 횟수
  • 첫 번째 그림은 초당 4번을 실행할 수 있고, 두 번째 그림은 초당 2번을 실행할 수 있기에 초당 움직일 수 있는 거리가 달라진다.(한번에 1m씩 움직인다면 위는 4m, 아래는 2m 이동)
  • 동기화 처리를 위해 구간에 걸린 시간(위 0.25, 아래 0.5)를 각각의 이동 거리에 곱해주면 최종 1m씩으로 움직인 거리가 같아진다.
  • 회전, 크기 변환 작업에도 deltaTime을 곱해주어 동기화시켜야 한다.

 

 

 

🔶 사용자 입력 처리

  • 키보드의 좌우키, A, D 키의 입력을 대응하기 위한 코드를 작성
  • Unity의 [Edit - Project Setting - Input Manager] 의 속성에 등록되어 있는  Horizontal 을 활용

🖥️ PlayerMove.cs 사용자 입력 처리 가로방향

public class PlayerMove : MonoBehaviour
{
	// 플레이어가 이동할 속력
	public float speed = 5;
	void Update()
	{
		float h = Input.GetAxis("Horizontal");
		print(h);
		transform.Translate(Vector3.right * speed * Time.deltaTime);
	}
}

 

 

  • 상하 입력에 대응하는 코드 작성

🖥️ PlayerMove.cs 사용자 입력 처리 세로방향

public class PlayerMove : MonoBehaviour
{
	// 플레이어가 이동할 속력
	public float speed = 5;
	void Update()
	{
		float h = Input.GetAxis("Horizontal");
        
		float v = Input.GetAxis("Vertical");
		print("h : " + h + ", v : " + v);
			transform.Translate(Vector3.right * speed * Time.deltaTime);
	}
}

 

 

🔶 방향 만들기

  • "사용자 입력에 따라 방향 만들어서 이동한다." 이 내용을 우리는 구현
  • "방향 만들기" 가 있어야 이동이 가능
  • 사용자 입력에서 받은 값을 방향을 만드는 데에 사용
  • 만들어진 방향을 최종 이동 로직에 적용

🖥️ PlayerMove.cs 방향을 담을 변수 만들기

public class PlayerMove : MonoBehaviour
{
	// 플레이어가 이동할 속력
	public float speed = 5;
	void Update()
	{
		float h = Input.GetAxis("Horizontal");
		float v = Input.GetAxis("Vertical");
        
		Vector3 dir = Vector3.right * h + Vector3.up * v;
		transform.Translate(dir * speed * Time.deltaTime);
	}
}

 

 

  • Vector3.right * h 를 x, y, z 에 대한 각 성분의 값으로 표현해 보면 (1, 0, 0) * h = (h, 0, 0) 이 된다.
  • Vector3.up * v 는 (0, 1, 0) * v = (0, v, 0) 된다.
  • 둘을 합하면 (h, 0, 0) + (0, v, 0) = (h, v, 0) 이 되므로.
  • 스크립트를 코드처럼 각 성분으로 변경할 수 있다.

🖥️ PlayerMove.cs 방향을 각성분으로 제작

public class PlayerMove : MonoBehaviour
{
	// 플레이어가 이동할 속력
	public float speed = 5;
	void Update()
	{
		float h = Input.GetAxis("Horizontal");
		float v = Input.GetAxis("Vertical");
		Vector3 dir = new Vector3(h, v, 0);
		transform.Translate(dir * speed * Time.deltaTime);
	}
}

 

 

 

🔶 플레이어 이동 시키기 2

  • 물체를 이동하기 위한 물리 법칙으로 이동, 속도, 힘 에 관한 공식을 사용한다.
  • P 는 앞으로의 위치, P0 는 현재, v 는 속도, t 는 시간을 의미
  • F 는 힘, m 은 질량, a 는 가속도를 의미
P = P0 + vt
v = v0 + at
F = ma

 

  • Translate 함수를 P = P0 + vt 공식으로 변환하여 작성

🖥️ PlayerMove.cs 이동공식으로 코드 변환

public class PlayerMove : MonoBehaviour
{
	// 플레이어가 이동할 속력
	public float speed = 5;
	void Update()
	{
		float h = Input.GetAxis("Horizontal");
		float v = Input.GetAxis("Vertical");
		Vector3 dir = new Vector3(h, v, 0);
        
		// P = P0 + vt 공식으로 변경
		transform.position += dir * speed * Time.deltaTime;
	}
}

 

 

 


[5].1 프로젝트 생성과 환경설정

 

🔶 Bullet 생성

  • 하이어라키 툴바의 + 버튼을 선택하여 Cube 를 하나 만들어 주고 이름을 Bullet 으로 변경

Bullet 게임오브젝트 생성

 

 

 

🔶 Bullet 위치 설정

  • Bullet 의 Transform 정보를 변경해 주도록 한다.
  • 총알이 잘 보이도록 위치를 변경하고 총알의 크기도 변경해 주도록 한다.

Bullet Transform 값 설정
Bullet Transform 값 설정 결과

 

 

 

🔶 Bullet 스크립트 생성

  • Project 창의 툴바 버튼인 + 를 눌러 Scripts 폴더에 C# 스크립트를 하나 만들어 주고 이름은 Bullet 으로 변경

Bullet 스크립트 할당

 

 

 

🔶 Bullet 스크립트 할당

  • Bullet 스크립트를 잡아서 드래그 앤 드롭하여 Bullet 게임 오브젝트의 컴포넌트로 붙여준다.

Bullet 스크립트 할당

 

 

 

🔶 목표에 따른 구성 순서

목표 위로 계속 이동하고 싶다.
필요 속성 이동 속도
순서 ① 방향 구하기
② 이동하기

 

 

 

 

🔶 이동속도 속성 추가

  • 유니티 에디터 상에 노출하여 기획자가 수정할 수 있도록 접근 제한자를 public 로 하여 speed 변수를 하나 만든다.

🖥️ Bullet.cs 이동속도 속성 추가

public class Bullet : MonoBehaviour
{
	//필요속성 : 이동속도
	public float speed = 5;
}

 

 

 

  • 라이프사이클 함수 중 살아가는 중 계속 호출되는 함수는 Update 이기 때문에 이 곳에 구현 부를 추가
  • 먼저 위로 가는 up 방향을 구하고 이동 공식 P = P0 + vt를 이용하여 해당 방향으로 이동

🖥️ Bullet.cs 위로 계속 이동하기 기능 구현 

public class Bullet : MonoBehaviour
{
	//필요속성 : 이동속도
	public float speed = 5;
	// Update is called once per frame
	void Update()
	{
		// 1. 방향을 구한다.
		Vector3 dir = Vector3.up;
		// 2. 이동하고 싶다. 공식 P = P0 + vt
		transform.position += dir * speed * Time.deltaTime;
	}
}

 

 

 

 

 


이번 시간에는 플레이어, 총알 이동 제작을 해보았는데요!

본격적으로 게임을 구성하는 요소를 만들기 시작하는 것이 보여서 신기하고 설레네요 😙

물리 공식을 코드에 적용하는 것이 인상깊었습니다

추가되는 내용이 많아지는 만큼 앞으로 더 열심히 복습하고 따라가겠습니다!

글 읽어주셔서 감사합니다 🙇‍♀️

 

'Projects > Unity 게임 제작' 카테고리의 다른 글

[7] 슈팅 게임 제작 (3)  (0) 2023.07.06
[6] 슈팅 게임 제작 (2)  (2) 2023.07.06
[4] C# 스크립트 (3)  (6) 2023.06.30
[3] C# 스크립트 (2)  (6) 2023.06.29
[2] C# 스크립트 (1)  (6) 2023.06.28