Prosto

따라하는 유니티 2D 프로젝트ⓐ -10 본문

Programing/Unity 3D

따라하는 유니티 2D 프로젝트ⓐ -10

Prosto 2016. 9. 23. 13:06

 

따라하는 유니티 2D 프로젝트ⓐ 강좌 열 번째 시간입니다.

 

이번에 다룰 내용은 최고점수 저장 점프 대기 시간 중에도 카운트 할 수 있도록 변경,

또 점프 수정(약간 바꾼 중력식), 보너스 포인트 아이템 추가입니다.

(Text Color 수정에 대한 부분도 마지막에 넣었습니다.

이번 시간에 PlayerPrefs으로 최고점수 저장까지가 가장 기본 틀 개념의 부분이고,

그 후의 점프 수정이나 보너스 스코어 아이템은 게임성을 높이는 부가적인 부분입니다.

(최고점수 저장, 스코어 아이템 모두 복잡하지 않게 사용할 수 있도록 작성했습니다.)

 

 

 

 

그럼 시작하겠습니다.

 

 

가장 먼저 저번에 작업했던 프로젝트를 실행합니다. 그리고 순서대로 직접 해보며 따라오시면 됩니다.

 

 

일단 BEST SCORE 처리를 해볼까요?

ScoreManager.cs로 들어가서

bestScorePoint 변수를 선언해주고,

Awake()에서 PlayerPrefs.GetInt를 통하여 값을 얻어옵니다.

(만약 PlayerPrefs에 해당되는 이름의 값이 없다면 초기값을 받아옵니다. int형은 0으로요.)

 

그리고 게임오버 시 호출되는 EndCountScore() 함수에서

 if문을 통하여 현재 얻은 점수가 아까 PlayerPrefs를 통하여 얻은 값보다

큰지를 확인합니다.

만약 크다면 bestScore를 새로운 스코어 값으로 변경하고,

PlayerPrefs.SetInt를 통하여 플레이어프리팹의 BestScore 값도 바꿔줍니다.

(PlayerPrefs는 이렇게 간단하게 저장하고 사용 가능합니다.)

[PlayerPrefs 값은 게임이 꺼져도 다시 실행 시 저장되어있습니다.]

 

UIevnet.cs 스크립트로 들어가서

실제 게임이 끝났을 때 지금까지의 최고점수를 표시해주는 부분을 수정합니다.

간단하게 처리하기 위하여 PlayerPrefs값을 그대로 얻어왔습니다.

 

PlayerPrefs에 저장할 때는 PlayerPrefs.SetInt("이름", 값); 형식으로 사용하고,

PlayerPrefs에 저장된 값을 가져올 때는 PlayerPrefs.GetInt("이름"); 형식으로 사용합니다.

이때 Int 부분은 자료형으로 Int(정수), Float(실수), String(문자열)이 있습니다.

저장하여 사용할 필요가 있는 값에 따라 맞춰 사용하시면 됩니다.

 

여기까지 하고 실행해보시면 게임 결과 화면에서

BEST : 점수...

부분이 옳바르게 출력되는 것을 확인할 수 있습니다.

물론 게임을 다시 시작해도 그 최고점수가 유지되는 것도 확인할 수 있고요.

 

여기까지해서 저번 시간이 못 했던 최고점수 저장까지 마쳤습니다.

 

 

이 다음부분부터는 디테일한 부분을 잡아주고 게임성을 올리기 위한 부분을 해주니

참고하시라고 올립니다.

 

 

먼저 디테일한 부분을 잡아봅시다.

지금까지는 점프 게이지를 모으려면 착지한 후만 가능했지만,

사실 착지 전부터 클릭을 유지한 후 도착하고 곧바로 점프할 상황도 있을 수 있겠죠?

그런 상황에 게이지도 못 모으고 끝난다면... 문제가 있겠죠?

수정해봅시다.

 

먼저 PlayerAction.cs를 열어주세요.

(위 사진 두 개가 Update() 부분 전체입니다.)

그리고 우리가 클릭을 체크하던 부분이 있는 Update 부분입니다.

어떻게 수정됐는지 볼까요?

일단 점프 중에도 시간 체크를 시작할 수 있도록

클릭이 시작되는 부분 체크는 if(!jumpOn) 바깥으로 뺐습니다.

(반대로 얘기하면 버튼업만 점프 중이 아닌지 체크하는 거죠.)

 

여기서 1은 공통 조건(얼음상태)

2는 1과 2로 나뉘고요. (크게 보면 클릭 다운, 클릭 업)

나머지는 디테일한 부분들이죠.

여기서 보면 checkTime이 0인지를 확인하여 시간체크를 강제로 종료해주기도 하죠.

(시간체크되는 부분이 동시에 실행된다면 문제가 있으니 바뀌었습니다. 여기선 예외처리가 들어가고요.)

 

(바뀐 CheckButtonDownSec() 코루틴)

기본 0.08초를 최소로 해뒀죠? 이 부분은 최소 높이 설정을 위하여 해뒀습니다.

 

JumpAction() 코루틴 부분도 바뀐 게 보시이시나요?

여기서 tempJumpTime이라는 게 추가되었고,

tempJumpTime = checkTime; checkTime = 0;이 부분을 통해

점프가 실행됐을 때부터는 cechkTime은 더 이상 관계 없도록 만들었습니다.

(그래야 점프 중 checkTime을 또 쓸 수 있겠죠? - 점프 중 클릭 시간 측정...)

 

tempJumpTime으로 기존의 checkTime자리를 모두 변경해주세요.

 

아래쪽 부분에 애니메이션 실행을 위하여 사용된 checkTime도 tempJumpTime으로 바꿔주세요.

 

그리고 실행해보면 실제로 점프 중에도 별도로 마우스 클릭 충전이 가능해진 것을 확인할 수 있습니다.

 

 

 

다음으로 간단하게 우리가 사용하던 점프를 더 스타일 좋게 바꿔볼까요?

실제 중력을 받는 것처럼요.

(중력처럼 가속을 더 받는 거죠. 대신 일정 수준까지만요.)

 

PlayerAction.cs에서 실제 점프를 실행하던 부분이 이렇게 바뀌었습니다.

점프파워 부분 초기 설정은 거의 그대로지만,

float tempFloat = 0.09f;부분부터 바뀌었죠?

이 tempFloat 부분이 가속을 더 붙여주는 부분입니다.

while 내부를 보면 가속이 최소치, 최대치 제한한 게 보이죠?

 

 

점프 부분 수은 이렇게

간단하지만 복잡한 스크립트 수정 한 부분으로 끝났습니다.

실제로 게임을 실행해보면 적용이 된 것을 확인할 수 있을 것입니다.

 

 

이번 시간의 마지막으로 보너스 포인트를 주는 오브젝트를 추가해볼까요?

먼저 대강 아이콘을 만들어줍니다.

 

그럼 다음으로 현재 우리 프로젝트에 그림을 추가해줘야겠죠?

추가 방법은 또 간단하게 드래그 앤 드랍 방법을 통하여 추가해줍니다.

 

설정은 Pixels Per Unit 200, Generate Mip Maps 해제해주시고 Apply!

 

 

그리고 많이 했었죠? 이미지를 Hierarchy 패널에 드래그 앤 드랍하여

게임오브젝트를 만들어주시고요.

(위 사진처럼 Sprite Renderer에 plusPoint_prosto 스프라이트가 기본으로 추가되어있죠.)

 

거기에 Add Component로 Circle Collider 2D를 추가해주세요.

(Is Trigger 체크해주세요. - OnTrigger 함수 사용할 것이기 때문에..)

 

Script를 생성하여 작성해줍니다.

PlusScoreInfo라는 이름으로 만들어줬네요.

 

보면 ObstacleInfo와 비슷한 형태로 사용하죠.

하지만 여기서는 점수 추가가 목적이기에 내용이 다릅니다.

 

여기서 먼저 static 변수를 볼까요?

static 변수를 사용하면 해당 스크립트에서 모두 공통으로 공유하여 사용됩니다.

(예를 들어 한 프리팹이 Instatiate를 통하여 10개 생성되었다면 거기에 있는 스크립트도 각각 있으니 10개겠죠?

그 스크립트에서 변수 int temp;가 있다면 그것도 스크립트마다 있으니 각각 10개겠지요?

그런데 여기서 int temp;를 static int temp;로 선언하여 사용한다면. 프리팹을 10개를 만들든 100개를 만들든

모두 공통 변수로 사용되는 것입니다. 어떤 오브젝트 하나가 temp = 100;이라고 변경했다면,

다른 오브젝트들도 똑같이 100으로 사용되는 거죠...

*요점은 클래스 멤버 변수로 static을 사용하니

같은 클래스에서 해당 변수를 공유하는 것이라고 보시면 됩니다.)

 

Awake에서 null인 경우만 체크하는 것도 한번 받으면 전체가 공유하니 다시 받을 필요가 없기 때문입니다.

 

OnTriggerEnter2D() 함수를 보면

ObstacleInfo에서와 마찬가지고 충돌체의 태그가 Player인지 확인하죠?

그리고 맞다면 scoreManager를 통하여 200점 추가해주고요.

(저는 다르게 하겠지만.. 지금은 간단하게 하는 게 좋을 것 같아서 200점 추가로 구성했습니다.)

 

 

그렇게 작성을 완료했다면

plusScoreObj로 만들어둔 객체에 드래그 앤 드랍으로

PlusScoreInfo(스크립트 컴포넌트)를 추가해주세요.

 

다음으로 우리가 가지고 있는 Prefabs 폴더에 넣어서 추가해주고,

추가되어 파란 이름으로 바뀌었다면

Hierarchy에서 제거해주시고요.

 

 

그럼 이제 실제로 PlusScoreObj(보너스스코어 아이템)가 등장할 수 있도록 해줘야겠죠?

 

GameManager에서 작동 중인 MoveMap.cs 스크립트를

수정하면 되겠네요. 열어주세요.

기본적으로 큰 형태는 장애물과 비슷하게 했습니다.

(스크립트가 빠졌죠? 여기선 필요가 없어 제거했습니다.)

비슷하게 구성하면 추가하기도 편하고, 관리면에서도 좋죠.

(이번에도 오브젝트 풀로 만들어줍니다.)

 

(Create - 오브젝트 풀 생성하는 부분입니다. 가장 밑에 추가해주세요. : CreateObss()함수 밑)

 

AddPSs()함수도 비슷하죠?

여기서 함수의 두 번째 인자는 level로 사용했습니다.

(높이단계로요. 저는 장애물 바로 위쪽에 위치시키고 싶었습니다.

아슬아슬하게 피하면 점수를 더 얻을 수 있도록 말이죠.)

 

그래서 tempVec.y = 1.2(반지름) + 1.25(장애물 기본) + 1.25x(장애물높이레벨) + 0.3(여유 간격)

으로 구성했습니다. 상수들끼리는 합쳐서 놓았고요.

 

장애물과 비슷해서 나머지는 별도로 설명을 크게 할 부분은 없네요.

 

제거하는 부분도 비슷하지만,

중간에 보너스 포인트를 먹는다면 비활성화될 테니,

추가적으로 실제 오브젝트 활성화 상태(obj.activeSelf)를 확인하여

정말로 활성화되어있다면 제거하도록 하였습니다.

 

Awake에서 장애물 오브젝트 풀 생성할 때

보너스아이템도 오브젝트 풀 생성 함수 호출해주시고요.

 

기존에 사용하던 부분 그대로입니다.

주황색으로 체크된 부분이 추가됐죠.

(PSs는 Obs바로 아래에 함수가 추가된 게 보이실 겁니다.)

 

노랑색으로 체크된 부분은 tempLevel을 통해 높이 설정을 하도록 했습니다.

기존의 부분도 높이로 변경했죠.

AddedObs(i, 1[임시]) -> AddedObs(i, tempLevel)

결국 장애물 관련 부분도 줄줄이 바뀌게 됩니다.(아주 조금씩)

(1. MoveMap의 AddedObs(int tileN, int level) )

(2. ObstacleInfo의 SetObstacle(int lv) )

 

수정은 마치셨다면 이제 오브젝트를 연결해줍시다.

 

여기까지 하셨다면,

실제로 게임 실행 시 플러스점수가 추가되었고,

먹는다면 점수가 더욱 증가되는 것을 확인할 수 있습니다.

 

하지만 먹고나서 똑같이 숫자만 올라가니 구분이 안 가죠..?

그렇다고 이펙트를 다루기에는 지금은 무리가 있는 것 같고요..

 

그래서 일단! 텍스트 색상을 잠깐 변경시켜

먹었다는 것을 나타낼 수 있도록 하겠습니다.

간단하게 적용할 수 있으니 여기까지 따라해보세요.

 

ScoreManager.cs를 열어

Color 변수를 두 개 선언해줍니다.

(하나는 변경할 색상을 갖고, 하나는 원래의 색상을 갖도록)

 

1번은 scoreTx 텍스트에 접근하여 가지고 있는 color를 사용하여 Color값을 설정했습니다.

2번은 실제 사용하고 싶은 색상의 RGB값을 통하여 설정했습니다.

(R,G,B  0-255까지 표현 -> 0-1.0f까지 표현)

 

점수가 추가되면 색상을 변경해줄 함수를 만듭니다.

코루틴과 연결시켜주고요.

effColor로 바꿨다가

0.5초 후 다시 원래 색상으로 바꿔주는 간단한 코루틴입니다.

 

PlusScoreInfo.cs에 추가해줍니다.

200점 얻음 + 텍스트 색상 변경

플레이어와 충돌 시

두 가지 함수를 호출한 후, 현재 오브젝트 비활성화를 하게 되는 거죠.

 

 

(보너스 아이템을 먹었을 때 텍스트 색상 변경된 모습)

 

 

지금까지 따라하는 유니티 2D 프로젝트ⓐ -10번 강좌를 보셨습니다.

이번 시간에는 최고 점수를 PlayerPrefs에 저장하여 게임 종료 시에도 데이터가 저장이 되도록 만들었고,

점프 관련 부분들을 조금 더 좋게 바꿔봤습니다.

또, 게임 내에 먹을 수 있는 아이템(그 중 스코어)을 추가했고, 그 효과를 적용시켜 봤습니다.

이런식으로 하나씩 추가해가며 자신만의 게임을 만들 수 있겠죠?

 

 

 

 

다음 유니티 2D 프로젝트ⓐ의 열한 번째 강의에서는..

일종의 스테이지 상승효과로

장애물 관련 업그레이드를 진행하겠습니다.

(난이도 관련 부분)

 

이번 강의인 프로젝트ⓐ는 11강이 마지막입니다.

11강이 끝난 후 간단한 후기를 별도로 올려 마치고,

빠른 시일 내에 준비하여 다른 형태의 게임인 프로젝트ⓑ를 진행하도록 하겠습니다.

 

 

고생하셨습니다. 따라오며 하니 어떤가요? 도움은 좀 됐나요?

그럼 프로젝트의 다음 단계를 진행하며 나오는 새로운 것들에 대해서는

지금과 같이 설명하며 진행하도록 하겠습니다.

 

 

궁금한 점 있으시면 댓글이나 따로 메일로 질문하시면 시간되는 대로 답변드리겠습니다. ( 연락 )

Comments