지난 포스팅에서는 스테이지 1에 대한 마무리 작업을 진행하였다.
이제 스테이지 1 → 2로 이동하는 기능과 함께 스테이지 2 구성을 먼저 해 보도록 하겠다.
점수에 대한 저장은 스테이지 2를 완성하고 난 뒤에 하도록 하겠다.
스테이지 이동 (씬 이동)
스테이지 이동은 간단하다.
Goal 오브젝트의 tag를 goal로 바꾸어 준 다음, OnTriggerEnter 함수에 아래 부분을 추가 해 주면 된다.
if(other.gameObject.tag == "goal")
{
SceneManager.LoadScene("Jump_2");
}
2 스테이지에서 3 스테이지로 넘어 갈 때는 아래에서 언급할 DontDestroyOnLoad(gameObject); 를 사용한 오브젝트 안에 스테이지 정보를 저장 해 두어 추가 조건으로 설정하면 될 것이다.
스테이지 2 컨셉 및 구성
스테이지 2를 구성 해 보도록 하겠다.
2 스테이지의 초반 구성 모습이다.
2스테이지의 전체적인 컨셉은 두 갈래길이다.
왼쪽은 세심한 컨트롤을 이용하여 침착하게 이동해야 하고, 오른쪽은 다양한 기믹 발판, 장애물들을 잘 통과하면서 이동해야 하는 컨셉이다.
양 갈래의 길 중에서 한 갈래만을 선택한 뒤, 골인 지점에서 다시 만날 수 있게 할 예정이다.
또한, 코인 점수 역시 같은 점수로 배분할 예정이기에 한 길을 선택한 뒤, 다른 길은 선택할 수 없다.
선택 세이브 포인트를 먹었을 때, 벽이 활성화 되기에 세이브 포인트를 먹지 않고 코인을 먹은 다음, 다시 돌아와서 추가적으로 코인을 먹는 꼼수(?)를 방지하기 위해서 세이브 포인트를 늘리고, 통로를 좁게 하는 등의 시도를 해 보았지만 역시, 가장 좋은 것은 먹지 않고서는 진행하지 못하게 하여 사용자로 하여금 먹게 만들어 주는 것이다.
따라서 대쉬+점프로 닿을 수 없는 거리로 발판을 설정 한 다음, 선택 세이브 포인트(chooseRoute)를 먹게 되면 중간 발판이 생기게 만들어 주었다.
생각해 보면, 사방을 투명 벽으로 둘러싼 다음, 선택 세이브 포인트를 먹게 되면 돌아가는 쪽의 벽을 활성화 하고, 막아 놓았던 투명 벽을 비활성화 하면 더 좋았을 것 같다는 생각이 들었다...
스테이지 2의 전체 구성이다.
좌, 우 갈림길 모습이다.
선택 세이브 포인트는 "chooseRoute" 라는 이름의 태그를 가지며, Player.cs에 아래와 같은 부분을 추가 해 준다.
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == "chooseRoute")
{
ReturnPos = other.gameObject.transform.position;
choose = other.gameObject.GetComponent<ChooseRoute>();
choose.onWall();
other.gameObject.SetActive(false); // 세이브 포인트를 먹었으니 비활성화
}
}
choose에 담긴 ChooserRoute.cs 코드는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChooseRoute : MonoBehaviour
{
public GameObject Wall;
public GameObject ActiveBase;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void onWall(
{
ActiveBase.SetActive(true);
Wall.SetActive(true);
}
}
onWall에서 투명 발판(ActiveBase)과, 뒤로 돌아가지 못하게 막는 벽(Wall)을 활성화 한다.
오른쪽 길 구성
오른쪽 길에서는 여러 장애물들의 이동 패턴을 관찰하고 넘어 가는 것이 중요하다.
따라서 심플한 왼쪽 길과는 달리 오른쪽 길은 새로운 장애물들을 더 추가 해 주었다.
그리고, 새로운 장애물들을 관찰하고 트라이 하는 입장에서 자주 죽는 것은 필연적이기 때문에 세이브 포인트를 많이 배치하였다.
새로운 장애물들
1. 미는 장애물
말 그대로 플레이어를 밀어서 아래로 떨어트리는 장애물이다.
2. 돌림 장애물
회전문같이 계속해서 뱅뱅 도는 장애물이다. 방심하다가는 튕겨 나가기 쉽다.
처음에는 도는 지점 끝 부분의 높이를 더 높이려 하였지만 코인 배치를 통해 난이도가 올라갈 것이라 판단하여 다시 낮추게 되었다.
위와 같이 배치 될 것이기 때문이다.
3. 커졌다 작아졌다 Type A,B
공이 커졌다가 작아졌다가를 반복 하면서 플레이어를 밀어내는 장애물이다.
위 움짤을 자세히 보면 두 가지의 타입이 있음을 볼 수 있다.
두 가지의 타입을 가지고 있어야 타이밍을 더 쉽게 뺏을 수 있기 때문이다.
스테이지 3에서도 쏠쏠하게 사용 할 예정이다.
스테이지에 코인을 배치한 모습이다.
후반부에 같은 곳에서 만나게 되는데 여기서 다른 루트로 역주행 하지 못하게 하였다.
(파이프 같은 통로의 마찰력을 0으로 만들었으며, 파이프 바닥에서 점프 카운트가 갱신되지 못하게 하였다.)
스테이지 1 → 2 에서 점수 저장
스테이지를 클리어 했을 때, 각 스테이지에서 얻은 스코어는 누적 스코어에 합산되어 저장된다.
DontDestroyOnLoad(gameObject); 를 이용하여 씬 변경 시 삭제되지 않는 오브젝트를 만든 다음, 그 안에 코드로 정보들을 저장하면 된다.
그 코드는 아래와 같다.
SaveInformation.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SaveInformation : MonoBehaviour
{
int currentStage = 1; // 현재 스테이지를 나타낸다.
int firstScore, secondScore, thirdScore; // 스테이지 1,2,3 스코어
int totalScore; // 전 스테이지 통합 스코어
int cntScore;
int fallCountone, fallCounttwo, fallCountthree; // 스테이지 1,2,3에서 떨어진 횟수
int totalFallCount; // 전 스테이지 통합 떨어진 횟수
// Start is called before the first frame update
private void Awake()
{
DontDestroyOnLoad(gameObject); // 씬이 바뀌어도 사라지지 않게한다.
Debug.Log("SaveBase");
}
void Start()
{
cntScore = 0;
totalScore = 0; // 맨 처음에 0으로 시작
Debug.Log("New Stage");
}
// Update is called once per frame
void Update()
{
}
public void SumScore()
{
// 누적 점수에 현재 스테이지 점수를 더한다.
totalScore += cntScore;
Debug.Log("점수 합산 완료, 총 점수 : " + totalScore);
}
public void addCntScore(int add)
{
cntScore += add;
switch (currentStage)
{
case 1:
firstScore += add;
break;
case 2:
secondScore += add;
break;
case 3:
thirdScore += add;
break;
}
}
public int GetStage()
{
return currentStage;
}
public void clearCntScore()
{
// 새 스테이지로 이동했을 때, 현재 점수를 초기화 한다.
cntScore = 0;
}
public void stageUp()
{
if (currentStage == 3) // 3스테이지를 클리어하면
currentStage = 0; // 0으로 초기화 하고
else // 그렇지 않으면
currentStage++; // 스테이지를 더한다.
}
}
현재가 몇 스테이지인지 나타내어 주는 currentStage가 있고, 그것을 통하여 각 스테이지별 점수를 저장 해 준다.
그리고 스테이지를 넘어갈 때, 이번 스테이지에서 얻은 점수를 더해 주는 SumScore()함수도 하나 만들어 두었다.
그리고 점수를 더해 준 다음, 현재 스코어를 초기화 해 주는 clearCntScore()도 하나 만들어 주었다.
그런데, SumScore() 마지막 부분에 clearCntScore()의 내용을 넣어 주면 안되냐는 말도 있을 것이다.
그렇지만 점수를 더하고 초기화 하는 것을 한 곳에 묶어 놓으면 스테이지를 넘어 갈 때만 쓰이게 된다.
스테이지를 넘어가지 않더라도 중간 점수를 더해 주는 것이 필요한 경우가 생기면 쓸 수도 있게끔 여지를 남겨 두었다고 생각하면 될 것 같다.
아무튼, 이렇게 만들어 주고 Player에서 goal tag에 닿는 부분을 수정 해 준다.
if(other.gameObject.tag == "goal")
{
switch (saveInfo.GetStage())
{
case 1:
saveInfo.SumScore(); // 현재 스테이지 점수를 합산
saveInfo.stageUp();
saveInfo.clearCntScore(); // 현재 스테이지 점수 초기화!(새 스테이지로 가기 때문)
SceneManager.LoadScene("Jump_2");
break;
case 2:
saveInfo.SumScore(); // 현재 스테이지 점수를 합산
saveInfo.stageUp();
saveInfo.clearCntScore(); // 현재 스테이지 점수 초기화!(새 스테이지로 가기 때문)
// SceneManager.LoadScene("Jump_3"); // 이건 아직 없지만.. 추가 해 준다.
break;
}
}
이렇게 해 주고, 1스테이지~2스테이지를 클리어 해 보자
씬 변경 시 어두워지는 현상
테스트를 진행하게 되면 이렇게 나올 것이다.
이럴 때는
Window → Rendering → Lighting 에 들어간 다음
Auto Generate를 체크 해제하고, Generate Lighting을 눌러 준다.
그렇게 되면
Scene 폴더 속에 폴더가 하나 생기게 됨을 볼 수 있을 것이다.
이제 다시 스테이지 1부터 시작해 보자.
위 움짤처럼 스테이지 이동 시에도 라이트가 적용되었음을 볼 수 있다.
스테이지 2도 1처럼 적절하게 배경음악을 넣어주면 좋을 것 같다.
다음 포스팅에서는 스테이지 3에 대한 구성, 3 골인 시 엔딩?에 대한 것을 구현 해 보도록 하겠다.
'유니티 > 확장 프로젝트[3D]' 카테고리의 다른 글
3D 미니 프로젝트 2 - 1 ] 캐릭터 움직임 및 점프, 회피 (2) | 2022.09.20 |
---|---|
3D 미니 프로젝트 5 ] 스테이지 3 구성 및 점수 저장 (0) | 2022.09.16 |
3D 미니 프로젝트 3 ] 스테이지 수정 및 효과음, UI 추가 (0) | 2022.09.06 |
3D 미니 프로젝트 2 ] 스테이지 구성 및 기믹 발판 구성 (0) | 2022.09.02 |
3D 미니 프로젝트 1 ] 플레이어 이동, 스테이지 기초 세팅 (0) | 2022.09.01 |