ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 로컬 저장, 불러오기 구현 / Json 세이브로드
    유니티(Unity)/유니티 코딩 2019. 2. 16. 13:30

    해당 티스토리 페이지는 필자가 유니티 C# 개발을 하면서 학습한 내용들을 기록하고 공유하는 페이지입니다 !

    - 틀린 부분이 있거나, 수정된 부분이 있다면 댓글로 알려주세요 !

    - 해당 내용을 공유 or 퍼가도 좋으나, 출처를 꼭 명시해주세요 !

    - 해당 글의 모든 저작권은 Chameleon Studio에 있습니다.

    - 방문해주셔서 감사합니다 ^^



    썸네일 이미지입니다.유니티 로컬 저장, 불러오기 구현


    안녕하세요! 카멜레온입니다 ㅎㅎ


    오늘은 유니티 로컬 저장 구현에 대해서 알아보려고합니다.


    게임을 만든다면 유저들의 게임 데이터에 대한 관리는 필수죠?


    유저들이 신나게 게임을 즐겼는데, 저장이 되지 않아서,


    처음부터 다시 시작한다면 유저 유지율은 급감하게 되겠습니다.


    그래서,, 많은 저장 구현 방식 중


    직렬화 방식으로 제가 가장 선호하는


    Json 방식을 통해서 세이브로드를 구현해보려합니다.


    이를 통해, 얻을 수 있는 오늘의 결과물은


    1. 유니티 에디터 내에서 저장


    2. 스마트폰 내에서 저장


    이 되겠습니다.


    자, 바로 데이터를 저장하러 가봅시다 !



    프로젝트를 연 이미지입니다.프로젝트 열기



    자,, 우선 자신이 저장할 게임의 유니티 프로젝트를 엽니다.


    저는 저장 구현을 설명할 프로젝트로


    <젤랑점핑>의 프로젝트를 가져왔습니다.


    프로젝트가 열렸다면,


    스크립트를 하나 만들어봅시다.


    데이터를 관리할 스크립트를 하나 만들겠습니다.


    여러분들이 원하는 이름으로 데이터 관리 스크립트를 만들어주세요.


    저는 DataController라는 스크립트명으로 생성하였습니다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    우선 에디터부분입니다.


    System.IO는


    폴더 안에 저장 된 파일을 확인하고,


    존재 유무를 파악하여


    파일을 불러올 때 필요한 시스템입니다.


    우리는 게임 파일을


    로컬 내 폴더에


    저장하고, 또 불러올 것이기 때문에


    유니티가 지원해주는


    System.IO를 선언해줍니다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    다음으로는 데이터 컨트롤러 스크립트를 싱글톤으로 선언해줍니다.


    싱글톤에 대한 자세한 내용은


    [유니티 시작하기] 카테고리에 정리해두겠습니다.


    간단하게 설명하자면,,


    싱글톤을 사용하면


    데이터 컨트롤러를 인스턴스화하여


    데이터 컨트롤러의 스크립트를 찾지 않아도


    바로 접근할 수 있게 합니다.


    그리고 DontDestroyOnLoad 매서드로 씬 이동이 있더라도


    데이터 컨트롤러 게임오브젝트가 유지되도록 해줍니다.


    게임 재생을 누르면,


    하이어라키 창에서


    데이터 컨트롤러 게임오브젝트가 생성되는 것을 볼 수 있을겁니다.


    우선 코드를 다 입력한 후 확인해보세요 !



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    다음 코드 내용입니다.


    저장할 게임 데이터의 파일 이름을 설정해줍시다.


    ".json" 안에 게임 데이터의 파일 이름을 설정해주세요.


    .json 앞에 적으시면 됩니다.


    "OOOO.json" 이런 식으로요.


    영어로 적어주세요 !


    그 다음 public GameData를 선언했습니다.


    해당 내용을 복사 + 붙여넣기하시면 빨간 밑줄이 생길겁니다.


    LoadGameData와 SaveGameData는


    뒤에 코드가 있으니,


    코드를 다 입력하면 빨간 줄이 사라질 것이지만,


    GameData는 사라지지 않을건데,


    이건 이따가 DataController 스크립팅이 끝나고나서


    GameData 스크립트를 만들 것이기 때문에 걱정하지마세요!


    GameData의 직렬화 파일을 만들고.


    그 곳에서 이제 게임과 관련된 데이터를 넣으시면 됩니다.


    이건 좀 뒤에서 다루고,


    불러오기 기능을 먼저 봅시다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    다음은 게임 데이터에 기록한 파일 내용들을


    불러오는 내용입니다.


    만약 저장된 파일이 있다면,,


    저장된 GameData를 불러올 것이고,,


    없다면 GameData에서 설정한 게임 데이터들을


    새로 만들어 주게 됩니다.


    LoadGameData() 코드의 바로 위 코드인


    if (_gameData == null)


    이 부분에서


    게임이 시작하면 자동으로


    실행되게끔 해놨기때문에


    따로 어디서 쓸 필요가 없습니다.


    하지만,


    따로 어디서 쓸 필요가 있는 것은


    저장 관련 코드입니다.


    뭐,, 따로 저장하기 버튼을 줘서


    유저가 따로 저장하기 버튼을 누르면,


    상관없겠지만,


    자동 저장을 위해선


    게임의 중요한 부분에서 저장이 되게끔 해줍니다.


    아래 코드를 좀 더 봅시다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    저장 관련 코드입니다.


    File.WriteAllText를 사용하여,


    저장된 파일이 있다면 계속해서 덮어써줍니다.


    게임이 실행됐는데


    저장된 파일이 없다면


    데이터 파일을 만들기때문에,


    만들어진 파일에 계속 덮어쓰게 됩니다.


    간단하게 자동저장을 구현해보겠습니다.


    아래 코드를 봐주세요.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    게임이 종료되면 저장이 되게끔 했습니다.


    OnApplicationQuit() 매서드를 사용했습니다.


    OnApplicationQuit() 매서드의 자세한 설명은 >여기<에 있으니,


    따로 설명하지 않겠습니다.


    이렇게 간단하게


    게임 저장 / 불러오기 코드를 입력했습니다.


    그럼,


    빨간 밑줄이 그인 GameData 스크립트를


    만들어봅시다.


     

    GameData 스크립트를 생성하는 이미지입니다.GameData 스크립트 생성



    유니티로 돌아와서,


    GameData 스크립트를 생성해주세요.


    그 다음 GameData 스크립트를 열어줍시다.

     



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    직렬화된 GameData를 만들어봅시다.


    [Serializable]을 넣어주시고,


    GameData 안에


    원하는 게임 데이터를 넣어주세요.


    저는 간단 설명을 위해,


    사운드 관련 데이터만 남겨두었습니다.


    <젤랑점핑> 내에서 사용하고 있는


    배경음악과 효과음을


    int를 사용하여,


    0일 때는 사운드가 On


    1일 때는 사운드가 Off


    가 되게끔 해보려고 합니다.


    여러분은 게임에 관련된 모든 데이터를 넣어주세요.


    예를 들면,


    골드, 점수, 최고 점수, 스테이지 클리어 여부 등등


    이러한 데이터들을 GameData 안에 그려주세요.


    이제 저장하고 유니티로 돌아와 ▶을 눌러봅시다.

     

     

    새로운 파일 생성 이미지입니다.새로운 파일 생성



    시작이 되니,


    파일이 없었기때문에


    새로운 파일이 생성되었습니다.


    이제 이 파일에


    제가 지정한


    배경음악과 효과음에 대한 내용이 담겼겠군요.


    실행을 종료해봅시다.


    저장이 잘 되나 확인하기 위해서요.



    저장 완료 콘솔 이미지입니다.저장 완료



    저장 완료 로그가 찍혔습니다.


    저장이 잘 되고 있군요.


    위에서 언급했듯,


    게임이 종료되면 저장이 되게끔


    SaveGameData() 매서드를 넣어뒀었죠.


    다른 부분에서 저장하고 싶다면,


    DataController.Instance.SaveGameData()


    를 사용하여 저장하시면 됩니다.


    이번엔 파일이 생성되었으니,


    다시 실행을 누르면


    새로운 파일이 생성되지 않고,


    불러오기 성공로그가 뜨겠죠?


    다시 ▶을 눌러봅시다.



    불러오기 성공 콘솔 이미지입니다.불러오기 성공



    불러오기에 성공했습니다.


    여기까지 유니티 로컬 저장 구현을 완료했습니다.


    스마트폰으로 빌드해서


    여러분의 게임데이터가 저장되고 또 잘 로드되는지 확인해보세요.


    로컬 저장의 단점은 게임을 삭제하면,


    저장된 데이터 기록이 사라집니다.


    서버에 파일을 보내야


    저장된 데이터 기록을 다시 가져올 수 있는데요.


    추후에 구글 클라우드 연동과 iCloud 연동에 대해 포스팅하도록 하겠습니다.


    이제 아까 언급했던,


    -  추가로 더 보고싶으신 분들만 보셔도 무방합니다  -


    사운드 On/Off 간단 테스트를 해보겠습니다.

     

     

    사운드에 대한 설정을 하는 창의 이미지사운드 설정창



    <젤랑점핑>의 사운드 세팅창입니다.


    현재 On이 되어있고,


    Off가 되면 사운드가 꺼지게끔


    그리고 게임을 종료했다가,


    다시 실행을 해도


    이전에 게임 사운드를 Off로 설정했다면,


    저장이 된 파일이 기억하고


    사운드가 나오지 않을 것입니다.



    사운드 설정 스크립트 예시입니다.사운드 설정 스크립트 예시



    사운드와 관련된 내용입니다.


    게임 데이터의 내용을 어떻게 불러오는지 알 수 있겠습니다.


    아까 위에서


    데이터 컨트롤러를 인스턴스화 시켰었지요?


    데이터 컨트롤러를 Awake나 Start문에서 찾을 필요없이


    DataController.Instance로 쉽게


    데이터 컨트롤러의 내용을 불러올 수 있습니다.


    그래서 저는,


    DataController.Instance.gameData.BGMSound가 0이라면


    배경음악이 나오고,


    1이라면 배경음악을 나오지 않게 하였습니다.


    효과음도 마찬가지구요.


    여러분도 여러분들의 게임 데이터를


    'DataController.Instance.gameData.게임데이터내용' 으로


    필요한 부분에 쉽게 가져와보세요.


    이렇게 설정이 해놨으니,


    이제 유니티로 돌아와서 확인해봅시다.


    영상을 준비했습니다.





    3초: 사운드 설정창 입장


    7초 ~ 22초: 배경음악과 효과음 Off / On 반복


    23초: 배경음악 끄고 효과음만 킨 채로 메인로비로 나감


    25초: 배경음악은 꺼지고 버튼 효과음만 들림 (사운드 설정창으로 돌아옴)


    28초: 효과음 Off 한 채로 메인로비로 돌아옴


    30초: 게임 종료


    배경음악과 효과음 둘 다 Off 한 상태로


    30초에서 게임 종료를 했습니다.


    다시 시작하면, 


    배경음악과 효과음이 안나와야 저장이 잘 된 것이겠지요.


    38초: 게임 시작


    41초: 사운드 설정창 입장


    46초: 배경음악 On


    50초: 게임 종료


    50초에서 한 번 더 게임 종료했습니다.


    이번엔 배경음악만 On을 하고 종료했습니다.


    시작하면 배경음악이 나오나봅시다.


    55초: 게임 시작


    - 배경음악이 잘 나오고 있습니다.-


    이렇게 사운드 On / Off 테스트를 마쳤습니다.





    다음 영상은


    데이터 컨트롤러 오브젝트를 눌러보시면


    Inspector창에 게임 데이터에 관한 내용이 들어가 있을겁니다.


    아까 사운드가 0이면 소리가 나오고


    1이면 나오지 않는다고 하였죠?


    그것을 녹화한 영상입니다.


    첫번 째 영상에서 하고 있는


    사운드 처리를 이곳에서 관리하고 있다는 것을


    보여드리기 위하여 녹화한 것일뿐


    큰 의미는 없습니다 ㅎㅎ



    이번 포스팅을 통해


    게임 데이터를 저장하고 불러오기를


    구현하는 데에 성공하셨나요?


    꽤,, 긴 여정이었는데요.


    생각보다 포스팅을 작성하는 데 오려 걸렸네요 ㅠ ㅠ


    그래도 여러분들이 구현을 성공했다고 댓글을 달아주시면


    힘이 날 것 같습니다.


    그리고 저장된 파일의 위치를 알고 싶으신 분은


    유니티 - 기타에서 확인해주세요.


    저장된 파일의 위치를 정리해 둔 포스팅을 해놓겠습니다.


    만약, 구현에 어려움을 겪고 계신다면 댓글주시면


    금방 답신해드릴게요 !


    이상 포스팅을 마치겠습니다 !


    아참,, 


    카멜레온이 다뤘으면 좋겠다하는 포스팅 내용을 달아주시면,


    해당 내용에 관한 포스팅도 해보도록 하겠습니다.


    감사합니다 !


    Chameleon Studio가 만든 게임하러가기


    <젤랑점핑>

    안드로이드- market://details?id=com.Cameleon.TangTangBall

    IOS- itms-apps://itunes.apple.com/app/id1429522379



    <크러쉬팡>

    안드로이드- market://details?id=com.Chameleon.CrushPang 

    IOS- itms-apps://itunes.apple.com/app/id1450109331

    댓글

Designed by Tistory.