🎮프로젝트/Unity

[Unity/프로젝트] 02 가위바위보 게임(2)

bohemdev1 2024. 11. 24. 12:45

개요

 

게임에 필요한 핵심 기능들을 구현합니다. 본문에서 다룰 기능들은 다음과 같습니다.

  • 사용자 입력 받기
  • 승패 판정
  • 대기 애니메이션
  • 최고 점수 기록

 

 

 

구현

 

구현 단계에서 필요한 UI 관련 변수들은 다음과 같이 선언했습니다.

 

 

 

사용자 입력 받기

 

가위 바위 보 입력은 기능적으로 매우 유사하기 때문에 하나의 공통 이벤트 메서드로 작성합니다. 하지만 사용자의 입력값에 따라 연산 과정이 달라져야 하므로 사용자 입력이 가위일 경우 0, 바위의 경우 1, 보의 경우 2을 공통 이벤트 메서드 BtnSelOnClick 의 인수로 전달했습니다. 선택지마다 0~2 범위 정수를 부여한 이유는 결과 출력 단계에서 필요한 배열의 인덱스로 사용하기 위함입니다.

private void BtnGawiOnClick()
{
	ButtonOnClick(0);
}

private void BtnBawiOnClick()
{
	ButtonOnClick(1);
}

private void BtnBoOnClick()
{
	ButtonOnClick(2);
}

// 공통 이벤트 메서드
private void BtnSelOnClick(int v)
{
	// List to do
}

 

 

 

승패 판정

 

BtnSelOnClick 인수로 전달된 값을 통해 기존 가위바위보 룰에 기반하여 승리 조건을 확인합니다. 확인하는 코드는 다음과 같습니다.

private void ButtonOnClick(int v)
{
	int wIdx = (v + 1) % 3;	// 유저가 승리하는 상대 인덱스
	int lIdx = v % 3;	// 유저가 패배하는 상대 인덱스
	int dIdx = (v + 2) % 3;	// 유저가 비기는 상대 인덱스
//		:
}

 

유저의 선택이 가위(v = 0)인 경우 wIdx  lIdx  dIdx 는 다음과 같습니다.

  • 상대가 보(wIdx = 2)일 때 이깁니다.
  • 상대가 바위(lIdx = 1)일 때 집니다.
  • 상대가 가위(dIdx = 0)일 때 비깁니다.

이는 바위(v = 1), 보(v = 2)의 경우에도 정상적으로 동작합니다.

 

 

private void ButtonOnClick(int v)
{
//		:
	int ran = UnityEngine.Random.Range(0, 3);

	if (ran == wIdx)
	{
		// List to do: Win
	}
	else if (ran == lIdx)
	{
		// List to do: Lose
	}
	else if (ran == dIdx)
	{
		// List to do: Draw
	}
//		:
}

 

0~2 랜덤 생성된 정수 ran 을 비교해서 wIdx 와 값이 같을 경우 승리 판정, lIdx 와 같을 경우 패배 판정, dIdx 와 같을 경우 무승부 판정 합니다.

 

 

 

대기 애니메이션

 

일정 시간동안 사용자 입력이 없을 경우 대기 애니메이션을 재생합니다. 애니메이션은 간단하게 가위 바위 보 이미지를 순차적으로 반복 출력하도록 합니다. 애니메이션 생성 과정은 다음과 같습니다.

 

 

Project 창에 저장해놓은 이미지 리소스들을 묶어서 Hierarchy 창으로 드래그 앤 드랍 합니다.

 

② 미리 생성한 폴더에 저장합니다.

 

 

Animation 창에서 이미지 키프레임(Keyframe)을 가위-바위-보 순으로 적당한 위치에 배치합니다. 반복 주기는 약 0.1초로 설정했습니다.

 

 

④ 생성한 애니메이션의 Inspector 창에서 Loop Time 속성을 찾아 체크합니다. 체크할 경우 애니메이션을 반복 재생합니다.

 

 

 

다음은 생성한 애니메이션을 스크립트에서 재생하는 방법입니다. 애니메이션 재생 조건은 다음과 같습니다.

  • 게임 시작 시 재생
  • 사용자 입력 시 일시 정지
  • 사용자 입력 후 3초 이상 추가 입력이 없을 경우 재생

마지막의 경우 사용자 입력 간의 시간(3초)을 측정하기 위한 타이머 기능 이 필요합니다. 구현 방법은 다음과 같습니다.

void Update()
{
//		:
	if (0.0f < timer)
	{
		timer -= Time.deltaTime;  // Time.deltaTime : 1프레임 재생 시간
		if (timer <= 0.0f)
		{
			animator.enabled = true;
		}
	}
//		:
}

 

사용자 입력 이벤트 메서드에서 입력을 감지하면 timer 값을 3으로 설정합니다. 값이 3인 timerUpdate 메서드에서 deltaTime 만큼 감소시키면 3초가 지난 시점에서 timer 값은 0이 됩니다. 이 때 Animator 컴포넌트 객체인 animator 를 활성화 해주면 됩니다.

 

 

 

결과