안녕하세요 ~ 솔루션입니다. 오늘은 유니티 상에서 데이터를 저장하고 불러오는 'PlayerPrefs' 에 대해 올려보려 합니다.
이 기능은 실행시키는 기기에 레지스트값으로 저장을 시키는 기능이고 서버에 저장시키는 방법은 아닙니다 :D
(A라는 PC에서 PlayerPrefs를 이용하여 데이터를 저장해도 B라는 PC에서는 불러올 수 없습니다. 서버를 이용한 데이터 저장/불러오기가 아니기 때문에 ...)
먼저 프로젝트를 생성하고 적당히 UI를 배치했습니다. 자료형 마다 저장, 불러오는게 다른데 저는 int형과 float형으로 테스트 할 생각입니다.
값이 정상적으로 저장되고 받아와지는지 알기 위해 level과 exp 텍스트 옆에 존재하는 플러스, 마이너스 버튼으로 int값과 float값을 증감시킬 수 있게 만들고 데이터를 저장하기 위해 Save버튼과 데이터를 삭젷기 위해 Delete 버튼을 만들어 놓았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //Text UI를 사용함으로 추가시켜 줌 public class Ability : MonoBehaviour { public Text Level; //Level 값을 표시할 텍스트 public Text EXP; //EXP 값을 표시할 텍스트 private int level_stack; //level 값 private float exp_stack; //exp 값 private bool IsSave; //저장된 데이터가 있는지 확인하기 위한 bool 값 void Start () { IsSave = PlayerPrefs.HasKey("saved_level"); //saved_level 이라는 이름을 가진 키값이 존재하는지 확인 //세이브 데이터가 없다면 모든 데이터값을 초기화 if (!IsSave) { Debug.Log("저장된 데이터가 없습니다."); level_stack = 0; exp_stack = 0; } //세이브 데이터가 있다면 값을 불러옴 else { Debug.Log("저장된 데이터가 있습니다."); level_stack = PlayerPrefs.GetInt ("saved_level"); exp_stack = PlayerPrefs.GetFloat("saved_exp"); } } void Update () { Level.text = level_stack.ToString(); EXP.text = exp_stack.ToString(); } //Level값을 '+' 할 경우 public void Clicked_Plus_level () { level_stack ++; //Level을 증가 } //Level값을 '-' 할 경우 public void Clicked_Minus_level() { level_stack --; //Level을 감소 } //Exp값을 '+' 할 경우 public void Clicked_Plus_exp () { exp_stack += 0.1f; //exp를 증가 } //Exp값을 '-' 할 경우 public void Clicked_Minus_exp() { exp_stack -= 0.1f; //exp를 감소 } //'save' 버튼을 누르면 public void Clicked_Save () { PlayerPrefs.SetInt("saved_level", level_stack); //"saved_level" 이라는 키값으로 level_stack 값을 저장시킴 PlayerPrefs.SetFloat("saved_exp", exp_stack); //"saved_exp" 이라는 키값으로 exp_stack 값을 저장시킴 PlayerPrefs.Save(); //PlayerPrefs를 저장 } //'delete' 버튼을 누르면 public void Clicked_Delete () { PlayerPrefs.DeleteAll(); //Playerprefs의 모든 키 값을 삭제시킴 } } | cs |
스크립트를 작성시켜 줍니다. 하나하나 살펴보면 엄청나게 간단한 코드입니다.
PlayerPrefs와 관련된 코드를 제외하곤 아실꺼라고 생각하기 때문에 저 부분 코드만 설명하자면
IsSave = PlayerPrefs.HasKey("saved_level"); Start 메소드 안에 이 부분은 IsSave 라고 선언해놓은 bool값을 PlayerPrefs.HasKey 로 "saved_level" 이라는 키 값으로 저장한 값이 알아내는 부분 입니다. 만약 saved_level 이라는 키 값이 존재한다면 IsSave로 반환되는 값은 true가 됩니다. 반대로 존재하지 않는다면 false가 반환 되겠죠 ?
그렇게 반환받은 bool 값으로 데이터를 초기화 할지 불러올지 판단시켜 줍니다.
(제가 사용하는 방법일 뿐 꼭 거치지 않아도 되는 부분이긴 합니다만, 개인적으로는 거치고 지나가는 과정입니다.)
데이터가 없다면 초기화, 있다면 받아옵니다.
그 밖에 Button UI 클릭 이벤트를 위한 메소드는 넘어가고,
save 버튼을 클릭하면
PlayerPrefs.SetInt("saved_level", level_stack);
"saved_level" 이라는 키 값에 level_stack 값을 저장시켜줍니다.
exp값도 SetFloat으로 동일하게 키 값에 저장시켜주고 PlayerPrefs.Save(); 으로 PlayerPrefs을 저장시켜 줍니다.
Delete 버튼을 클릭하면
PlayerPrefs.DeleteAll(); 으로 PlayerPrefs에 있는 모든 키 값을 삭제시켜 줍니다.
실행시켜 보면 먼저 디버그 로그로 저장 데이터의 유무를 판단하고 출력되게 만들었습니다. 첫 실행이고 아직 데이터를 저장한 적이 없기 떄문에 'IsSave' 값은 false이니 데이터가 없다는 로그가 출력되었습니다.
플러스와 마이너스 버튼으로 값을 바꿔주고 Save 버튼으로 저장시키고 플레이 상태에서 나옵니다.
그리고 다시 실행 시키면 값이 세이브를 누른 시점의 값으로 초기화가 되는 것을 볼 수 있습니다.
디버그 로그에도 데이터가 있다고 출력되네요 !
만약 값을 조절해도 세이브 버튼을 누르지 않으면 값은 0으로 초기화됩니다.
(Start 메소드에서 저장 데이터가 없으면 0으로 초기화하라고 만들어놨기 떄문에 !)
그리고 방금 전과 똑같은 과정에서 Save버튼 대신 Delete버튼을 눌러서 저장되어 있던 세이브 데이터를 삭제 시킨 후 씬을 다시 실행시키면 저장된 데이터가 없기 때문에 0으로 초기화됩니다.
디버그 로그에도 데이터가 없다고 출력되는 것을 확인할 수 있습니다.
자 이런 식으로 유니티 씬 내에 있는 데이터 값들을 저장시키고 불러올 수 있습니다.
앞서 말했듯이 서버에 저장하는 방법이 아니기 때문에 다른 PC에서 저장한 데이터는 또 다른 PC에서 불러올 수 없습니다 ! 간단한 게임이나 네트워크를 연결하지 않는 게임들에는 간단하게 사용할 수 있는 방법이네요 ~
그 밖에 기능들을 정리해서 올립니다. 하나하나 다 나열해서 설명하기엔 포스팅이 너무 길어져서 일부분만 다룬 것이기 때문에 참고하셔서 사용하시면 됩니다 ~
[게임 정보 저장 & 불러오기 (PlayerPrefs)] [저장] PlayerPrefs.Set자료형 ("문자열 키값", 저장하려는 값"); * 문자열 키값 = 값을 저장할 문자열 이름 PlayerPrefs.SetInt(string key, int value); PlayerPrefs.SetFloat(string key, float value); PlayerPrefs.SetString(string key, string value); ex) 'tmpScore' 라는 키값 데이터를 'score' 라는 이름으로 저장하려 할 때 PlayerPrefs.SetInt ("tmpScore", score); [불러오기] PlayerPrefs.Get자료형 ("저장했던 문자열 키값", 초기화값); * 저장했던 문자열 키값 = 저장했던 문자열 이름 PlayerPrefs.GetInt (string key, int value); PlayerPrefs.GetFloat (string key, float value); PlayerPrefs.GetString (string key, string value); ex) 'bestScore' 라는 키값으로 저장된 데이터를 불러오려 할 때 PlayerPrefs.GetInt ("bestScore", 0); PlayerPrefs.Save (); // 저장하기 (필수) [그 외 기타 메소드] PlayerPrefs.DeleteAll (); //저장되어 있는 모든 키 값과 데이터 제거 PlayerPrefs.DeleteKey (string key); //특정 키 값과 데이터 값을 제거 PlayerPrefs.HasKey (string Key); //키 값이 존재하면 true 반환 [저장되는 공간] MAC = ~/Library/Preferences 폴더에 unity.[company name].[product name].plist 이름으로 저장 MAC WEB = ~/Library/Preferences/Unity/WebPlayerPrefs 바이너리 파일 아래에 저장 WINDOWS = HKCU\Software\[company name]\[product name] 레지스트리에 저장 WINDOWS WEB = %APPDATA%\Unity\WebPlayerPrefs 에 저장 * Web은 1MB 용량제한이 있고 웹 플레이어 URL당 하나의 파일 사용 가능 제한이 초과될 경우 PlayerPrefsException 을 버림
|
'Unity (C#) > Old' 카테고리의 다른 글
유니티 랜덤값 설정하기 (0) | 2019.04.26 |
---|---|
유니티 마우스 커서 숨기기와 잠그기 (2) | 2018.11.25 |
유니티 캐릭터 점프 기능 만들기 (0) | 2018.10.24 |
유니티 플레이어를 따라다니는 카메라 만들기 (3인칭 시점 카메라) (2) | 2018.10.15 |
유니티 총알(발사체) 발사하기 (6) | 2018.10.05 |
최근댓글