본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티50_게임 제작 과정 19_FileStream_완성

데이터 객체를 파일로 저장하기

앞 글에서 PlayerPrefs클래스는 저장할 데이터 양이 많으면 사용할 수 없다.

이런 경우 객체를 파일로 저장하는 방법을 사용해야 한다.

 

먼저 GameManager.cs 스크립트 안에 데이터를 담아서 관리할 클래스를 하나 만들어야 한다.

클래스명은 UserData(사용자 데이터)라고 하자.

 

class GameManager 바깥에 새 클래스 UserData를 만든다.

최고 점수를 저장할 변수 BestScore를 선언한다.

 

GameManager에서 사용하기 위해 UserData타입의 변수를 만든다.

 

클래스 객체를 파일로 저장하기

 

FileStream을 사용하기 위해 2번 줄 System.IO를 등록하고,

BinaryFormatter를 사용하기 위해 7번 줄 System.Runtime.Serialization.Formatters.Binary를 등록한다.

Serialize를 사용하기 위해 1번 줄 System을 등록한다.

 

GameManager안에 변수userData를 저장할 때 사용할 메서드를 만든다.

SaveUserData()라고 하자.

최고 점수가 바뀌면 SaveUserData메서드가 실행되도록 한다.

40번 줄에서 FileStream(파일스트림)으로 userdata.dat 파일을 만든다.

Application.persistentDataPath는 유니티에서 데이터를 저장할 경로를 미리 지정해 놓은 곳을 나타낸다.

윈도우즈의 경우 C:\Users\Name\AppData\LocalLow\company name 이다.

위 경로는 2019.2 버전의 경로이며 버전에 따라 경로가 달라질 수 있다.

 

FileMode.Create로 설정하면 같은 이름의 파일이 있다면 덮어씌워진다.

 

41번 줄에서 바이너리 포맷 객체를 만들고,

42번 줄에서 userData 객체를 직렬화(Serialization)해서 binaryFormatter에 저장한다.

43번 줄에서 file을 닫는다.

 

47번 줄에서 UserData클래스가 직렬화가 가능하도록 SerealizableAttribute 특성으로 표시한다.

 

저장하는 조건문 만들기

 

최고 점수에 사용할 텍스트 변수를 만든다.

나중에 이 변수에 Text오브젝트를 등록하면 된다.

 

어떤 경우에 SaveUserData메서드를 호출하는 지 알려줄 조건을 만든다.

 

38번 줄에 조건문을 만든다.

점수가 최고점수보다 크면

40번 줄에 BestScore에 저장하고

41번 줄에 BestScoreText의 text 에 최고점수를 문자열로 서식을 변경하여 나타낸다.

42번 줄에서 저장하는 메서드를 호출하여 저장을 완료한다.

 

이제 저장된 데이터를 불러오는 메서드를 만든다.

LoadUserData() 메서드라고 하자.

 

메서드는 if ~else문으로 작성한다.

56번 줄에 조건을 적는다.

File.Exists( )는 경로에 해당 파일이 있는 지 확인하는 메서드이다.

*exist : 존재하다, 있다

 

만약 있다면 58번 줄에 파일을 열고(Open)

역 직렬화한 후 UserData타입으로 변환 후 userData에 저장한다.

61번 줄에서 파일을 닫는다.

 

63번 줄에서 위 조건이 아니면 (즉, 해당 파일이 없으면 )

65번 줄에서 userData에 새 UserData 객체를 만들어서 저장한다.

 

참고로 저장된 파일을 불러올 때 위와 같이 if~else문을 사용하지 않고 예외처리 방법인 try ~catch문으로 작성한다면 다음과 같이 한다.

 

이제 Start() 메서드에서 게임을 시작하면 저장된 최고점수를 불러오도록 LoadUserData()메서드를 호출하자.

24번 줄에서 게임을 시작하면 LoadUserData메서드가 실행되도록 한다.

25번 줄에 BestScore를 보여주도록 문자열 서식으로 바꾸어 최고 점수 text에 넣는다.

 

이렇게 코드 작성은 끝났다.

유니티 GameManager오브젝트로 가서 Best Score Text 필드에 맞는 오브젝트를 선택해 준다.

 

게임을 실행해서 테스트한다.

테스트에 성공했다.

드디어 기나긴 게임 제작과정이 끝났다.

여기까지 무사히 완주했다면 모두에게 축하의 박수를 보낸다.

 

힘들었지만 게임에 빠진 것 처럼 재미있었다.

이제 대충 유니티에서 게임 제작이 어떻게 이루어지는지 냄새는 맡았다.

다음 게임 제작으로 실력을 더욱 향상시켜 볼 것이다.

 

끝.

Wraven...