고양이 밥주기 게임

상원·2025년 1월 20일
0

고양이 밥주기 게임으로 생선 가게에 달려오는 배고픈 고양이들에게 음식을 줘서 생선 가게를 지키는 게임입니다.
고양이가 포만감을 채우면 만족하고 돌아가고 채우지 못하면 생선가게에 들어와 게임이 종료됩니다.
난이도는 1~4단계로 1,2단계는 고양이가 조금 더 많이 나오고 3단계는 음식을 좀 더많이 먹는 뚱뚱한 고양이, 4단계는 작고 빠른 해적고양이가 출현합니다.

스크립트는 고양이,강아지, 음식,시작버튼, 게임 매니저로 구성됩니다.


시작 버튼으로 간단하게 MainScene을 불러옵니다.

using UnityEngine.SceneManagement;

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


게임을 플레이하는 MainScene입니다.

강아지는 계속해서 음식을 고양이에게 던져주어 FishShop으로 오는것을 막습니다.

//강아지
 public GameObject food;

 void Start()
 {
     InvokeRepeating("MakeFood",0f,0.2f);
 }

 private void Update()
 {
     Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
     float x = mousePos.x;

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

     if(x < -8.5f)
     {
         x = -8.5f;
     }
     transform.position = new Vector2(x, transform.position.y);
 }

 void MakeFood()
 {
     float x = transform.position.x;
     float y = transform.position.y + 2.0f;

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

음식을 0.2초간격으로 만들게 되며 마우스의 위치를 주어진 범위를 벗어나지 않는 한에서
따라다니며 발사합니다.
Quaternion.identity로 별도의 회전값 없이 직선으로 나가도록 했습니다.

//음식
  void Update()
  {
      transform.position += Vector3.up * 0.5f;
      if(transform.position.y > 27.0f)
      {
          Destroy(gameObject);
      }
  }

음식은 강아지의 위로 나아가며 주어진 범위를 벗어나면 자동으로 파괴됩니다.

//고양이
 void Start()
 {
     float x = Random.Range(-9.0f,9.0f);
     float y = 30.0f;
     transform.position = new Vector2(x,y);

     if (type == 1) //normal
     {
         speed = 0.05f;
         full = 5.0f;
     }
     else if (type == 2) //fat
     {
         speed = 0.02f;
         full = 10.0f;
     }
     else if (type == 3)//pirate
     {
         speed = 0.1f;
         full = 5.0f;
     }
 }

 // Update is called once per frame
 void Update()
 {
     if (energy < full)
     {
         transform.position += Vector3.down * speed;
         if(transform.position.y < -16.0f)
         {
             GameManager.Instance.GameOver();
         }
     }
     else if (energy >= full)
     {
         if(transform.position.x > 0 )
         {
             transform.position += Vector3.right * 0.05f; 

         }
         else
         {
             transform.position += Vector3.left * 0.05f; 
         }
     }
 }
 private void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.gameObject.CompareTag("Food"))
     {
         if (energy < full) 
         {
             energy += 1.0f;
             front.localScale = new Vector3(energy / full, 1.0f, 1.0f);
             Destroy(collision.gameObject);

             if(energy == full)
             {
                 if (!isFull)
                 {
                     isFull = true;
                     hungryCat.SetActive(false);
                     fullCat.SetActive(true);
                     Destroy(gameObject, 3.0f);
                     GameManager.Instance.AddScore();
                 }
             }
         }
     }
 }

고양이가 생성될 때 prefabs에 미리 만들어둔 고양이들을 주어진 타입에 따라 속도,먹는 양을 부여하였습니다.
Update함수에 고양이의 포만감에 따른 행동 코드를 두어 배가 고픈상태로 생선가게에 위치하면 게임오버, 도중에 배가 부르다면 화면 중앙을 기준으로 가까운 쪽으로 퇴장합니다.
고양이가 배가 부르며 퇴장하면 점수를 얻고 레벨이 올라가는 형식입니다.

//GameManager
using UnityEngine.UI;

 private void Awake()
 {
     if (Instance == null)
     {
         Instance = this;
     }
     Application.targetFrameRate = 60;
     Time.timeScale = 1f;
 }
 void Start()
 {
     InvokeRepeating("MakeCat",0f,1f);
 }
 void MakeCat()
 {
     Instantiate(normalCat);

     // lv.1 20% 확률로 고양이를 더 생성해준다.
     if (level == 1)
     {   
         int p = Random.Range(0, 10);
         if (p < 2)Instantiate(normalCat);
     }
     else if (level == 2) 
     {
         // lv.2 50% 확률로 고양이를 더 생성해준다.
         int p = Random.Range(0, 10);
         if (p < 5) Instantiate(normalCat);
     }
     else if (level >= 3)    
     {
         // lv.3 뚱뚱한 고양이를 더 생성해준다.
         Instantiate(fatCat);
     }
     if (level >= 4)
     {
         Instantiate(pirateCat);
     }
 }

 public void GameOver()
 {
     retryBtn.SetActive(true);
     Time.timeScale = 0f;
 }

 public void AddScore()
 {
     score++;
     level = score / 5;
     levetTxt.text = level.ToString();
     levelFront.localScale = new Vector3((score - level * 5) / 5.0f, 1f, 1f);
 }

게임이 시작되면 고양이를 1초마다 끊임없이 생성하며 레벨에 따라서 고양이를 더 많이, 높은 난이도의 고양이를 조건검사에 따라 생성합니다.
고양이가 퇴장할때 사용된 AddScore함수는 GameManager를 싱글톤으로 두어 사용되게 하였고
호출 될때마다 레벨 경험치바의 Scale을 일정 비율만큼 올려주었습니다.

0개의 댓글