- 게임 데이터를 게임이 종료된 후에도 사용할 수 있도록 저장하고 싶은 경우
- 기본 타입(type)의 데이터 말고 좀 더 복잡한 데이터를 저장하고 싶은 경우
개요
유니티에서 데이터를 저장하는 게 생각만큼 쉽지 않는 건 사실입니다. 전체 씬, 플레이어 위치 정보 등을 저장하려는 경우에그 작업량이 만만치 않습니다. 이번 튜토리얼 그리고 후에 있을 튜토리얼을 통해 유니티에서 데이터를 저장하는 좀 더 쉬운 방법을 보여드리겠습니다. 이번 튜토리얼에서는 데이터를 저장하는 몇 가지 다른 방법들과 이렇게 저장된 데이터들을 RPC 연결 / 서버에 전달해서, 게임에 사용하는 방법을 보여드리겠습니다.
가장 기본적인 방법
기본적인 방법부터 시작해 보겠습니다. 단순한 데이터형(type)에 대해서는 여러분께서 잘 알고 계실 PlayerPrefs으로 저장하는 방법을 확인 하는 차원에서 한번 알아보도록 하겠습니다. PlayerPrefs는 기본형의 데이터를 문자열키 (string key) 값과 함께 저장할 수 있도록 해줍니다. 단순한 데이터를 저장하고 불러와 사용하기에 좋은 방법입니다.
게임 내의 값들
씬 전환 시에 데이터를 저장하고 이를 공유하고 싶은 경우에 좋은 방법 중 하나는 정적 클래스 (static class)를 만들어 이 클래스에 데이터를 저장하는 방법입니다.
그리고 이 값을 읽고 싶을 때는 아래와 같이 사용하면 됩니다.
이와 같은 클래스를 사용하는 방법의 단점은 인스펙터(Inspector)에서 값을 조절할 수 없다는 점 입니다. (싱글톤으로 매니져 클래스를 구성하면 이 점은 보완할 수 있습니다..)
- 인스펙터와 코드 모두에서 값을 조절하고 싶은 경우에는 DontDestroyOnLoadobject 함수를 이용하는 방법을 고려할 수 있습니다. (아래 코드 참고)
그리고 아래와 같은 방법으로 값에 접근할 수 있습니다.
좀 더 복잡한 데이터 저장하기
위의 예제에서 PlayerPrefs를 사용해서 high score를 저장하는 방법을 살펴봤습니다. 하지만 위에서 살펴본 방법으로는 많은 데이터를 저장하는 데에는 한계가 있습니다. 따라서 아래와 같이 high score를 저장할 수 있는 테이블을 정의해서 저장하는 방법을 고려해볼 때가 왔습니다.
위의 예제를 살펴보면, List를 이용해서 ScoreEntry 클래스 정보를 담아 테이블처럼 사용합니다. 하지만 이 정보를 어떻게 저장해야 할까요? – 바로 BinaryFormatter를 사용하면 됩니다! BinaryFormatter를 사용해서 “파라미터를 갖지 않는 생성자”를 갖는 클래스라면 어떤 클래스도 바이트 배열로 변환하고, 변환된 배열을 다시 문자열 값으로 변환할 수 있습니다. (문자열 값으로 변환하면, PlayerPrefs에 저장할 수 있겠죠?) 아래 보이는 네임 스페이스들을 추가해줘야 한다는 점을 잊지 마시구요.
유니티 오브젝트 저장하기
유니티 오브젝트들을 저장하는 방법은 생각보다 까다로울 수 있습니다. 그래서 대부분 유니티 오브젝트가 갖는 값을 유추해 볼 수 있는 클래스를 새로 생성하고 이 클래스의 값을 저장합니다. 예를 들면, RPC 호출을 통해 여러 개의 AnimationStates를 전달하고 싶은 경우에, AnimationStates를 대신할 수 있는 클래스를 생성해서 이 값을 전달하게 됩니다. 다른 유니티 오브젝트의 값을 전달하려는 경우에도 상황은 마찬가지겠지요.
RPC를 통해 전달하기
아래 코드를 보면, 어떤 클래스라도 문자열로 변환할 수 있도록 하는 방법을 보여줍니다. 이를 이용하면 RPC를 통해 모든 파라미터 값을 보낼 수 있겠죠?
문서화 되지는 않았지만, RPC 역시 byte[]을 보낼 수 있습니다. 이 값은 BinaryFormatter를 이용해서 우리가 원하는 값으로 바로 변환할 수 있도록 도와줍니다. 문자열로부터 변환하는 시간을 줄여주기 때문에 더 좋다고 할 수 있습니다.
이제 highscores 값을 다른 플레이어에 전달할 수 있도록 하는 능력이 갑자기 생겼네요.
웹으로 전달하기
WWWForm 을 이용해서 웹 서버에 데이터를 전달하는 방법은 아주 쉽습니다. 하지만 위에서 보았듯이 Convert.ToBase64String()를 이용해서 바이너리 데이터를 문자열로 변환하는 방법이 제일 쉽지 않을까 생각되네요. (물론 여러분이 사용하시는 서버에 따라 달라질 수 있습니다)
파일로 저장하기
파일로 저장하는 방법도 물론 쉽습니다. 유니티가 제공하는 Application.persistentDataPath를 이용해서 파일을 저장할 위치를 정하고, MemoryStream 대신 FileStream 을 사용하면 됩니다.
결론
이번 튜토리얼을 통해서, 데이터를 저장하고 게임 중에 이 값들을 이용하는 몇몇 새로운 방법들을 익히셨으리라 생각합니다.
출처 http://unitygems.com/saving-data-1-remember-me/
위의 자료 번역했습니다. 처음 번역한거라..많이 부족하지만 읽어 주셔서 감사하고, 원문 확인 하셔도 좋을 것 같습니다.
댓글 없음:
댓글 쓰기