본문 바로가기
유니티

Day 2 - 카운트다운(Coroutine & bool 활용), C# 표기형식

by shin0707 2024. 4. 16.
728x90

*카드 뒤집기 게임 :제한 시간 내에 같은 그림이 그려진 짝을 전부 맞추면 성공

 

  • 주제

>> 게임 내 기능 추가(게임오브젝트 색상 변경, 매칭실패시 남은 시간 2초 감소 등)

>> 오류 발생 및 해결(깃허브 한글 주석 부분이 외계어, 유니티 scene view에서 오디오 gizmo 생성)

>> C# 표기형식 개념

 


  • 맡은 부분

1. 카드를 두 장 뒤집었는데 그림이 서로 다른경우, 이미 한 번씩 뒤집은 카드는 색을 다르게 표시하기 (옅은 회색 등)

2. 매칭 실패할 때 마다, 제한 시간 2초 감소하기

3. 첫번째 카드를 고르고 5초 간 카운트 다운, 안 고르면 다시 닫기


  • 구현과정

1. 이미 뒤집은 카드 색상 변경

 

1-1. 카드의 색상을 변경시켜주는 함수(ChangeColor)를 Card.script에 만들기

카드 뒷부분(물음표 부분)의 spriterenderer을 변수(backColor)로 받아온다.

    public SpriteRenderer backColor;

 

1-2. GameManager에서 쓸 수 있게 public으로 ChangeColor 함수를 만든다.

(유니티에서는 1부터 255사이의 색상을 0부터 1사이의 실수값으로 변환해서 색상을 넣기 때문에

RGB 각각의 값에 255를 나누어 주어야 한다)

    public void ChangeColor()
    {
        backColor.color = new Color( 29/ 255f,  179/ 255f,  172/ 255f);
    }

 

1-3. GameManager에 Matched함수에서 매칭이 되지 않았을 경우,

첫번째 카드와 두번째 카드에 ChageColor함수를 적용한다.

            firstCard.CloseCard();
            secondCard.CloseCard();

2. 매칭 실패할 때 마다, 제한 시간 2초 감소

    public float time = 40.0f;
 
    time -= Time.deltaTime;
 
    public void Matched()
    {
        if (firstCard.idx == secondCard.idx)
        {
            ...
        }
        else
        {
            time -= 2.0f; //실패했을 시 제한 시간 2초 감소
        }

3. 첫번째 카드를 고르고 5초 간 카운트 다운, 안 고르면 다시 닫기

3-1. GameManager.cs에 카운트다운(CountDown) 함수 만들기

    public GameObject countDown;
    public Text countDownTxt;
    private float startTime;
 
    public IEnumerator CountDown()
    {
        countDown.SetActive(true);  // 오브젝트 활성화
        countDownTxt.text = "5";
        startTime = Time.realtimeSinceStartup;
        yield return new WaitForSecondsRealtime(1);
        countDownTxt.text = "4";
        yield return new WaitForSecondsRealtime(1);
        countDownTxt.text = "3";
        yield return new WaitForSecondsRealtime(1);
        countDownTxt.text = "2";
        yield return new WaitForSecondsRealtime(1);
        countDownTxt.text = "1";
        yield return new WaitForSecondsRealtime(1);
        firstCard.CloseCard(); // 첫번째카드 닫기
        countDown.SetActive(false); // 오브젝트 비활성화
        firstCard = null; // 첫번째카드 비우기
    }

  • 코루틴(Coroutine) : Update가 아닌 곳에서도 반복적으로 코드를 실행해야 할 때 사용.

작성방법:

1. 반환형 IEnumerator로 시작

ex) IEnumerator 함수이름()

 

2. yield retrun + 조건 (yield retrun가 반드시 함수 내부에 존재해야함.)

ex) yield return null;

- yield return null;  -->  다음 프레임에 실행

 

매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행

- yield return new WaitForSeconds(float); --> 유니티상 시간을 기준(TimeScale 영향 받음)

- yield return new WaitForSecondsRealtime(float) --> 현실 시간을 기준

 

실행방법:

1. StartCoroutine(함수())

2. StartCoroutine("함수")

 

중단방법:

1. StopCoroutine("함수")

2. yield break; 

 

참고사이트: https://coding-of-today.tistory.com/171

 

[유니티] 코루틴의 사용법 총정리 - Unity Coroutine

코루틴(Coroutine) 1. 어디에 쓰이는가? 우선, 코루틴이 어떤 상황에서 필요한지 알아보자. 유니티에서 특정 코드가 반복적으로 실행되기 위해서는 Update문에 코드를 작성하면 되는데, 간혹 Update가

coding-of-today.tistory.com

 

3-2. 두번째 카드의 존재유무를 알려주는 SecondPick함수 만들고, update에서 반복 실행

    bool secondPick = false;
 
    void Update()
    {
        SecondPick();
    }
 
    public void SecondPick()
    {
        if (secondCard == null)
        {
            secondPick = false;
        }
        else
        {
            secondPick = true;
        }
    }

 

3-3. 두 번째 카드를 선택하지 않을 때마다(secondCard ==null), CountDown 함수를 실행해줄 CountFlip함수 만들기

    public void CountFlip()
    {
        if (secondPick == false)
        {
            StartCoroutine("CountDown");
        }
    }

 

3-4. 카드매칭(성공이나 실패)이 이루어지면, 카운트다운 함수 중지

        StopCoroutine("CountDown"); //카운트다운 함수 중지
        countDown.SetActive(false); // 오브젝트 비활성화

 

3-5. 첫번째 카드를 선택하면, CountFlip 함수실행

Card.cs

        if (GameManager.instance.firstCard == null)
        {
            GameManager.instance.firstCard = this;
            GameManager.instance.CountFlip();
        }

  • 오류 발생 및 해결

오류1.

>>Github에서 받은 스크립트 파일의 한글 주석 부분이 외계어로 바뀜

 

해결1.

>>이미 생성된 스크립트들을 수작업으로 인코딩 교체.

>>이후 생성될 스크립트들을 위해 인코딩 UTF-8로 교체.

( Visual Studio -> 옵션 -> 텍스트 편집기 -> C# -> 코드 스타일 -> 설정에서 .editorconfig 파일 생성

-> Visual Studio에서 생성파일 열기 -> 마지막 줄에 다음 내용 추가)

[*]
charset = utf-8

 

 

참고사이트

https://velog.io/@gkswh4860/Unity%EC%97%90%EC%84%9C-C-%EC%9D%B8%EC%BD%94%EB%94%A9-utf-8%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

C# 인코딩을 utf-8로 설정해서 외계어를 번역해보자

평소대로 유니티를 하고 있었는데 이상한 언어를 보았습니다. 뭐지 저 외계어는? 하고 스크립트를 열어 보았습니다. ![](https://images.velog.io/images/gkswh4860/post/0cbfd1e2-4311-4e5c-9a08-adce2ef04

velog.io


오류2.

>>유니티 scene view에서 오디오 gizmo가 생성되어 게임오브젝트를 가림

 

해결2.

>>유니티 --> 상단 Edit --> Preferences --> Scene View --> Auto-hide gizmos 체크


  • 알고가기

>> C# 표기 형식

변수를 string으로 바꿀 때,

변수.ToString();

 

F: 실수

F0 : 소수점 없이 표기 123

ex) 변수.ToString("F0");

F1 : 소수점 한자리 123.4

F2 : 소수점 두자리 123.45

 

N: 자릿수를 표기하는 실수

N0 : 소수점 없이 표시 + 천단위마다 , 표기 1,234

N1 : 소수점 한자리 + 천단위마다 , 표기 1,234.5

 

P: 백분률

P0 : %로 표기. 0.1f -> 10%

 

D: 0을 붙이는 정수

D0 : 123

D1 : 한자리 123

D5 : 다섯자리 00123

 

소수점이 없는 경우 생략

(소수점 1번째 자리가 0으로 떨어지면 표기하지않음)

$"{value:0.#}";


  • 회고

>>색상을 변경하는 법은 강의를 통해 한 번 접해봤는데도 막상 적용하려고 하니 눈 앞이 막막했고, 

기억속에서 답을 찾으려고 하니 시간이 더 걸렸다. 모르겠으면 바로 구글을 검색하는 습관을 가져야겠다.

 

 

728x90
반응형