DataController.cs
6.34 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
public class DataController : MonoBehaviour
{
/*
container (객체) > instance(스크립트를 인스턴트화!) > gamedata (실제 들어있는 데이터 스크립트) !!!
DataController.Instance.gameData 로 데이터 안에 있는 변수들 부를수있고,
DataController.Instance.SaveGameData(); 로 저장가능~! (DataController_test참고)
*/
static GameObject _container;
static GameObject Container
{
get {
return _container;
}
}
static DataController _instance;
public static DataController Instance
{
// 싱글톤! 데이터 컨트롤러를 인스턴스화 하여 스크립트를 찾지않아도 바로 접근가능해진다.
// 모든씬에서 이 스크립트를 공유가능 (겜 재생시 데이터 컨트롤러 게임오브젝트 생성됨)
get
{
if (!_instance)
{
_container = new GameObject(); //컨테이너 라는 임시 게임오브젝트 생성
_container.name = "DataController";
_instance = _container.AddComponent(typeof(DataController)) as DataController; //해당 겜오브젝트에 이 스크립트 넣기~ Add component
DontDestroyOnLoad(_container); // 딴 씬이 로드되어도 이 오브젝트 삭제하지 말것!
}
return _instance;
}
}
public string GameDataFileName = "userdata.json";
public GameData _gameData;
public GameData gameData{
get {
if (_gameData == null) {
LoadGameData();
//SaveGameData(); 여기서 데이터 왜 세이브하는거?
}
return _gameData; //얘도 결국 _gameData를 리턴함!! 이게 싱글톤 용법인듯
}
}
public void LoadGameData() {
// filepath 가져오기~ 사용자 디렉토리/AppData/...어딘가! + 파일이름!
string filePath = Application.persistentDataPath + GameDataFileName;
if (File.Exists(filePath)) {
Debug.Log("유저데이터 불러오기 성공!");
string FromJsonData = File.ReadAllText(filePath);
_gameData = JsonUtility.FromJson<GameData>(FromJsonData);
//Array로 저장된거 다시 리스트로 불러오기!
gameData.Item_list.Clear(); //리스트..저장되는지 몰랐다..ㅠㅠㅠ 리스트도 저장되므로 리스트 일단 삭제해줌. 지금 중복저장하고있음 ㅠㅠ
gameData.Item_list.AddRange(gameData.Item_wrapobject.items_in_array);
}
else {
Debug.Log("새로운 파일 생성");
_gameData = new GameData();
}
for (int i = 0; i < gameData.Item_list.Count; i++)
{
Debug.Log("읽기 : 유저데이터에 "+ gameData.Item_list[i].id+"가 "+gameData.Item_list[i].num+"개 있습니다");
}
}
public void SaveGameData()
{
// 리스트는 저장이 안되니까.. array로 바꿔서 저장!
if (gameData.Item_list.Count != 0)
{
// 저장하기전에 어레이 다 삭제하긴 좀????
for (int i = 0; i < gameData.Item_list.Count; i++)
{
Debug.Log("저장 : 유저데이터에 " + gameData.Item_list[i].id + "가 " + gameData.Item_list[i].num + "개 있습니다");
}
Debug.Log("이제 json으로 저장합니다 "); //여기서 문제생기는데 이밑에서..Toarray에서..왜지..?
gameData.Item_wrapobject.items_in_array = gameData.Item_list.ToArray();
for (int i = 0; i < gameData.Item_wrapobject.items_in_array.Length; i++)
{
Debug.Log("저장 : ITEMLIST (Wrapper)에 " + gameData.Item_wrapobject.items_in_array[i].id + "가 " + gameData.Item_wrapobject.items_in_array[i].num + "개 있습니다");
}
}
string ToJsonData = JsonUtility.ToJson(gameData);
string filePath = Application.persistentDataPath + GameDataFileName;
File.WriteAllText(filePath, ToJsonData);
Debug.Log("유저데이터 저장완료!");
}
private void OnApplicationQuit() {
SaveGameData();
}
public void Add_item_to_PlayerData(int id, int num) {
//게임데이터 리스트에 id있으면 해당 key에 value 추가 -> 이케하면 새로 얻고 할때마다 추가,삭제하고 if문들어가긴함... 그래도 이게나을듯. 밑에거하면 갯수많아지면 항상 다검색해야하니까...
//없으면 id,value추가
bool haveitem = false;
for (int i = 0; i < gameData.Item_list.Count; i++)
{
if (gameData.Item_list[i].id == id)
{
gameData.Item_list[i].num += num;
haveitem = true;
Debug.Log("유저데이터에 아이템 추가했어요! 추가한 ID = " + id);
break;
}
}
if(!haveitem)
{
havingitem newitem = new havingitem();
newitem.id = id;
newitem.num = num;
gameData.Item_list.Add(newitem);
Debug.Log("유저데이터에 아이템 추가했어요! 추가한 ID = " + id);
}
}
public void Remove_item_from_PlayerData(int id, int num) {
bool haveitem = false;
for (int i = 0; i < gameData.Item_list.Count; i++)
{
if (gameData.Item_list[i].id == id)
{
if (num > gameData.Item_list[i].num)
{ Debug.LogError("유저데이터 : 사용하려는 아이템의 갯수가 보유하고있는것보다 많습니다"); }
else if (num == gameData.Item_list[i].num)
{ gameData.Item_list.Remove(gameData.Item_list[i]); Debug.Log("유저데이터 : " + id + "번호의 아이템을 전부 사용하셨습니다"); }
else
{ gameData.Item_list[i].num -= num; Debug.Log("유저데이터 : 남은 " + id + " 번호 아이템 갯수 = " + gameData.Item_list[i].num + "개"); }
}
}
if (!haveitem)
{
Debug.LogError("유저데이터 : 해당 아이템을 유저DB에 보유하고있지 않은데 삭제시도를 하셨습니다");
}
}
}