본문 바로가기
제출용/TIL

내일배움캠프 4일차 TIL + 3 고양이 밥주기 게임

by 유린테 2024. 4. 18.

오늘의 키워드

  • Button
  • InvokeRepeating
  • isFull

이번엔 하늘에서 떨어지는 고양이한테 밥을 쏴서 주는 게임을 만들었습니다.

 


 

이번에 새롭게 알게된 점!

Background를 Camera에서 바로 바꿀 수 있다!!!!

이때까지는 수업에서 Sqaure을 만들고 색을 바꿔서 했었기 때문에 일러처럼 그렇게 해줘야 하는건 줄 알았는데

아니었다!! 

 

 

에셋파일 적용

파일 - 에셋폴더 드래그&드롭

하이어라키 창 - 2D오브젝트 - 스퀘어 만든 후 인스펙터 창 스프라이트에 넣어주기

>> 그럼 2D오브젝트가 이미지 모양으로 바뀜!

 

 

씬 추가하기

 

프로젝트창 씬 폴더 우클릭 - 크리에이트 - 씬 하면 새로운 씬이 생긴다!!

게임 창 말고 스타트 화면같은 새 씬 추가할 때 이용하는 듯

 

시작화면에서 누르면 넘어가는 스타트버튼 같은거는 스퀘어 말고 UI로 생성한다

하이어라키 창 - UI - 레거시 - 버튼

>> 여기서 UI로 생성하는 버튼과 Add로 넣어준 Button은 서로 다른 것인가? 같은 것인가?

 

버튼 활성화 시키기

using UnityEngine.SceneManagement;

>> using문을 먼저 써서 씬매니지먼트 넣기

 

public void StartGame()
   {
       SceneManager.LoadScene("MainScene");
   }

>> 오 이렇게 코드 블럭으로도 쓸 수 있었네

 

스타트게임 이라는 퍼블릭 만들어주고 - "MainScene"을 불러오는 씬매니저 넣기

 

 

버튼 사용 시 유의할 점!!!

 

유니티에서 하이어라키창의 버튼 클릭 - 인스펙터 창의 On Click에서 + 해주고 하이어라키창에 있는 버튼 넣어주기 + 

C#에서 만들어놓은 StartGame함수 불러와주기 해야 버튼 작동이 됨

 

 

밥 쏘기

 

밥의 위치를 계속 바꿔주기 위해 transform.position.y += 1f; 로 하면

transform.position은 변수가 아니므로 해당 반환 값을 줄 수가 없다고 뜬다.

포지션 x,y,z 에  각각에 접근해서 바꿔주기는 불가능 == 포지션 자체에다가 더해줘야함!!

이때 Vector3.up; 을 하게 되면 (0,1,0)이 나오면서 Y값에 1을 계속 더해주는 것이 된다.

근데 올라가는게 너무 빠르니까 Vector3.up * 0.5f; 를 해서 살짝 느리게 만들어줘야함.

>> 속도 조절은 보통 작은 수를 곱해서 해주는 것 같다.

 

InvokeRepeating : 반복적인 행동 수행

InvokeRepeating("MakeFood", 0f, 0.5f);   -  반복수행해라 ("이거를" , 언제부터, 얼마마다);

이거 어제 TIL에도 적었지만 가장 자주 쓰고, 많이 나오는 코드다!!!

그리고 헷갈려 ㅎ

 

 

푸드가 화면 밖으로 나가면 없애주기

  if (transform.position.y >27)
  {
      Destroy(gameObject);
  }

y의 포지션이 27보다 크면 게임오브젝트를 파괴해라!

라는 코드 

Destroy는 다른 코드에 비해 꽤나 직관적인 것 같아서 이해가 쉬웠다.

아직까지는 Destroy가 유일하게 강의 멈춰놓고 혼자 써 봤을 때 정답이었던 코드.

 

 

강아지를 마우스따라 움직이기

private void Update()
  {
     Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
      transform.position = new Vector2 (mousePos.x, transform.position.y);
  }

마우스와 강아지가 있는 곳 = Camera 그 중에서도 main 에 있음.

월드 내 포인트를 마우스 포지션 값으로 바꿔주는데 // 강아지는 X만 움직이고 Y는 움직이면 안돼서

new Verctor2 이용해서 X는 마우스X, Y는 기존 포지션 Y값으로 줘서 변화가 없게 한다!

>> new Vector2 를 쓰는 경우와 new Vector3 를 쓰는 경우의 차이를 모르겠다.

>> 사실 z값은 안쓰니까 뭐가 다른건지도 모르겠다.

 

근데 강아지가 화면 밖으로 나간다!!! 

X 8.5f 를 기준으로 못나가게 해주자

  if (x>8.5f)
        {
            x = 8.5f;
        }

        if (x<-8.5f)
        {
            x = -8.5f;
        }

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

위치 변수를 X로 잡았으니 아래 트랜스폼포지션도 mousePos.x 에서 x로 바꿔준다

트랜스폼포지션 안바꿔주면 결국 마우스 따라 평생 옴.

>> 저 코드 쓸 때 머머.머 인거랑 머머(머) 인거랑 .과 ()를 쓰는 차이는 뭘까?

 

 

고양이 HP 체력바 만들기

 

하이어라키 창 - 헝그리 우클릭해서 UI - 이미지 해주면 캔버스가 생기면서 생성된다.

캔버스 렌더보드가 오버레이로 되어있는데

overlay 는 기계 스크린에 직접적으로 그려지는 것

게임 월드로 가져오기 - World Space로 바꿔주기

 

 

에셋을 캔버스 사이즈에 맞추기

 

 

그냥 누른거

 

Shift + Art 한거

 

오른쪽 하단거를 누르면 캔버스 사이즈에 맞춰서 이미지를 바꿔준다!

이것도 항상 자주 쓰여서 기억해놓기.

 

UI HP 바를 두개 만들고 앞에꺼 색깔을 바꿔서 0~1까지 조정해주면 게이지 닳는걸로 보임

>> 이거 엄청난 코딩인 줄 알았는데 . 그냥 색깔다른 레이어 두개였다니..!

 

 

고양이가 밥 맞게 만들기

 

이제 맞게 만드는건 Rigidbody와 Collider 를 쓰면 되는 건 알지만, 이번엔 조금 달랐다!

고양이를 맞추면 밥이 멈추고 떨어지기 때문에 bodytype을 다이나믹에서 키네마틱으로 바꿔줘야 했다.

대신 키네마틱으로 바꿔주면 물리현상이 아예 없어져서 

푸드 콜라이더에 is Trigger 이란걸 체크해줘야한다 캣도 is trigger 해줘야함!

 

콜리전의 물리값을 없애고 is trigger로 해주었기 때문에 OnTrigger2D 코드를 이용해주어야 한다.

 

하이어라키에서 설정한 프리펩은 꼭!!! apply all 해주기!!

저 태그 아래 프리펩 을 선택해서 apply all 해주면 된다. 

이거 자꾸 깜빡하고 적용을 안하거나 그 상태로 지워버려서.. 매우 곤란할 때가 많았음.

기억하자!!!!

 

 private void OnTriggerEnter2D(Collider2D collision)
  {
      if (collision.gameObject.CompareTag("Food"))
      {
          Debug.Log("맛있다");
      }
  }

이렇게 해주면 밥이 닿을때마다 맛있다 함 ㅎㅎ

귀여움

대신 게이지가 계속 차오르니까 if else 를 써서 게이지가 다 차면 더 안생기게 해줘야함

 if (energy<full)
 {
     energy += 1.0f;
     front.localScale = new Vector3(energy / full, 1.0f, 1.0f);
     Destroy(collision.gameObject);
 }

 else
 {
     Debug.Log("배가불러요");
 }

ㅠㅠ코드가 배부르대 귀여워

암튼 이렇게 하면 게이지가 다 차면 이제 배불러요~ 하게 된다!

 

에너지가 <full보다 작으면 1씩 차오르게, 아닌 경우 배가불러요 하게 했더니

배가 부르다를 맞는 내내 얘기함!!! 

 

public GameObject hungrycat;
public GameObject fullcat;

로 함수를 만들어주고,

hungrycat.SetActive(false);
fullcat.SetActive(true);

로 껏다 켯다 하게 해준 후에 - 유니티에서 코드 이어주고 - 프리펩 apply all까지 꼭 해줘야한다!!!!!

 

그럼 이제 고양이가 밥먹으면 게이지 오르고/ 다 차면 배부른애로 바뀌는거 까지 됨

 

고양이 배부르면 다른쪽으로 가게 만들기 & 고양이 위치 랜덤생성

5방 맞아도 한번 더 때려야 옆으로 가는거를 if문을 한번 더 넣어서 해결!

 

 

고양이 반복생성하기

고양이 게임오버 후 리트라이 버튼

버튼 누르면 처음 씬으로 가는건 스타트 버튼과 같으므로 그대로 붙여주면 됨

하이어라키창 UI 에서 버튼으로 리트라이버튼 만들어주고 , 게임매니저에서  public으로 리트라이 버튼 만들고

게임오버가 되면 리트라이 버튼이 true가 되면서 나타나게 만든다 

 

그러기 위해선 얘네가 이 밖에서도 작동할 수 있게 싱글톤으로 만들어줘야 하는데

 

  public static GameManager Instance; 
  //그게 이거임
  
   private void Awake()
 {
     if (Instance == null)
     {
         Instance = this;
     }
 }
 
 //그리고 스타트보다 먼저 작동하는 Awake 만들어서 저거 넣어줘야한다 
 
   if (transform.position.y < -16.0f)
  {
      GameManager.Instance.GameOver();
  }
  
  //cat 에도 y가 -16보다 낮아지면 게임오버인 함수를 넣어준다

 

게임오버일 때 타임스케일 0,

리트라이 했을 때 타임스케일 1로 해주면 된더ㅏ

 

Destroy(gameObject, 3.0f);

그리고 배부른 고양이는 3초 뒤에 사라지게 만든다.

 

 

레벨 바 만들기

레벨 바 에서 게이지가 움직이는 기준점이 Pivot

초기 설정이 0.5인데 그렇게 하면 스케일을 조정했을 때 중간점을 기준으로 줄어들고 늘어난다

그래서 Pivot X를 0으로 해주면 가장 왼쪽인 0부터 줄어들고 늘어나고 한다.

 

int level = 0;
int score = 0; 

로 레벨과 스코어를 만들어주고

 

 public void AddScore()
 {
     score++;
     score += 1;
 }

public void 를 사용해 score를 1씩 늘어나게 해주는데

여기서 ++; 를 사용해도 되고 += 을 사용해도 된다. 둘 다 같음!

 

level = score / 5;   

>> 레벨은 스코어 5마다 올라가기 때문에 레벨은 스코어를 5로 나눈 몫

>> 이번에 생각보다 힘들었던게 이런 레벨, 게이지 계산하는 거였다. 내가 머리가 나빠서..

 

GameManager.Instance.AddScore();

를 배부른고양이에 붙여 AddScore 가 되게 하는데 , 그냥 이렇게만 하면 배부른 상태에서 사라지는 중인 고양이에 맞아도

점수가 올라가는 오류가 발생하기 때문에 방어로직을 작성해 주어야 한다.

 

분명 따라적기만 했을텐데 어느순간 강의와 달라져있는 코드...

bool 은 false와 true만 나오는 거란건 알겠는데 

isFull 어쩌구 한 거는 이해를 못하겠다. 흠

 

isFull==false 는 !isFull 로 써도 된다. (느낌표는 반대로 하는 것이기 때문에)

 

레벨로 가고 남은 게이지를 표시하기 위해 

levelFront.localScale = new Vector3((score - level * 5) / 5.0f, 1f, 1f); 를 쓰는데 

(전체스코어 - 현재레벨*5)/ 5.0f

ex )  12-10/5.0f   

>>> 여기서 5.0f 를 나눠주는 이유는 소수점 값을 내기 위해서라는데....  잘 모르겠어.....

>> 여긴 다시 해보면서 이해해봐야겠다.

 

 

레벨 반영하기

fatcat 을 프리펩으로 만들어서 해준다.

cat과 성질은 같으므로 cat 스크립트를 그대로 사용하면 된다.

 

 


 

 

숙제 해적고양이 만들기

노멀캣 프리펩을 하이어라키로 옮겨서 언팩 해주면 기존 프리펩에는 영향이 가지 않는다!

이 상태에서 스프라이트 이미지 바꿔주면 됨!

 


 

이 고양이 밥주기에는 사실 엄청난 문제가 하나 있다.

마지막에 나오는 뚱뚱한 고양이는 때려도 게이지가 차지 않아서, 없애줄 수가 없다는 것!!!

이거 때문에 오류인 줄 알고 한참 해보았지만.. 강의에서도 그냥 안돼는 대로 끝내시더라!!!!!! 

 

혼자 고쳐보려 노력했는데 실패했당.

담에 꼭 고쳐보겠어

 

고양이 밥 주기는 참 재미있었지만, 1~4강 통틀어 가장 오래 걸린 게임이었다 ㅋㅋㅋ

이해가 힘든 부분이 많았고, 오류가 자꾸자꾸 나서 몇번이나 고친지 모르겠다.

isFull 을 해주는 부분은 사실 이해를 못했지만 진행을 위해 일단 지나갔던 부분이라, 다시 한번 해봐야겠다.