본문 바로가기

TIL

[TIL]2023-12-27 / 4일차 - 디버깅과 다듬기, 발표 준비

 

 

오늘은 이미 구현이 끝난 작업들을 다듬고 디버깅을 하는 과정, 그리고 발표를 위해 코드 리뷰를 하는 시간을 가졌다.

 

조에 코딩 유경험자들이 많아 이번 처음 해보는 나보다 디버깅을 훨씬 잘하는 분들이기에 대부분 나는 버그를 발견하고 전달한 뒤 버그를 해결하는 과정을 보고 공부하는 입장이 되었다.

 

물론 어제 못그렸던 조장의 그림도 완성했다.

 

마음에 든다 ㅎㅎ;;

 

 

 

^ 적용샷

 

보기 좋은 타이틀을 위해 간단하게 쌈마이한 타이틀도 대충 만들어 보았다

더 수려한 디자인의 배경이 만들어지며 이는 최종적으로 사용되지는 않았다

 

코딩으로 다시 넘어가면 오늘 디버깅 과정에서

다양한 버그들이 발견되었다.

 

대부분은 쉽게 해결되었다.

<다시하기를 통해 스테이지 선택 씬으로 넘어가게 되면 이미지 애니메이션이 움직이지 않던 일>

=> (시간재는함수)Time.timescale이 0이 된 것을 다시 바꿔주지 않아서 생겼던 문제, 쉽게 해결됨

 

<새로 그린 카드 이미지 적용 후 발견된 뒤집은 카드 이미지 반전 문제>

=>카드를 뒤집었을 때 Transform :

LocalScale: {x: 1, y: 2, z: 1} 이던걸 단순하게 LocalScale: {x: -1, y: 2, z: 1}로 바꿈으로서 반대로 돌도록 변경하여 해결

 

<게임을 비정상적으로 빨리 끝낼 시 게임이 끝나지 않는 문제>

=> 남은 카드 인식하는 코드 문제로 예상되어 종료 조건을 필드 위에 남은 카드 2장에서 난이도 별로 나오는 카드 갯수 만큼 카드를 미리 카운트 하고 카드 카운트가 0으로 바뀌면 종료되도록 변경하여 해결

 

<게임 실패 시에 남은 시간이 정확히 0.00초로 남지 않는 문제>

=>기존에 실패 창인 endCanvas가 활성화 될 때 Time.timescale을 0으로 바꾸는 명령을 내리던 방법에서 캔버스가 활성화되는 딜레이에 시간 차가 발생하던 것으로 문제 파악하여 새로 만들어진 카드 카운트가 0이 될 때 Time.timescale이 0이 되도록 시간 정지 방법을 변경하여 해결

 

<같은 카드를 계속 누르다 보면 한 개의 카드로도 매칭이 되어 성공으로 판정되는 문제>

=> 버튼 상태가 비활성화 되지 않아 계속 클릭되는 문제

private bool isSelf = false;
 
if(!isSelf){
if(gameManager.instance.isLock) {
btn.interactable = false;
}else btn.interactable = true;
}
 
본인으로 판정될 시 버튼을 비활성화 하는 코드 작성으로 해결
 
 
 

하지만 쉽게 해결되지 않는 버그가 하나 발생하였다.

 

기존에 추가한 구현 기능으로

카드를 클릭한 뒤 일정 시간 동안 매칭을 하지 않으면 자동으로 다시 카드가 뒤집히는 기능을 구현한 적이 있으나

이로 인해 빠른 시간 내에 다중 카드를 선택하다 보면 카드가 제대로 뒤집히지 않거나 카드가 인식되지 않는 문제가 발생하였다.

Invoke를 사용하던 코드에서 문제가 발생했다고 판단되어 여러가지 수정을 가해봤으나

확실한 해결이 되지 않았고 문제도 해결하면서 동시에 기능 개선을 하고자 조는 새로운 기능을 추가하기로 결정했다.

 

.<카드가 2장이 open 상태가 되었을 시에 다른 카드 클릭 기능이 잠금 상태로 변경>

void start()

anim.SetTrigger("Start");와 같이 카드의 코드를 불러오면 뒤집히는 모션을 수행하던 방법에서

버튼으로 변경하고 게임매니저를 I로 부르던 것에서 instance로 구분하고 isLock 함수 public bool isLock = false;을 추가 하여 변경

더보기
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI; <-추가

public class card : MonoBehaviour
{

@@ -11,72 +12,78 @@
    public AudioSource audioSource;
    float flipTime;

    private Button btn;<-추가

    private Vector3 pos;

    // Start is called before the first frame update
    void Start()
    {
        //anim.SetTrigger("Start");<-주석처리-제거
        btn = this.GetComponent<Button>();<-추가
    }

    // Update is called once per frame
    void Update()
    {
        
        if(gameManager.instance.isLock) { <- 추가
            btn.interactable = false; <- 추가
         }else btn.interactable = true; <- 추가
    }


    public void shuffle() {
        if(this.pos == null) {
            this.pos = this.transform.position;
            this.transform.position = new Vector3(0, 0, 0);
        }
        else{
            //this.transform.Translate(pos*2); <-주석처리-제거
            this.transform.Translate(pos*2); <-추가
        }
    }

    public void openCard()
    {
        audioSource.PlayOneShot(flip);
        anim.SetBool("isOpen", true);
        transform.Find("front").gameObject.SetActive(true);
        transform.Find("back").gameObject.SetActive(false);
        
        if (gameManager.I.firstCard == null) <-제거
        if (gameManager.instance.firstCard == null) <-추가
        {
            gameManager.I.firstCard = gameObject;<-제거
            gameManager.instance.firstCard = gameObject;<-추가
            //처음 카드 선택한 시간
            flipTime = Time.time;
            Invoke("closeCard", 4.0f);<-제거
            Invoke("closeCardInvoke", 5.0f);<-추가
        }
        else
        {
            gameManager.I.secondCard = gameObject;<-제거
            gameManager.I.isMatched();<-제거
            gameManager.instance.isLock = true;<-추가
            gameManager.instance.secondCard = gameObject;<-추가
            gameManager.instance.isMatched();<-추가
        }
    }

    public void destroyCard()
    {
        Invoke("destroyCardInvoke", 1.0f);
    }

    void destroyCardInvoke()
    {
        Destroy(gameObject);
        gameManager.instance.isLock = false;<-추가
    }

    public void closeCard()
    {
        Invoke("closeCardInvoke", 1.0f);
    }

    void closeCardInvoke()
    {
        transform.Find("back").GetComponent<SpriteRenderer>().color = new Color(255f / 69f, 170f / 255f, 169f / 255f);
        anim.SetBool("isOpen", false);
        transform.Find("front").gameObject.SetActive(false);
        gameManager.I.firstCard = null;<-제거
        gameManager.instance.isLock = false;<-추가
    }
}

이후에도 카드 뒤집기로 인해 발생되는 자잘한 버그들이 계속하여 발견되었다.

계속하여 코드를 크고 작게 수정하는 과정이 지속되어 이곳에 정리하여 서술하기 어려움이 생겼다.

 

버그의 갯수와 그 발생조건이 다양하여 시간관계상 전부 해결하지는 못했고 디버깅 하는 과정의 어려움을 느낄 수 있는 날이었다.

 

모르는 것이 약이라고 했던가, 버그를 발견하기 전에 다 끝났다고 생각하여 편안하던 시간이 그리워 지는 순간이었다.

 

이후 발표 준비와 영상촬영을 위해 조원들과 자신이 구현한 기능들에 대해 간략하게 리뷰해보며 대본을 준비하였고 발표와 촬영을 다른 조원분이 선뜻 맡아주어 수월하게 진행되었다.