본문 바로가기

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

3D 미니 프로젝트 5 ] 스테이지 3 구성 및 점수 저장

지난 포스팅에서는 스테이지 2까지 구현하였다.

 

또한, SaveInformation.cs 코드를 통하여 점프 점수에 대한 누적 정보를 저장 해 두었다.

 

이제, 스테이지 3을 구성 해 보고, 스테이지 3을 클리어 하게 되면 점수 정보들을 파일로 저장 해 보도록 하겠다.

 


스테이지 3 구성

 

스테이지 3 전경

 

스테이지 3의 컨셉은 한 바퀴를 돌아 돌아오는 것이다.

 

다 만들고 나서 보니, 실질적인 난이도는 스테이지 2의 오른쪽 길보다 많이 쉽게 설정된 것 같다.

 

이번 점프 맵에서 카메라 구도가 한정적이다 보니 앞으로 가는 것이 어렵게 될 수 밖에 없어서 마지막 구간은 미끄럼틀과 같은 일자 맵으로 만들어 두었다.

 

이번 3 스테이지에서 새롭게 추가 된 오브젝트들을 소개하겠다.


추가된 오브젝트들

 

새로 추가 된 발판들은 1번을 제외하고 스테이지 2에서의 발판과 같이 애니메이션 기능을 이용하여 만들어 주었으며, 위치에 영향을 받지 않게끔 Rotation 요소들을 많이 이용하였다.

 

1. 페이크 발판

페이크 발판

말 그대로 페이크를 주는 발판이다.

 

딛을 수 없는 발판이다.

 

대신, 색을 조금 더 진하게 설정 해 주어 구분할 수 있게 만들어 두었기 때문에 한 번 빠지게 되면 다시는 빠지지 않는다.

 

2. 뱅뱅이

 

뱅뱅이

뱅글뱅글 돌면서 플레이어를 밀어버리는 장애물이다.

 

타이밍에 맞게 물 흐르듯이 지나 가 주어야 한다.

 

 

3. 뱅뱅 발판

뱅뱅 발판

뱅글뱅글 도는 발판이다.

 

생각보다 타이밍을 잡기가 어렵기에 예측하여 점프 해 주어야 한다.

 

 

4. 자동 시소 발판

자동 시소 발판

자동으로 시소처럼 움직이는 발판이다.

 

마찰력을 0으로 설정 해 두어 미끄러지기 쉬우니 조심해서 가 주어야 한다.


파일에 점수 저장

 

3 스테이지를 클리어 하게 되면 누적 점수들을 파일에 저장 해 보도록 하겠다.

 

SaveInformation.cs에서 클래스를 하나 만들어 그 안에 정보를 넣고 직렬화 하여 바이너리 파일로 저장 해 보도록 하겠다.

 

using System.IO;
using System.Runtime.Serialization.Formatters.Binary; // BinaryFormatter 클래스 사용을 위해 네임스페이스 추가

[System.Serializable]
public class Info{

    public int firstScore, secondScore, thirdScore;
    public int totalScore;

    public int cntScore;

    public int fallCountone, fallCounttwo, fallCountthree; // 스테이지 1,2,3에서 떨어진 횟수
    public int totalFallCount; // 전 스테이지 통합 떨어진 횟수


    public Info(int cnt, int total)
    {
        this.cntScore = cnt;
        this.totalFallCount = total;
    }

}

SaveInformation.cs의 변경점 중 일부이다.

 

새롭게 Info 클래스를 만들어 주었다.

 

public class SaveInformation : MonoBehaviour
{
    Info info = new Info(0, 0); // 맨 처음에 0으로 시작

    int currentStage = 1; // 현재 스테이지를 나타낸다.

    // Start is called before the first frame update

    private void Awake()
    {
        DontDestroyOnLoad(gameObject); // 씬이 바뀌어도 사라지지 않게한다.
        Debug.Log("SaveBase");
    }

    void Start()
    {
        Debug.Log("New Stage");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void SumScore()
    {
        // 누적 점수에 현재 스테이지 점수를 더한다.
        info.totalScore += info.cntScore;
        Debug.Log("점수 합산 완료, 총 점수 : " + info.totalScore);

    }

    public void addCntScore(int add)
    {
        info.cntScore += add;

        switch (currentStage)
        {
            case 1:
                info.firstScore += add;
                break;
            case 2:
                info.secondScore += add;
                break;
            case 3:
                info.thirdScore += add;
                break;

        }
    }

    public int GetStage()
    {
        return currentStage;
    }

    public int GetCntScore()
    {
        return info.cntScore;
    }

    public int GetTotalScore()
    {
        return info.totalScore;
    }

    public void clearCntScore()
    {
        // 새 스테이지로 이동했을 때, 현재 점수를 초기화 한다.
        info.cntScore = 0;
    }

    public void stageUp()
    {
        if (currentStage == 3) // 3스테이지를 클리어하면
            currentStage = 1; // 1로 초기화 하고
        else // 그렇지 않으면
            currentStage++; // 스테이지를 더한다.
    }

    public void SaveInfoToFile()
    {

        string fileName = "jumpScoreInfo";
        string path = Application.dataPath + "/" + fileName + ".dat";

        FileStream fs = new FileStream(path, FileMode.Create); // 파일 통로 생성
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(fs, info); // 직렬화 하여 저장

        Debug.Log("파일 저장 완료");

        fs.Close();


    }

    public void LoadInfoFile()
    {
        string fileName = "jumpScoreInfo";
        string path = Application.dataPath + "/" + fileName + ".dat";

        if (File.Exists(path))
        {
            // 만약 파일이 존재하면

            FileStream fs = new FileStream(path, FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            Info info = formatter.Deserialize(fs) as Info; // 역 직렬화 후, 클래스 형태에 맞는 객체에 다시 저장

            Debug.Log("저장 된 현재 점수 : " + info.cntScore);
            Debug.Log("저장 된 누적 점수 : " + info.totalScore);

            fs.Close();
        }
        else
        {
            // 파일이 존재하지 않으면
            Debug.Log("파일이 존재하지 않음");
        }
    }

}

그리고 파일로 저장, 로드하는 부분을 만들어 준다.

 

앞선 Info에 들어 있는 정보들을 path(저장 경로)에 직렬화 하여 바이너리 파일로 저장해 준다.

 

저장 된 파일

저장 된 파일은 위와 같이 나오게 된다.

 


로비 초안

 

스테이지 3을 클리어하게 되면, 로비로 돌아가게 된다.

 

로비를 세팅 해 보도록 하자.

 

로비 초안

로비의 초기 모습이다.

 

로비에서의 플레이어는 인간형으로 설정 할 계획이다.

 

 

깃 헙에 파일을 올려 놓았다.

 

다음 포스팅에서는 로비에서와 두 번째 주제인 보스전에서 사용 될 플레이어를 만들어 보도록 하겠다.