본문 바로가기

유니티/확장 프로젝트[3D]

3D 미니 프로젝트 4 ] 스테이지 2 컨셉 및 구성

지난 포스팅에서는 스테이지 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 스테이지의 초반 구성 모습이다.

 

2스테이지의 전체적인 컨셉은 두 갈래길이다.

 

왼쪽은 세심한 컨트롤을 이용하여 침착하게 이동해야 하고, 오른쪽은 다양한 기믹 발판, 장애물들을 잘 통과하면서 이동해야 하는 컨셉이다.

 

양 갈래의 길 중에서 한 갈래만을 선택한 뒤, 골인 지점에서 다시 만날 수 있게 할 예정이다.

 

또한, 코인 점수 역시 같은 점수로 배분할 예정이기에 한 길을 선택한 뒤, 다른 길은 선택할 수 없다.

 

선택 세이브 포인트를 먹었을 때, 벽이 활성화 되기에 세이브 포인트를 먹지 않고 코인을 먹은 다음, 다시 돌아와서 추가적으로 코인을 먹는 꼼수(?)를 방지하기 위해서 세이브 포인트를 늘리고, 통로를 좁게 하는 등의 시도를 해 보았지만 역시, 가장 좋은 것은 먹지 않고서는 진행하지 못하게 하여 사용자로 하여금 먹게 만들어 주는 것이다.

 

따라서 대쉬+점프로 닿을 수 없는 거리로 발판을 설정 한 다음, 선택 세이브 포인트(chooseRoute)를 먹게 되면 중간 발판이 생기게 만들어 주었다.

 

선택 세이브 포인트 설정 및 투명 발판 활성화

생각해 보면, 사방을 투명 벽으로 둘러싼 다음, 선택 세이브 포인트를 먹게 되면 돌아가는 쪽의 벽을 활성화 하고, 막아 놓았던 투명 벽을 비활성화 하면 더 좋았을 것 같다는 생각이 들었다...

 

 

 

스테이지 2 전체 모습

스테이지 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 에 들어간 다음

라이트 문제 해결 법 2

Auto Generate를 체크 해제하고, Generate Lighting을 눌러 준다.

 

그렇게 되면

 

파일 변경점

Scene 폴더 속에 폴더가 하나 생기게 됨을 볼 수 있을 것이다.

 

이제 다시 스테이지 1부터 시작해 보자.

 

스테이지 이동 시 라이트 적용

위 움짤처럼 스테이지 이동 시에도 라이트가 적용되었음을 볼 수 있다.

 

스테이지 2도 1처럼 적절하게 배경음악을 넣어주면 좋을 것 같다.

 

다음 포스팅에서는 스테이지 3에 대한 구성, 3 골인 시 엔딩?에 대한 것을 구현 해 보도록 하겠다.