멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 20일차 - 고양이 게임 재시작, CCTV, 셔플

2025. 6. 12. 17:04·강의/멋쟁이 사자처럼 유니티 부트캠프

고양이 게임 다시하기

종료할 때 꺼놨던 기능들을 다시 켜주어야 한다.

OnEnable()

OnStart가 처음 1번만 실행된다면 OnEnable()은 켜질 때마다 1번씩 실행된다.

오브젝트를 껐다 켜서, OnEnable()에서 설정해줄 것이다.

하지만 실행 순서가 Awake() → OnEnable() → Start() 이므로 OnEnable()에 무작정 코드를 넣으면 맨 처음 시작되기도 전에 OnEnable()이 켜지므로 문제가 생긴다.

따라서 Start()에서 쓰던 기능들을 Awake()로 옮기고 OnEnable()에 초기화하는 기능들을 넣어준다.

CatController

void Awake()
{
    catRb = GetComponent<Rigidbody2D>();
    catAnim = GetComponent<Animator>();
}
void OnEnable()
{
    transform.localPosition = new Vector3(-7.9f, -1.18f, 0f);
    GetComponent<CircleCollider2D>().enabled = true;
    soundManager.audioSource.mute = false;
}

ItemEvent

Awake에서 초기 위치를 기억해주고 OnEnable 때마다 위치를 초기화시킨다.

private Vector3 initPos;

void Awake()
{
    initPos = transform.localPosition;
}
void OnEnable()
{
    SetRandomPos(initPos.x);
}

페이드 2번

FadeRoutine

기존 페이드아웃 되고 바로 엔딩 영상이 재생되던 부분을 페이드아웃 후 페이드인 되며 영상이 재생되게 수정하였다.

IEnumerator FadeRoutine(float fadeTime, Color color, bool isFadeStart)
{
    float percent = 0f;
    float timer = 0f; // 사용될 타이머

    while (percent < 1f)
    {
        timer += Time.deltaTime;
        percent = timer / fadeTime;
        float value = isFadeStart ? percent : 1-percent;
        fadePanel.color = new Color(color.r, color.g, color.b, value);
        yield return null;  
    }
}

bool값에 따라 percent일 지 1-percent일지 바뀌는 value를 사용하여 하나의 메소드로 페이드인과 페이드 아웃을 구현한다.

EndingRoutine

기존 영상재생과 안 쓰는 오브젝트 비활성화를 담당했던 EndingRoutine에 페이드인 메소드도 넣어준다.

// 사과 10개 획득 시 해피 비디오 실행
if (GameManager.score >= 10)
{
    fadeUI.SetActive(true);
    fadeUI.GetComponent<FadePanel>().OnFade(3f, Color.white, true); // 페이드아웃
    GetComponent<CircleCollider2D>().enabled = false;
    
    StartCoroutine(EndingRoutine(true)); // 영상 재생 및 페이드인
}

IEnumerator EndingRoutine(bool isHappy)
{
    yield return new WaitForSeconds(3.5f); // 페이드 아웃 대기
    
    videoManager.VideoPlay(isHappy); // 영상 재생 시작
    yield return new WaitForSeconds(1f);
    
    var newColor = isHappy ? Color.white : Color.black;
    fadeUI.GetComponent<FadePanel>().OnFade(3f, newColor, false); // 페이드인 실행
    
    yield return new WaitForSeconds(3f);
    fadeUI.SetActive(false);
    gameOverUI.SetActive(false);
    soundManager.audioSource.Stop();
    transform.parent.gameObject.SetActive(false); // PLAY 오브젝트 Off
}

기존 코드에서 transform.parent.gameObject.SetActive(false); 부분이 먼저 실행되어 뒷부분 코드들이 실행되지 않는 문제가 있었는데, Script를 가지고 있는 오브젝트가 비활성화되면 스크립트 내용도 실행되지 않으므로 주의한다.

해상도 조절

기존에 빌드하면 전체화면일 경우 배경이 이렇게 되는 문제가 있었다.

Stretch Fill을 하면 픽셀이 깨지더라도 늘려서 해상도에 맞춘다.

 

CCTV 실습

오브젝트 배치

기즈모

인스펙터에서 아이콘 선택하면 씬에서 기즈모를 볼 수 있다.

 

TV 안에 RawImage 배치하고 WorldSpace 모드로 변경한다.

 

Render Texture 적용

  1. RawImage에 RenderTexture 적용한다.
  2. CCTV Camera Output에 RenderTexture 적용한다.

결과

미니맵

배치

Overlay 캔버스 위에 RawImage 배치

이미지와 Orthographic 카메라에 텍스쳐 적용

위치 표시

캐릭터와 TV, 코인 위에 구체를 띄워놓음

후에 레이어 처리를 통해 게임뷰 상에서는 보이지 않게 한다.

결과

 

로또 실습

셔플

Fisher-Yates Shuffle 알고리즘을 사용한다.

Swap

두 수의 위치 바꾸기

public int[] intArray = new int[10];

void OnEnable()
{
    int ranInt1 = Random.Range(0, intArray.Length);
    int ranInt2 = Random.Range(0, intArray.Length);

    var temp = intArray[ranInt1];
    intArray[ranInt1] = intArray[ranInt2];
    intArray[ranInt2] = temp;
}

Shuffle

swap을 아주 많이 반복하면 섞인다.

 public int shakeCount = 1000;
 
 for (int i = 0; i < shakeCount; i++)
{
    int ranInt1 = Random.Range(0, intArray.Length);
    int ranInt2 = Random.Range(0, intArray.Length);

    var temp = intArray[ranInt1];
    intArray[ranInt1] = intArray[ranInt2];
    intArray[ranInt2] = temp;
}

로또 번호 출력

void Awake()
{
    for (int i = 1; i < 46; i++)
        intList.Add(i);
}

IEnumerator Start()
{
    for (int i = 0; i < shakeCount; i++)
    {
        int ranInt1 = Random.Range(0, intList.Count);
        int ranInt2 = Random.Range(0, intList.Count);

        var temp = intList[ranInt1];
        intList[ranInt1] = intList[ranInt2];
        intList[ranInt2] = temp;
        yield return new WaitForSeconds(0.001f);
    }

    List<int> resultGroup = new List<int>();
    for (int i = 0; i < 6; i++)
        resultGroup.Add(intList[i]);

    resultGroup.Sort(); // 뽑힌 번호 정렬

    string resultNumber = $"이번주 로또 번호 : {resultGroup[0]} /{resultGroup[1]} / {resultGroup[2]} / {resultGroup[3]} / {resultGroup[4]} / {resultGroup[5]} / 보너스 넘버 : {intList[6]}";
    
    Debug.Log(resultNumber);
}
'강의/멋쟁이 사자처럼 유니티 부트캠프' 카테고리의 다른 글
  • 멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 22일차 - 상속, 인터페이스
  • 멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 21일차 - 형 변환, Generic, 상속
  • 멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 19일차 - Video, Build
  • 멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 17일차 - Invoke, Coroutine, Random
로또
로또
게임 개발자 연습생의 발전 일지
  • 로또
    게임 개발 발전소
    로또
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 개발 N
        • 코딩테스트
        • JAVA
        • DB
        • Unity N
      • 강의 N
        • 패스트캠퍼스 0원 챌린지
        • 멋쟁이 사자처럼 유니티 부트캠프 N
      • 게임
        • 공부
        • 리뷰
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    2839
    dfs
    코딩테스트
    그리디
    수강료0원챌린지
    분리집합
    C4D
    패스트캠퍼스
    자료구조
    BFS
    3D웹인터랙티브
    Unity
    완전탐색
    그래프
    직장인인강
    게임개발
    Java
    오공완
    그리디알고리즘
    직장인자기계발
    백트래킹
    패캠인강후기
    트리
    환급챌린지
    C#
    멋쟁이사자처럼후기
    패스트캠퍼스후기
    패캠챌린지
    한번에끝내는프론트엔드개발초격차패키지Online
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
로또
멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 20일차 - 고양이 게임 재시작, CCTV, 셔플
상단으로

티스토리툴바