top of page

유니티 제작 1. 비 모으기

  • 작성자 사진: 100 powerun
    100 powerun
  • 4월 8일
  • 2분 분량

위의 게임은 간단히 캐릭터가 좌우로 움직이며 비를 모으고 붉은색 비는 피하는 게임 입니다. 좌우 움직임과, 랜덤 위치 생성, 랜덤한 값 생성으로 이루어져 있습니다.



위 게임을 제작하며 새로 알게된 것들

  1. InvokeRepeating

InvokeRepeating("MakeRain", 0f, 1f);

인보크 리피팅은 특정 함수를 일정 딜레이, 일정 간격으로 계속해서 실행해주는 함수입니다.

InvokeRepeating("함수 이름", 코드가 시작된 이후 몇 초 뒤에 실행할 것인가?, 몇 초 간격으로 실행할 것인가?);

즉 Start로 넣을 경우 Update에서 지연을 시켜가며 실행하는 것 보다는 Start에 넣음으로 한번만 실행 후 계속 반복하게 만들어 최적화에 큰 도움이 되기도 합니다.


만약 InvokeRepeating을 멈추고 싶다면 CancelInvoke를 사용하면 됩니다.

CancelInvoke("함수명") //    특정 함수를 멈춤
CancelInvoke();       //     모든 반복을 멈춤

Invoke와의 차이점


Invoke는 특정 함수를 몇 초 뒤에 실행하는 딜레이를 이용할 때에 사용되고,

InvokeRepeating은 특정 함수를 몇초뒤 딜레이를 이용하는 동시에 몇 초 간격으로 반복하는지도 설정합니다.


주의사항

인보크를 사용할 때에는 함수 명을 반드시 string, 문자열로 입력해야 합니다.




  1. Time.timeScale

timeScale은 게임의 시간을 조정하는 변수로 0~1 사이의 값을 입력하여 게임의 시간을 조정할 수 있습니다.


1   - 정상속도
0.5 - 절반 속도
0   - 아이에 멈춤

이를 이용하여 게임 일시정지나 게임 멈춤, 종료 후 게임 정지 등 여러 기능을 수행할 수 있게 만들 수 있습니다.


deltatime과의 연관성

deltatime은 timeScale의 영향을 받는 변수 입니다. 즉, timeScale이 줄어들면 deltatime또한 느려지게 됩니다.


unscaledDeltatime

unscaledDeltatime은 timeScale의 영향을 받지 않는 시간으로, 아주 간단히 말해 현실 시간과 동일한 시간이라 생각하면 됩니다. 이 값은 주로 시간이나, 버프시간 등등, timeScale의 영향을 받아서는 안되는 값을 넣을 때 사용합니다.





  1. ToString()의 포맷 종류

float a = 12.3456;
Console.WriteLine(a.ToString("N2"));

결과: 12.34

이번에 처음 알게된 포맷으로 ToString()안에 문자열로 N2를 적으면 소숫점이 2자리까지만 출력됩니다. 이 이외의 포맷에 대해 한번 찾아보았습니다.


챗GPT에게 물어본 결과 이러한 종류의 포맷이 있음을 확인할 수 있습니다.


  1. "N?"

    소수점의 n자리까지 표시해 주는 포맷으로 N1은 한자리, N2는 두자리... N6는 6자리까지 표시하게 해줍니다.


  1. "F"

    N과 비슷하게 소숫점의 n자리까지 표시해 주게 하지만, 차이점이라면 콤마가 붙지 않습니다.

float a = 1234.5678;
a.ToString("N2"); //    1,234.57
a.ToString("F2"); //    1234.57

끝이 6이 아닌 7인 이유는 포맷을 할 경우 반올림이 되기 때문입니다.


  1. "C"

    C는 해당 지역 기준 화폐의 기호를 추가해줍니다. 대한민국의 기준으로는 원화 기호가 추가됩니다.


  1. "E"

    E는 지수 표기법으로 출력을 나타내는 포맷 입니다. 너무 긴 수나, 작은 수를 간단하게 표기할 때 사용합니다.

    위는 GPT에게 물어본 지수 표기법으로 1.0E+05면은 1 * 10의 5제곱이라는 예시를 통해 간단히 알수 있었습니다.


  1. "P"

    P는 백분율을 나타내주는 포맷 입니다. 100을 곱하고 %기호를 붙여주는 단순한 방식이지만, 최대값을 1로 지정하는 상황에서는 유용하게 사용할 수 있습니다.


  1. "D"

    D는 정수를 출력해주는 동시에 자릿수를 표현해주기도 합니다.

int a = 42;
a.ToString(D3); //    042
a.ToString(D4); //    0042

int값만 이렇게 바꿀 수 있습니다. 실수값을 넣을 경우 예외처리가 되거나 무시될 수 있습니다.




이건 개인적으로 놀랐던 부분으로 그간 값을 다르게 매기거나 if문을 이용해 뒤집었던 반면, 이 코드는 아주 간략하게 그 내용을 줄여 저를 놀라게 만들었습니다.


direction *= -1
 1 * -1 = -1
-1 * -1 = 1

이 점을 이용한 듯 보이지만, 이 간단한 식 덕분에 코드를 획기적으로 줄일 수 있게 되었습니다.

최근 게시물

전체 보기
25.05.07

유니티 프로젝트를 진행하며 생긴 자잘한 문제들과 해결을 정리하였습니다. 처참한 TIL작성율 작업량이 길어짐에 따라 TIL의 작성률이 바닥을 길 정도로 떨어졌습니다. 프로젝트 제작이 중심이 되다보니 TIL이 우선순위에서 밀려나 작성을 못하는 날짜가...

 
 
 

Comments


bottom of page