지난 포스팅에서는 스테이지 2까지 구현하였다.
또한, SaveInformation.cs 코드를 통하여 점프 점수에 대한 누적 정보를 저장 해 두었다.
이제, 스테이지 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을 클리어하게 되면, 로비로 돌아가게 된다.
로비를 세팅 해 보도록 하자.
로비의 초기 모습이다.
로비에서의 플레이어는 인간형으로 설정 할 계획이다.
깃 헙에 파일을 올려 놓았다.
다음 포스팅에서는 로비에서와 두 번째 주제인 보스전에서 사용 될 플레이어를 만들어 보도록 하겠다.
'유니티 > 확장 프로젝트[3D]' 카테고리의 다른 글
3D 미니 프로젝트 2 - 2 ] 아이템 수집 및 장착, 교체 (2) | 2022.09.26 |
---|---|
3D 미니 프로젝트 2 - 1 ] 캐릭터 움직임 및 점프, 회피 (2) | 2022.09.20 |
3D 미니 프로젝트 4 ] 스테이지 2 컨셉 및 구성 (0) | 2022.09.12 |
3D 미니 프로젝트 3 ] 스테이지 수정 및 효과음, UI 추가 (0) | 2022.09.06 |
3D 미니 프로젝트 2 ] 스테이지 구성 및 기믹 발판 구성 (0) | 2022.09.02 |