게임 개발 공부 기록

3일차 - 멤버 카드 뒤집기 2

00lwt 2025. 1. 22. 22:02

어제에 이어 기존 스테이지에 기능 몇가지를 추가했고 이어서 기존의 스테이지뿐만 아니라

히든 스테이지를 추가해보는 시간을 가졌다.

 

기능 추가

기능 추가에서 내 역할은 타이머 아래에 슬라이더를 추가하고 시간이 경과됨에 따라 색을 변화시켜

긴박한 느낌이 들도록 하는 것이었다.

 

색의 변화는 Color.Lerp를 이용해 부드럽게 점차 변하도록 할 수 있었다.

Color.Lerp를 사용하기 위해서 작성해야 할 것에는 시작색, 종료색, 시간이 필요하다.

tSlider.value = time;
float t = Mathf.Clamp01(time / maxTime);
sliderFill.color = Color.Lerp(Color.yellow, Color.red, t);
timeTxt.color = Color.Lerp(Color.yellow, Color.red, t);

(오늘부터는 코드 블럭이라는 기능을 알게됐으니 번거롭게 캡쳐해서 넣는 짓은 그만해야겠다..)

 

히든씬

팀원 분 중에 '헬 테이커'라는 게임의 리소스를 갖고 계신분이 있어서

비록 멤버에 관련된 이미지는 아니지만 추가로 해보는 활동이라 해당 리소스를 이용해

상반된 느낌의 히든 스테이지를 만들었다.

Hidden Scene

 

히든 씬에서는 변경되는 각 오브젝트들의 배치와 게임 성공 실패 여부에 따른 캐릭터 애니메이션을 담당했다.

오브젝트 배치는 기존 단계의 구성을 가져와 리소스들을 변경해서 적용했고

 

각 단계는 CurLevel을 1, 2, 3 세개를 각각 Normal, Hard, Hidden으로 두어 관리하면서

if문으로 성공과 실패 로직을 관리하였다.

// Normal, Hard 단계
if (GameManager.Instance.CurLevel == 1 || GameManager.Instance.CurLevel == 2)
{
    // 성공
    if (GameManager.Instance.IsFinished)
    {
        clearTxt.SetActive(true);
        normalSuccessPanel.SetActive(true);
        timeTxt.enabled = false;
        board.SetActive(false);
        pauseBtn.SetActive(false);
        tSlider.gameObject.SetActive(false);

        AudioManager.Instance.SFXList.Clear();

        if (GameManager.Instance.CurLevel == 1)
        {
            GameManager.Instance.NomarlClear = true;
        }
        else if (GameManager.Instance.CurLevel == 2)
        {
            GameManager.Instance.HardClear = true;
        }
    }

    // 실패
    else if (time >= maxTime)
    {
        timeTxt.text = 30f.ToString("N2");
        Time.timeScale = 0f;
        failTxt.SetActive(true);
        timeTxt.enabled = false;
        board.SetActive(false);
        tSlider.gameObject.SetActive(false);
        pauseBtn.SetActive(false);
        AudioManager.Instance.SFXList.Clear();
    }
}

2일차에서 봤듯 성공 시에는 화면의 모든 오브젝트를 비활성화 하고

클리어 텍스트 및 팀원의 이미지와 돌아가기 버튼이 활성화 되도록 했다.

 

실패 시에도 동일하게 모든 오브젝트를 비활성화 하고 실패 버튼이 활성화 되도록 했고

누르면 StartScene으로 되돌아 가도록 구현했다.

// Hidden 단계
else if (GameManager.Instance.CurLevel == 3)
{
    // 실패
    if (time >= maxTime)
    {
        failTxt.SetActive(true);
        timeTxt.enabled = false;
        board.SetActive(false);
        pauseBtn.SetActive(false);
        tSlider.gameObject.SetActive(false);
        AudioManager.Instance.SFXList.Clear();

        hero.PlayDeathAnim();
    }

    // 성공
    else if (GameManager.Instance.IsFinished)
    {
        clearTxt.SetActive(true);
        timeTxt.enabled = false;
        board.SetActive(false);
        pauseBtn.SetActive(false);
        tSlider.gameObject.SetActive(false);
        AudioManager.Instance.SFXList.Clear();
        
        hero.PlaySuccessAnim();
    }
}
public class Hero : MonoBehaviour
{
    public Animator anim;

    public void PlayDeathAnim()
    {
        anim.SetTrigger("Fail");
    }

    public void PlaySuccessAnim()
    {
        anim.SetTrigger("Success");
    }
}

히든은 다른 부분은 동일하고 팀원의 이미지를 보여주는 SuccessPanel 대신

Hero 스크립트의 애니메이션 트리거 파라미터를 작동하는 메소드를 호출하는 부분에서 차이가 있다.

성공

 

실패

 

오늘의 회고

1. 깃허브에서 협업할 때 병합하는 과정에서 스크립트끼리 충돌이 생기면 고칠 방법이 있지만 여러명이 하나의 씬을 동시에 작업해서 생긴 충돌은 해결할 수 없다는 것을 배우게 되었다. 물론 숙련자들에겐 방법이 있지만 아직 우리에게는 버거운 수준이라고 한다. 앞으로는 역할을 분담할 때 최대한 서로의 씬을 건들지 않고 기능을 확실하게 나누어야 하고

가장 중요한 점은 메인에 바로 병합하는 것이 아니라 내 브랜치에 먼저 메인을 끌어와서 확인한 다음 정상이라면 내 브랜치를 메인에 붙이는 방식으로 진행해야 한다.

그리고 병합을 하는 사람은 다른 사람과 겹치지 않도록 꼭 본인이 하겠다고 얘기하고 끝나고도 알려줘야 한다는 점이다. 이렇게만 잘 지킨다면 웬만해서는 충돌날 일이 없을 것 같다. 

 

2. Button 컴포넌트는 UI 오브젝트에 생성해야 클릭이 감지된다는 점이다. 카드 프리펩을 복제해서 히든에서 사용하려는 과정에서 텍스트 오브젝트를 지우고 그 위의 일반 오브젝트에 생성 했더니 클릭이 되질 않아서 한참 삽질을 했다. 복제를 할거면 있는 그대로 쓸 것.. 

'게임 개발 공부 기록' 카테고리의 다른 글

5일차 - 멤버 카드 뒤집기 마무리  (0) 2025.01.24
4일차 - 멤버 카드 뒤집기 3  (0) 2025.01.23
2일차 - 멤버 카드 뒤집기  (0) 2025.01.21
1일차 - Git과 Github  (0) 2025.01.20
르탄이 카드 뒤집기  (0) 2025.01.16