TIL

2024-08-26 TIL

noc777 2024. 8. 26. 18:06

저번 시간 빗방울 게임을 만들고 나서 숙제까지 제출완료하였다.

 

이번 시간엔 OT를 끝마치고 이어서 강의 2장을 시작하였다

 

2-1 풍선의 지켜라 게임 기본 씬 구현하기

 

새로 프로젝트 MySheild를 만들어서 layout 을 2 by 3 로 바꿔주고

Project의 Scene의 기본 samplescene을 MainScene으로 명칭을 변경 하였다

이후 화면을 저번 시간에 만들어 두었던 모바일 환경(760x1280)으로 바꿔준다

 

2D sprite 사각형 오브젝트를 생성후 Scale크기 x = 6 y =10 으로 설정 색은 RGB 20 20 80

으로 바꿔준다(배경) 

 

2D sprite 원 오브젝트를 생성 후 position y값을 -3.2로 살짝 내려주고 bloon으로 명명

 

2D sprite 원 오브젝트를 생성 후 색은 RGB 0 255 255 Sheild으로 명명 Scale x =0.5 y=0.5

 

UI legacy text 오브젝트를 만들고 Rect transform의 우측 상단 칸을 눌러 리셋을 시킨다

너비와 높이를 200   font 사이즈는 70   position 값을 450으로  RGB 는 255 0  0 으로 만듬

텍스트 칸에는 0.00을 적는다 

(점수)

 

Assets 폴더안에 animations 폴더 생성 애니메이션 파일을 생성하고 Bloonidle로 명명

 Loof time 체크 까지

애니메이션 파일은 Bloon object로 끌어다 넣어주고 애니메이션을 실행후 Bloon 클릭

녹화버튼을 누르고 타임라인은 20 RGB 200 200 255 으로 맞추고 타임라인을 40

RGB 255 255 255로 맞추고 녹화버튼을 다시 누른다.

(풍선 오브젝트의 색 변화)

 

Scripts 폴더를 만들고 안에 c#스크립트 파일을 생성(Sheild로 명명) Sheild 오브젝트에 Sheild

스크립트를 붙여줌 

 

스크립트 파일을 실행 

 

Update 함수안에 Camera.main.ScreenToWorldPoint(Input.mousePosition);  를 쓰고

Vector2 mousePos 라는 변수에 넣어줌 Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

 

transform.position = mousePos;

 

(Sheild 오브젝트가 마우스를 따라가도록 코드 완료)

 

2-2  2-3 2-4 는 2-1과 겹쳐서 생략

 

2-5 장매물 만들기 중력과 위치

 

2d 오브젝트 square를 생성 

c#스크립트 square를 생성하고 square에 붙여준다

 

실행 화면 상에서 square가 랜덤하게 출력될수 있도록

화면 크기와 대조하여 측정하여 x축 -3 ~3  y축 3~5 라는 값을 도출하였다.

 

Random.Range();는 괄호안의 두 값 사이의 값을 무작위로 출력한다.

float x = Random.Range(-3f, 3f);   

float y = Random.Range(3f, 5f);

각각 x와 y값을 무작위로 출력하는 변수를 생성하고

 

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

(transform.position은 연결된 오브젝트의 position값을 변경 시킨다 변수 x,y를 넣음으로서

무작위로 포지션의 xy값이 변경됨)

 

float size = Random.Range(0.5f, 1.5f); 라는 변수를 생성

이 변수는 사각형의 크기를 무작위로 나오도록 한다

 

transform.localScale = new Vector2(size, size);

연결된 오브젝트의 Scale 값을 size변수의 범위만큼 무작위로 출력

 

square에 중력효과를 주기위해 add component -> Rigidbody 2D를 넣고

충돌효과를 주기위해 Square엔 box collider 2d 

Sheild와 Bloon엔 circle collider 2d를 부여한다

 

또한 반복해서 출력될수 있도록

일단 Hierarchy창에서 Create empty  이름은 Gamemanager로  c#스크립트로 동일명으로 생성

후 붙여준다.  

 

Gamemanger 스크립트를 실행후

 

먼저 start에 InvokeRepeating("MakeSquare", 0f, 1f);   (반복해서 수행하는 함수)

그리고 밖에

public GameObject square;        (GameObject square를 지정)

 

(start 함수)

 

 

 void MakeSquare()
 {
     Instantiate(square);          (Square를 생성)
     
 }

 

를 입력 후 Square 오브젝트를 Prefabs 폴더에 넣는다

 

후에 gamemanager 오브젝트의 square칸에 Prefab Square를 넣으면  

사각형이 랜덤한 위치 랜덤한 크기로 반복적으로 출력된다.

 

2-6은 2-5와 중복되므로 생략

 

2-7 시간 구현하기 

 

시간을 구현하기 위해 gamemanager 스크립트에서 시작한다.

 

2-5에서 만들었던 public GameObject square; 밑에

float time = 0.0f;  ( time이라는 변수 생성

 

Update 안에

time +=Time.deltaTime; 

0.0인 time 에 지속적으로 Time.deltaTime 로 더해줌 

(Debug.log("time')으로 확인해보면 지속적으로 초가 흘러가는걸 확인할수있다)

 

canvas안의 텍스트 오브젝트를 timeTxt로 명칭변경을 해주고

public GameObject square; 밑에

public Text.timeTxt;를 적어주는데

오류가 뜬다 사용하기위해선 

오류가 뜬 코드의 전구에서 using UnityEngine.UI; 누르면 자동으로 추가된다. 

 

Update안에 

time +=Time.deltaTime; 밑에

timeTxt.text = time.ToString("N2"); 입력

텍스트안에 float 값을 입력하기위해서 문자값으로 치환해야하기 때문에 Tostring을 사용하고

괄호안에 N2를 넣은것은 소수 2번째자리까지 출력되게 하기 위해서다.

 

Gamemanager 오브젝트의 timeTxt칸에 timeTxt 를 넣어주면

시간초가 흐르게 된다.

 

2-8 게임종료 판넬 만들기

 

학습자료의 폰트를 다운받아놓고 

Canvas안에 Create empty 이름을 EndPannel 이라 짓는다.

 

학습자료의 내용을 토대로 Image Title NowScore BestScore 등을 만들고 너비 높이 x값 y값

색 폰트 폰트 크기 등을 조절해준다. 

그리고 게임 종료후 화면이 출력되기 전까진 체크 표시를 꺼두어 화면에 출력되지 않게 한다. 

 

2-9 게임종료 로직 만들기

 

싱글톤을 만들기 위해서 먼저 GameManager 스크립트를 실행

public static GameManager Instance; 를 상단부에 입력 

 

void Awake()                      (Start 앞에 위치)

{

  if(Instance == null)         (instance가 비어있을때 조건) 

  {

      Instance = this;            (Instance가 this다

   }

}

 

게임 오버 시 시간을 초기화 하기위해

뒤쪽에

 

public void GameOver()
{
    Time.timeScale = 0.0f;
    
}

입력

 

게임이 끝날시 게임오버 화면을 출력하기 위해

public GameObject EndPannel;

을 상단부에 입력하여 Unity에서 EndPannel을 불러올수있는 권한 부여

 

Gameover함수 안에

EndPannel.SetActive(true);        EndPannel의 표시를 다시 켠다

 

EndPannel이 표시되었을때 Now Score을 나타내야하기 때문에 

gamemanager 스크립트에 public Text NowScore; 입력   (Now score에 연결)

gameover 함수안에

NowScore.text = time.ToString("N2"); 를 넣음으로서 종료되었을때의 시간을 입력시킨다.

 

충돌하였을 때 게임이 종료되는 것을 구현하기 위해서 

Bloon 오브젝트에 'Player' 태그를 미리 부여한다

Square 스크립트에서 private void OnCollisionEnter2D(Collision2D collision) 를 입력

안에

 

 if (collision.gameObject.CompareTag("Player"))    (충돌하는 오브젝트의 태그가 Player라는 조건)
 {
     GameManager.Instance.GameOver();      (GameManager의 GameOver 함수를 실행한다)
 }

 

하면 Bloon에 Square가 부딪혔을때 게임이 종료되고 점수창이 표시된다.

 

미세한 차이로 timetxt 오브젝트와 nowscore가 차이가 나는걸 막기위해

 

Gamemanager에 bool isPlay = true; 라는 변수 선언

Gameover안에는 isPlay = false; 를 넣어 게임오버될시 기능정지하고

Update 안의 함수엔  

if (isPlay)
{
    time += Time.deltaTime;
    timeTxt.text = time.ToString("N2");
}

처럼 isplay 가 기능하고 있을때만 시간이 흐르도록 만든다.

 

다시하기 버튼 

 

scripts 폴더에 새로 Retrybutton c#스크립트를 만들고 RetryButton 오브젝트에 드래그 앤 드롭

Retrybutton 스크립트 안에선 start와 update를 사용하지 않을것이기에 지워주고

public void Retry()
 {
     SceneManager.LoadScene("MainScene");        (재시작버튼을 눌렀을때  다시 mainscene을 구동하는)
 }

을 입력한다  (만약 안된다면 using UnityEngine.SceneManagerment;을 입력)

 

Retrybutton 오브젝트에서 button 컴포넌트의 on click()의 + 버튼을 눌러주고 none에 Retrybutton

오브젝트를 드래그 앤 드롭  RetryButton->Retry 선택을 하여  다시하기 버튼을 만들었다.

 

Gamemanager 스크립트에서 Time.timeScale = 1.0F;을 넣어주면 다시하기 버튼이 제대로 실행된다.

 

 

'TIL' 카테고리의 다른 글

2024 08 28 TIL  (7) 2024.08.28
2024 08 27 TIL  (0) 2024.08.27
2024 08 24  (0) 2024.08.24
2024 08 23 TIL  (0) 2024.08.23
2024 08 22 TIL  (0) 2024.08.22