8. 세 번째 연습 게임(2)

이규성·2023년 10월 31일
0

TIL

목록 보기
11/106

10/31 이어서 예제 연습

레벨업 구현 및 마무리

  • canvas - canvas, level 명명 - position x:250 y:500 수정
  • level 하위에 UI - Image, levelBackground 명명 - source, 알맞은 이미지 붙여넣기
  • level 하위에 UI - Text, levelText 명명 - width:20, height:100, font size:40, Bold체
  • level 하위에 UI - Image, 각 back, front 명명 - width:100, height:15, y:-70
int level = 0;
int cat = 0;

public void addCat()
{
    cat += 1;        // 고양이를 다섯마리 제거하면 1레벨이 상승
    level = cat / 5; // 0.2, 0.4~ 이렇게 늘어나지만 정수 / 정수의 값이 정수가 아닐 경우 무시하기 때문에
                        5 / 5의 값 1이 되었을 때 1레벨이 상승하는 결과가 나타난다.
}
  • gameManager.cs에 코드 추가
bool isFull = false; // 

if (isFull == false)
{
    gameManager.I.addCat();
    gameObject.transform.Find("hungry").gameObject.SetActive(false);
    gameObject.transform.Find("full").gameObject.SetActive(true);

    isFull = true;
}
  • cat.cs에 코드 추가
  • 그냥 addCat() 함수를 불러버리면 반복 실행되어 레벨이 계속해서 올라가게 된다.
    bool을 사용하여 한 번 실행이 되면 isFull=true;로 만들어주어 멈춰준다.
using UnityEngine.UI;  // text 기능을 사용하기 위해 추가

public Text levelText;
public GameObject levelFront;

public void addCat()
{
    cat += 1;
    level = cat / 5;

    levelText.text = level.ToString(); // 레벨을 문자로 출력
    levelFront.transform.localScale = new Vector3((cat - level * 5) / 5.0f, 1.0f, 1.0f);
}      // front가 0.2, 0.4~ 순차적으로 채워지게 된다.
  • gameManager.cs의 코드를 수정해 준다.

결과물 !

// gameManager.cs

void makeCat()
{
    Instantiate(normalCat);

    if (level == 1)
    {
        float p = Random.Range(0, 10);     // 0~10 중 임의의 숫자를 p로 초기화
        if (p < 2) Instantiate(normalCat); // p가 2보다 작을 때 nomalCat을 추가로 생성
    }
    else if (level >= 2)
    {
        float p = Random.Range(0, 10);
        if (p < 5) Instantiate(normalCat); // 레벨이 높으니 더 많이 !
    }
}
  • 레벨 별 난이도를 설정해 준다.
// cat.cs
public int type;
  • 레벨 3부턴 fatCat을 등장시켜야 하는데 nomalCat과 같은 cat.cs를 적용한다. 차이를 두기 위해 public int type; 코드를 추가하여 각 타입 별로 코드를 적용할 수 있다.

  • script component에 타입 설정이 생겼다. nomalCat은 type:0
// cat.cs
void Start()
{
    float x = Random.Range(-8.5f, 8.5f);
    float y = 30.0f;
    transform.position = new Vector3(x, y, 0);

    if (type == 1) // type:1인 fatCat은 energy가 10
    {
        full = 10.0f;
    }
}
// cat.cs
void Update()
{
    if (energy < full)
    {
        if (type == 0) // type:0이라면 내려오는 속도가 y-0.03
        {
            transform.position += new Vector3(0.0f, -0.03f, 0.0f);
        }
        else if (type == 1) type:1이라면 내려오는 속도가 y-0.015
        {
            transform.position += new Vector3(0.0f, -0.015f, 0.0f);
        }

        if (transform.position.y < -16.0f)
        {
            gameManager.I.gameOver();
        }
    }
    else
    {
        if (transform.position.x > 0)
        {
            transform.position += new Vector3(0.05f, 0.0f, 0.0f);
        }
        else
        {
            transform.position += new Vector3(-0.05f, 0.0f, 0.0f);
        }
        Destroy(gameObject, 3.0f);
    }
}
  • 기존의 cat.cs에 fatCat을 등장시키기 위해 코드를 수정해 준다.
  • 여기서 if문과 else문 사용에서 약간의 혼동이 있었다.. C# 기본기가 부족함을 느낀다.
// gameManager.cs
void makeCat()
{
    Instantiate(normalCat);

    if (level == 1)
    {
        float p = Random.Range(0, 10);
        if (p < 2) Instantiate(normalCat);
    }
    else if (level == 2)
    {
        float p = Random.Range(0, 10);
        if (p < 5) Instantiate(normalCat);
    }
    else if (level >= 3) // 레벨 3 이상부터 fatCat을 등장시킨다.
    {
        float p = Random.Range(0, 10);
        if (p < 6) Instantiate(normalCat);

        Instantiate(fatCat);
    }
}

결과물 !

하지만 replay 버튼 클릭 시 food가 생성되지 않는다.

// gameManager.cs
void Start()
{
    InvokeRepeating("makeFood", 0.0f, 0.1f);
    InvokeRepeating("makeCat", 0.0f, 1.0f);
    Time.timeScale = 1.0f; // gameOver()에서 멈춰놓았던 시간을 다시 흐르게 한다.
}

  • 레벨이 10이 넘어가면 levelText가 제대로 출력되지 않는 버그를 발견, Inspector를 적절하게 수정

마지막으로 레벨 4에 등장하는 pirateCat을 추가하고 완성 !

코드 수정하며 가지고 놀기 ~

// cat.cs - void update - if문 아래
if (transform.position.y < -16.0f)
{
    Destroy(gameObject); // y=-16.0에서 오브젝트 삭제
    gameManager.I.gameOver();
}
  • 게임이 끝나고 남아있는 고양이들을 불필요한 자원으로 판단하여 사라지게 했다
// gameManager.cs
void makeFood()
{
    float x = dog.transform.position.x;
    float y = dog.transform.position.y + 2.0f;
    Instantiate(food, new Vector3(x, y, 0), Quaternion.identity);
    Instantiate(food, new Vector3(x-3.0f, y, 0), Quaternion.identity);
    Instantiate(food, new Vector3(x+3.0f, y, 0), Quaternion.identity);
}
  • 탄막 슈팅 게임은 역시 총알이 여러 갈래로 나가는 맛이 아닐까? 수정해보았다.

전지전능해진 기분..!

Feedback

각 코드들에 대한 이해도가 늘어날 수록 기존의 예제에서 기능을 추가하고 변경하고 싶은 욕구가 계속해서 생긴다. 상당히 재밌고 나중에는 내가 만든 이미지들로도 만들어 보고 싶다!

강의 완강 후 추가해볼 기능들

  • 특정 아이템 획득 시 총알갯수 증가
  • 총알의 궤적이 직선이 아닌 다양하게 바꿔보기
  • 보스 추가, 보스는 닿으면 죽는 오브젝트를 발사한다..!

1개의 댓글

comment-user-thumbnail
2023년 11월 1일

와 멋지십니다!!

답글 달기