Hierarchy 창에서 오른쪽 클릭 후 UI->Text를 추가하면 Canvas안에 text가 생성 된다.
우선 기본적으로 Text를 추가해서 다음과 같이 설정해두었다.
시, 분, 초로 Text를 나누고 다운받아놨던 글씨체도 추가해두었다.
이제 기본 세팅을 끝냈으니 버튼을 누르면 시간을 계산하는 기능을 추가할 것이다.
버튼은 Text를 추가하는 방법과 동일하게 Hierarchy 창을 오른쪽 클릭해서 UI->Button을 눌러 생성하거나 상단바의 GameObject->UI->Button으로 추가해도 된다.
버튼을 추가하면 위와 같은 기본 버튼이 하나 생성된다. 개인적으로 유니티는 UI 중 버튼이 너무 유용하다는 생각을 했었다. 사용방법이 무궁무진하기 때문이다.
그 이유는 위 사진을 보면 알 수 있는데 가장 기본적인 사용방법으로는 마우스가 버튼 위에 있는지 아닌지에 따라서 Color도 쉽게 바꿀 수 있고 Color Tint를 Sprite Swap으로 바꾸면 버튼의 이미지를 바꿀 수도 있고 Animation으로 설정하면 Animation 효과도 넣을 수 있기 때문이다. 참 좋은 기능이다.
이제 Button 기능과 Script를 연결해야 한다.
우선 Script를 하나 만들어서 함수를 만들어준다. 나중에 추가할 기능들을 위해서 시간을 Manager로 관리해주긴 할 거지만 버튼이 눌렸는지 확인하는 '버튼'용 스크립트를 만든다. 들어가야 하는 기능은 Button을 누르면 Start가 되고 한 번 더 누르면 Stop(멈춤) 상태가 되어야 한다.
그 스크립트를 끌어다 Button에 넣어주고 아래와 같은 함수를 추가해준다.
bool ButtonActive; // 버튼이 눌렸는지 안눌렸는지 확인하는 상태
public void ClickButton()
{
if(!ButtonActive)
{
ButtonActive = true;
}
else
{
ButtonActive = false;
}
}
Button의 OnClick() 은 처음에는 List is Empty 상태, 즉 비어있지만 + 를 누르게 되면 아래와 같이 변한다.
이렇게 바뀐 부분의 None(Object)에 hierarchy창의 해당 버튼 오브젝트를 드래그해서 넣어준다. 그러면 Function 부분을 선택할 수 있게 되고 눌러보면 아래와 같이 내가 추가한 스크립트가 나온다. 그 안에 함수의 목록들도 나오게 되는데 그 중 ClickButton()을 눌러주면 버튼의 클릭과 해당 함수가 연결 된다.
버튼을 연결했으니 이제 시간초만 계산해주면 된다. 타이머 매니저를 만들기 위해 빈 오브젝트를 하나 추가해 주고 매니저용 스크립트도 하나 만들어 준다.
public class TimerCountManager : MonoBehaviour
{
bool TimerOn; // Timer가 돌아가고 있는지
void Start()
{
TimerOn = false;
}
void Update()
{
}
public void SetTimerOn()
{
TimerOn = true;
}
public void SetTimerStop()
{
TimerOn = false;
}
}
위의 스크립트는 추가한 매니저에 넣고 버튼이 눌렸을 때 Manager에 전달해 주기 위해서 Button 스크립트도 아래와 같이 수정한다.
public class TimerCtrlButton : MonoBehaviour
{
bool ButtonActive; // 지금 숫자 세고 있는지
public GameObject TimerManager;
TimerCountManager Tm;
void Start()
{
ButtonActive = false;
Tm = TimerManager.GetComponent<TimerCountManager>();
}
void Update()
{
}
public void ClickButton()
{
if(!ButtonActive)
{
// 시작해야 되는 부분
Tm.SetTimerOn();
ButtonActive = true;
}
else
{
// STop
Tm.SetTimerStop();
ButtonActive = false;
}
}
}
lpPerformanceCount = 매개변수로 현재 성능 카운터 값을 계수로 받는 변수에 대한 포인터를 넘겨준다.
반환 값은 함수가 성공하면 0 이외의 값을 리턴하고 실패하면 0을 리턴한다.
(Windows XP 이상에서는 이 기능이 항상 성공해서 0을 리턴하는 경우는 없다.)
◎ LARGE_INTEGER
여기서 쓰이는 LARGE_INTEGER는 뭘까?
QueryPerformanceCounter나 QueryPerformanceFrequency같은 함수를 사용하기 위해선 크기가 큰 정수형이 필요하다.
왜? 더 자세한 시간값을 저장하기 위해서
그래서 windows.h에 포함돼 있는 LARGE_INTEGER가 그와 같은 것이다.
부호가 있는 64비트 정수형 데이터를 저장하기 위해 선언된 사용자 정의 자료형.
LARGE_INTEGER는 구조체인데 그 안을 들여다 보면
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart; // 32bit 정수형
LONG HighPart; // 32비트 정수형
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart; // 64비트 정수형
} LARGE_INTEGER;
이렇게 되어 있다.
컴파일러가 64비트를 지원할 땐 64비트 정수형 변수에, 32비트 지원 시에는 32비트 정수형 변수에 64비트 측정값을 나눠 저장한다.
값은 64비트의 부호있는 정수형인 QuardPart에 저장되는 것이며
LowPart는 하위 32비트 DWORD형, HighPart는 상위 32비트 LONG 형이다.
64비트 중 LowPart(32bit)와 HighPart(32bit)를 둘다 사용함으로써 더 큰값을 사용할 수 있다.
◎ 사용법
#include <windows.h>
int main()
{
LARGE_INTEGER timer, start, end;
float DeltaTime;
QueryPerformanceFrequency(&timer); // 타이머의 주파수를 얻어온다.
QueryPerformanceCounter(&start); // 시작 시점의 CPU 클럭 수
// 실행할 내용
QueryPerformanceCounter(&end); // 종료 시점의 CU 클럭 수
DeltaTime = (end.QuadPart - start.QuadPart) / (float)timer.QuadPart; // 걸린 시간 계산
}