스탠다드반 특강 4주차 -11/4
💻 직렬화 특강
정보를 나열했다가 되돌릴 수 있다?
나열하는게 직렬화
되돌리는게 역직렬화
📌PlayerPrabs
설정값을 저장할때 좋음 / 보안상에 취약함
주로 해상도 설정같은 유저의 설정값 정도만 저장 하는 것을 추천함
📌CSV (Comma Separated Values) - 현업에서 가장 많이 쓰이는 것
엑셀을 불러와서 유니티에서 역직렬화 해서 사용가능
엑셀파일 불러오는 방법("파일명")을 작성하는데, 폴더를 만들면 경로까지 입력 해줘야함
예시 : ("경로/경로/파일명")
private Dictionary<string, string> chatData = new Dictionary<string, string>();
private void Start()
{
TextAsset csvData = Resorces.Load<TextAsset>("CSVData");
var data = csvData.TrimEnd(); //가장끝부분의 공백삭제 메서드
Deserialization(data);
}
public void Deserialization(string originData)
{
var rowData = originData.Split('\n');
for(int i = 1; i < rowData.Lenght; i++)
{
var data = rowData[i].Split(',');
chatData[data[0]] = data[1];
}
}
📌 CSV 역직렬화
public void Deserialization(string originData)
{
var rowData = originData.Split('\n');
for(int i = 1; i < rowData.Length; i++)
{
var data = rowData[i].Split(',');
chatData[data[0]] = data[1];
}
}
📌 XML : 직관적으로 되어있음.
엄격한 규칙이 정해져있고, 요소는 항상 쌍으로 존재해야한다.
public class XMLTest : MonoBehavior
{
Player player;
}
📌 XML파일 생성하기
void Start()
{
CreateXML(player);
}
void CreateXML(player p)
{
XmlDocument xmlDoc = new XmlDocument();
//xmlDoc.AppendChild(xmlDoc.CreateXmlDeClaration()); - 안적어도됨
//루트 노드
XmlNode root = xmlDoc.CreateNode(XmlNodeType.Element, "GameData", string.Empty);
xmlDoc.AppendChild(root);
//자식노드
XmlNode child = xmlDoc.CreateNode(XmlNodeType.Element, "PlayerData", string.Empty);
root.AppendChild(Child);
xmlElement nickname = xmlDoc.CreateElement("nickname");
nickname.InnerText = p.nickname;
child.AppendChild(nickname);
xmlElement nickname = xmlDoc.CreateElement("lv");
lv.InnerText = p.lv.ToString();
child.AppendChild(lv);
xmlElement nickname = xmlDoc.CreateElement("hp");
hp.InnerText = p.hp.ToString();
child.AppendChild(hp);
xmlDoc.Save("./Assets/Resources/GameDatas.xml"); //경로
AssetDatabase.Refresh(); // 에디터에서만 써야함, 빌드하기전에 삭제 필요!!!
}
📌 XML파일 로드하기
void LoadXML()
{
var t = Resources.Load<TextAsset>("GameDatas");
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(t.text);
XmlNodeList nodes = xmlDoc.SelectNodes("GameData/PlayerData");
XmlNode playerData = nodes[0];
player.nickname = playerData.SelectSingleNode("nickname").InnerText;
player.lv = int.Parse(playerData.SelectSingleNode("lv").InnerText);
player.hp = float.Parse(playerData.SelectSingleNode("hp").InnerText);
}
📌 Json : 디폴트가 되었기 때문에 편하게 쓰라고 관련기능이 이미 많음
Newtonsoft
왠만한 기능을 모두 사용가능 (속도 98ms)
LitJson
(속도 10ms)
JsonUtility
유니티에서 적극적으로 사용 권장(속도 0ms)
확장성이 안좋음....정해진 규칙이 많음
딕셔너리 직렬화가 안됨, 리스트는 됨
예외 \ 딕셔너리 직렬화를 위해서는 >> 커스텀 직렬화 [현업에서 굳이 하진 않음]
public class Character : MonoBehavior
{
public UserData userData;
private void Start()
{
Load();
}
public void Save()
{
var saveData = JsonUtility.ToJson(userData);
File.WriteAllText(Application.persistentDataPath + "/UserData.txt", saveData);
}
public void Load()
{
string loadData = File.ReadAllText(Application.persistentDataPath + "/UserData.txt");
userData = JsonUtility.FromJson(loadData);
}
}
[System.Serializable]
public class UserData
{
public string nickname;
public int lv;
public float hp;
public List<string> friends = new List<string>();
}
// 직렬화 ➡ 역직렬화 ➡ 사용
// 직렬화 ➡ 암호화 ➡ 저장 ➡ 불러오기 ➡ 복호화 ➡ 역직렬화 ➡ 사용
암호화와 복호화 하는 방법은 구글링 찾아보기!
📌 SO
리지드바디 OR 콜라이더를 넣어야 할 경우에는 무조건 SO를 사용 해야한다.
빌드했을때, 초기값이 유지 되기 때문에 설정값을 변경될 수 있는 레벨과 같은 값은 설정하지 않는다.
절대 변경되지 않을 값만 넣어야함 ( Ex : 몬스터의 이름 / 최대체력 )
📌 YAML
사용할 일 없음
'인공지능 머신러닝'에서는 볼 수 있음
💡오늘의 특강 결론 : 유니티는 프로그램의 직렬화를 역직렬화 하여 우리에게 보여준다.👀