TIL

2024 08 28 TIL

noc777 2024. 8. 28. 18:04

제3강 고양이 밥주기 게임 

 

3-1 기본씬 구성하기

3강에서는 미리 제공된 패키지 파일을 이용한다. 패키지 파일은 Assets 파일에 드래그 앤 드롭을

하여 패키지를 개봉 및 사용 할 수 있다.

 

이번 강의에선 가게를 지키는 멍멍이가 배고픈 고양이들에게 음식을 던져주며 가게에 도달하지 못하게 하는 게임을 만들었다.

멍멍이는 마우스 커서를 따라가며 멍멍이 앞에서 음식이 발사된다. 고양이의 하단에는 Hp 게이지가 있으며 Hp게이지가 모두 찰 경우 옆으로 이동하며 사라진다.

 

일단 첫번째 강의에선 지금까지 했던 새로 프로젝트를 만들고 레이아웃을 2by3로 만드는 것 모바일 환경으로

만드는 것 project를 one collum rayout으로 바꾸는 것 등 기본작업도 포함되어 있지만 계속 해왔으니 이번엔

생략한다.

 

기본작업을 끝내고 MainScene의 camera 컴포넌트 size를 25로 바꿔준다 (카메라의 시야를 넓혀준다)

그리고 camera 컴포넌트의 Background 의 색상을 바꿔준다.

이번엔 RGB값을 직접 수정하지 않고 하단의 HEX를 FFF0B2로 바꿔주었다. (이전에 만들었던 배경화면이 완성되었다)

 

미리 다운받아 놓은 유니티 패키지 파일을 Asset폴더에 넣어주고 import를 누르면 언패키지가 된다.

 

2D오브젝트 Square를 만들고 position y 값을 -22 패키지 파일의 fish shop 이미지 파일을 sprite 칸에 집어넣으면

생선 가게 오브젝트가 완성된다.

 

멍멍이도 똑같이 2D 오브젝트 Square -> asset폴더-> image폴더->angrydog_1을 오브젝트의

sprite칸에 옮김으로서 완성된다. (position y값은 가게보다 조금 위 -16정도)

 

리소스 파일이 제공되니 오브젝트를 직접 만들 수고를 덜 수 있어 편리한 것 같다.

 

3-3  시작화면 만들기(3-2는 3-1의 내용과 같다)

 

3-1강의에서 MainScene의 기본 구성을 하였다면 이번엔 시작화면을 만든다.

먼저 Asset 폴더의 Scene폴더에 새로 StartScene 이라는 새로운 Scene파일을 생성한다.

그리고 더블 클릭을 하면 StartScene으로 MainScene과 별개의 화면에 들어갈 수 있다.

 

MainCamera를 누르고 size를 MainScene과 같이 25로 조절

 

2d 오브젝트 square를 생성 image 파일인 intro를 sprite에 넣어준다. (배경화면)

 

Creat->UI->Button 으로 버튼을 생성 버튼의 너비는 300 높이는 100  y값을 -300 으로 크기와 위치를

조정해준다 source image에startBtn 이미지를 넣어주면 시작버튼의 외형이 갖춰진다.

 

그리고 이 버튼이 시작버튼의 역할을 할 수 있도록 스크립트를 작성한다.

 

asset폴더 안에 새로 script 폴더를 생성하고 안에 c#스크립트 파일을 생성한다. 파일명은 버튼과 스크립트

모두 StartBtn로 통일

 

스크립트에 들어가서 start와 update를 모두 지우고 상단에 using UnityEngine.SceneManagement;를 입력

 

public void StartGame() 이라는 함수를 만들고 SceneManager.LoadScene("MainScene:); 을 적는다.

버튼을 눌렀을때 MainScene으로 이동하는 스크립트가 완성되었다.

 

StartBtn 오브젝트에 StartBtn 스크립트를 넣어주고 Button 컴포넌트 On click()의 + 버튼을 누른다.

none이라고 되어있는 부분에 다시 StartBtn 오브젝트를 끌어와 넣어주고 StartBtn -> StartGame() 을 선택하면

버튼을 눌렀을때 MainScene으로 이동될 것이다.

 

3-3 강아지 만들기

 

3-1 강의에서 만들었던 강아지 오브젝트에서 음식이 발사되도록 만들어볼것이다.

 

2d오브젝트 circle을 만들고 transform 컴포넌트를 reset 하여 위치를 조정한다.

 

Scale값을 x y 6 6 Sprite 칸엔 knob를 검색하여 넣는다.

 

색은 옆의 스포이트 아이콘을 클릭하여 강아지의 색을 추출하여 넣는다.

 

이러면 음식의 외형은 만들어졌고 

 

이 음식이 위로 쏘아 올려지도록 스크립트를 새로 만든다. 명칭은 오브젝트와 스크립트 모두 Food로 통일

 

음식이 계속 위로 쏘아올려져야 하기 때문에 Update 함수안에 코드를 적는다. 

transform.position += Vector3.up; 을 사용하면 x와 z축은 그대로고 y축은 1씩 증가한다.

Update 안에서는 컴퓨터의 프레임만큼 초당 처리가 되기에 0.05를 곱하여 속로를 조절한다.

transform.position += Vector3.up * 0.05;

 

이제 강아지를 기준으로 음식이 발사되어야 하기 때문에 Dog 스크립트를 만든다.

Update함수를 지우고 void MakeFood() 함수를 새로 만들어준다.

디버그를 하기 위해서 Debug.Log("밥먹어")를 안에 적어주고 

InvokeRepeating("MakeFood",0f,0.5f); 를 Start 함수안에 적어준다.

("반복할 함수",시작지연시간,주기)

실행해보았을때 0.5초마다 콘솔창에 밥먹어 라는 출력문을 확인할 수 있다. 

 

이제 MakeFood함수에 음식을 만들어주는 코드를 작성하기위해

먼저 public GameObject food; 라는 변수를 선언해준다.

Debug.Log를 지워주고 

float x = transform.position.x;     x값을 가져올 변수

float y = transform.position.y;     y값을 가져올 변수

Instantiate(food,new Vector2(x,y),Quternion.identity);

게임오브젝트를 생성(생성할 게임오브젝트,위치값,)  Quternion.identity는 별도의 회전값을 주지 않겠다는 뜻

 

Prefab 폴더를 생성하고 Food 오브젝트를 넣어 프리팹으로 만들고 있던 오브젝트는 삭제한다.

그리고 Dog 스크립트의 food 변수에 Food 프리팹을 넣어주고 실행해보면 강아지에게서 음식이 생성된다.

 

강아지 오브젝트 안에서 음식이 생성되는 듯한 느낌이라 float y = transform.position.y; 를 수정하여

float y = transform.position.y + 2.0f;         y축을 2 올림

 

Food 오브젝트가 계속 생성되면서 사라지지 않고 남고 있기때문에 어느정도 위치로 올라가면 파괴하도록 코드를 

만들어본다. 

 

Food 스크립트로 돌아가 transform.position += Vector3.up * 0.05; 아래에 코드를 적는다.

if(transform.position.y > 27.0f)    //조건문 transform의 position의 y값이 27보다 크다면

{

   Destroy(gameObject); //오브젝트를 제거한다.

}

 

이제 음식이 y축 27 이상으로 올라가면 사라진다.

 

강아지를 마우스 커서를 따라가도록 코드를 작성해야한다.

 

Dog 스크립트로 돌아가서 Update 함수를 다시 만들어준다.

 

Update 함수안에

 

Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input,mousePosition);

//마우스의 위치값을 담는 변수

transform.position = new Vector2(mousePos.x,transform.position.y);

//y축은 그대로 오브젝트가 있던 위치 x값만 마우스 커서의 위치를 담는 변수에 의해 조정 

 

마우스 커서가 화면 밖으로 나가도 오브젝트가 따라가므로 코드를 수정해야한다.

float x = mousePos.x; //마우스 커서의 x값을 따로 저장하는 변수 x를 만들고

 

if(x>8.5f)

{

     x= 8.5f;

}

//x 값이 8.5보다 커진다면 8.5로 다시 조정

 

else if(x<-8.5f)

{

     x= -8.5f;

}

//x값이 -8.5 보다 작아진다면 -8.5로 다시 조정

 

그리고

transform.position = new Vector2(mousePos.x,transform.position.y); 를

transform.position = new Vector2(x,transform.position.y);

//float x 라는 Vector2 mousePos의 x값을 따로 받는 변수가 만들어졌으니 코드를 수정

 

이제 멍멍이 오브젝트가 화면밖으로 나가지 않고 마우스 커서를 잘 따라가게 되었다.

 

 

 

 

3강부터는 패키지 파일이 따로 주어져 오브젝트를 만드는 시간을 절약하고 본격적인 게임을 만드는 것

같아 재밌게 강의를 들었던 것 같다. ScreenToWorldPoint같은 함수는 아직 잘 생각나지 않아 본 캠프를 들어가기 전까지

몇번씩 더 돌려보면서 강의를 다 들어도 복습해보는게 좋을 것 같다는 느낌을 받았다.

'TIL' 카테고리의 다른 글

2024 08 30 TIL  (0) 2024.08.30
2024 08 29 TIL  (0) 2024.08.29
2024 08 27 TIL  (0) 2024.08.27
2024-08-26 TIL  (0) 2024.08.26
2024 08 24  (0) 2024.08.24