본문 바로가기

유니티 스파르타 캠프 1주차

1주차 게임 수정 결과

오늘은 어제 계획한대로 1주차 게임을 체크리스트를 확인하며 수정하게 되었습니다.

비교하기 쉽도록 이전과 이후의 영상을 올렸습니다.

1주차 원본
1주차 업그레이드 버전

추가된 점

  • 새로운 씬
  • 오디오
  • 다른 캐릭터와 반응형 동작 애니메이션
  • 피버시스템
  • 대형 몬스터

 

문제와 해결 경험


1번째 문제.

❌ :  피버게이지를 0.2f 씩 추가하는데도 반복하는 과정에서 0.998과 같이 코드가 이상해져 피버 게이지 이상을 넘겼습니다.

🔨 :  확인해보니 피버 게이지를 초기화할 때, 0.05f씩 감소시켰는데 그로 인해 피버 게이지가 마이너스를 가는 것이 문제였습니다. 그렇기에 0.0f 미만일 때는 0.0f로 고정하도록 하였습니다. 

//피버상태일 때,
if(isFever == true)
{
    //Invoke가 켜져 있지 않다면,
    if(isInvoke == false)
    {   //피버를 줄이는 Invoke를 실행해라.
        InvokeRepeating("FeverDown", 1f, 0.5f);
        isInvoke = true;
    }
    if(fever < 0.0f)
    {
        isFever = false;
        fever = 0.0f;
        AudioManager.Instance.musicChange();
        //피버가 종료되면 Invoke를 꺼라.
        CancelInvoke("FeverDown");
        isInvoke = false;
    }
}
        
public void FeverDown()
{
    fever -= 0.05f;
    Front.localScale = new Vector3(fever / 1.0f, 1.0f, 1.0f);
}

 

2번째 문제.

❌ :  빗물의 빠르기를 조절하고 싶은데 Invoke로 생성 중이었기에 변경이 불가능했습니다.

🔨 :  Invoke를 CancelInvoke로 지우고 다시 실행하는 것으로 속도를 줄였습니다.

void Start()
{
    InvokeRepeating("MakeRain", 0f, 1.0f);
}

void MakeRain()
{
    Instantiate(rain);
    totalRain += 1;

    if (totalRain % 10 == 0)
    {
        MakeMonster();
        InvokeSpeed();
    }
}

void InvokeSpeed()
{
    CancelInvoke("MakeRain");
    Speed = Speed - Speed * 0.3f;
    InvokeRepeating("MakeRain", 1f, Speed);
}

 

3번째 문제.

❌ :  특정 동작을 할 때, 버벅거림이 생겼습니다.

🔨 :  튜터님 찬스, 코드 상에는 큰 문제가 없었으나, 두 개의 씬에서 각각 AudioManager를 1개씩 사용하고 있었습니다. static의 경우, 충돌이 일어날 수 있으니, 최초의 실행이 필요한 곳에 하나만 두고 DontDestroy를 이용하여 옮겨서 사용해야한다고 들었습니다.  Destroy 함수가 같은 스크립트를 가진 다른 Manager를 지울 것이라 기대하였지만, 그런 용도는 아닌 거 같습니다.

private void Awake()
{
    if(Instance == null)
    {
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }
}

 

4번째 문제.

❌ :  캐릭터에 점프 애니메이션을 추가하였으나, 물방울에 밀려서 애니메이션이 정상 작동되지 않았습니다.

🔨 :  기존에 사용하던 코드에서는 OnColisionEnter2D를 사용하고 있었는데, 이는 물리효과를 받는 상태일 때 쓰는 코드였습니다. Collision 에서 is Trigger 체크를 하고 OnTriggerEnter2D로 바꾸면 물리엔진은 받지 않으며, Collision에 들어온 것에 대해 대응하는 코드를 만들 수 있습니다. 

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.CompareTag("Bubble"))
    {
        audio.PlayOneShot(clip);
        anim.SetTrigger("Isbubble");
    }
    if (collision.gameObject.CompareTag("Monster"))
    {
        audio.PlayOneShot(monsterCut);
        anim.SetTrigger("Isbubble");
    }
}

 

5번째 문제.

❌ :  IF 문에서 값을 비교하는데 계속 False 값만 나왔다.

🔨 :  public으로 선언된 변수와 Start나 Update 내에 있는 변수는 이름이 같아도 별개로 취급되는 지역변수, 전역변수이기에 이름을 작성할 때 유의하며 작성해야한다. 버그도 아닐 뿐더러 이와 관련된 문제는 검색해서 문제해결도 힘들기에 처음부터 잘 보면서 작성해야한다. 

    //public int status였다.
    int status = 0;

    
    void Start()
    {
        float x = Random.Range(-1.8f, 1.8f);
        float y = Random.Range(3.0f, 4.0f);

        transform.position = new Vector3(x, y, 0);

        Type = Random.Range(1, 7);
        renderer.sprite = Resources.Load<Sprite>($"Bird{Type}");

        //밑에 글을 int status라고 적었었다.
        status = Random.Range(1, GameManager.Instance.totalRain) + GameManager.Instance.totalScore;
        statusText.text = status.ToString();
    }

 

이외에도 배운 것

  • 버그가 많을수록 고치는데 드는 시간이 제작하는 시간의 배로 든다.
  • 올바르게 정리된 기획은 추후 기획을 확인하고, 게임을 제작할 때 길잡이가 되어 많은 도움이 된다.
  • [튜터님] 모든 참조 찾기를 통해 현재 선택한 함수가 참조된 곳을 쉽게 찾을 수 있다.
  • [튜터님] 참조된 함수를 드래그하고 F12를 누르면 그 함수의 정의된 곳을 확인할 수 있다.

 

후기

오늘 1, 2주차까지 업그레이드 버전을 만들려고 했었는데 문제가 제법 많았고 기획이 제대로 되어있지 못해 상당히 많은 시간을 소비하였습니다. 1주차도 간신히 합격점인 느낌으로 완성할 수 있었고 오늘의 문제점 및 배운 것을 마음에 되새기며, 더 성장하는 개발자가 되어봅시다.