fullstack

[Unity] Json 파일 간단하게 Class 변환하기 (Json.NET)

Unity

Json.NET을 이용하여 Json 파일을 간단하게 Class 로 변환할 수 있다

Json.NET 에셋스토어에서 받을 수 있다

 

우선 간단한 Json 파일을 만들어 보았다

{
    "level" : 0,
    "coin" : 0
}

 

그 다음에는 이 정보를 파싱할 Class도 만들어 보자

[Serializable]
class Data
{
    int level;
    int coin;
}

 

주의할 점은 Class 에 [Serializable] 를 붙여 직렬화 해 주어야 하고, 변수명을 서로 맞춰 주어야 한다

 

TextAsset jsonData = Resources.Load("Json/Data") as TextAsset;
_data = JsonUtility.FromJson<GameData>(jsonData.ToString());

 

Json 파일은 Resources 경로에 Json/Data.json 으로 저장하여 간단하게 Resources.Load 를 이용하여 불러와 보았다

이렇게 사용하면 Json Object를 생성하여 일일히 파싱하는 번거로움을 줄일 수 있다

 

Class를 다시 Json으로 변환할때는 JsonUtility.ToJson(_data) 이런식으로 사용할 수 있다

 

 

 

[Unity] 디바이스 경로에 파일 입출력하기 (Application.persistentDataPath)

Unity

게임정보를 저장할 때 PlayerPrefabs를 쓰면 쉽고 편리하게 정보를 저장할 수 있지만, 조금 복잡하고 많은 데이터를 저장해야 할 때에는 PlayerPrefabs는 한계가 있습니다

이럴 때에는 xml 이나 json 파일을 만들어서 디바이스 내부에 파일로 정보를 저장하는 것이 좋습니다

 

우선 파일입출력을 사용하기위해서 다음과 같은 namespace를 추가해 줍니다

using System.IO;

 

저는 Json파일을 생성하여 저장정보를 저장하겠습니다

이를 위해서 JsonUtility를 사용하였습니다

 

디바이스의 저장경로는 Application.persistentDataPath 로 얻어오면 됩니다

 

먼저 파일을 쓰는 로직입니다

File.WriteAllText(Application.persistentDataPath + "/UserData.json", JsonUtility.ToJson(_data));

 

다음은 파일을 읽는 로직입니다

if (File.Exists(Application.persistentDataPath + "/UserData.json"))
{
    string json = File.ReadAllText(Application.persistentDataPath + "/UserData.json");
    _data = JsonUtility.FromJson<Data>(json);
}

 

위 예제는 최대한 간단하게 입출력만 한 예제이고, 보안을 위해서 파일을 저장할 떄 암호화를 해주면 더욱 좋습니다

 

 

 

[Unity] Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") 터치입력시 사용법

Unity

Unity 에서 마우스 움직임 값을 받아 사용하려고 Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") 를 많이 사용합니다

 

다음과 같은 코드가 있다고 가정해 보겠습니다

float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");

 

그러나 모바일 디바이스에서 이를 그대로 사용하면 값이 변형되어 원하는 결과를 얻을 수 없습니다

모바일 디바이스에서는 Input.touches 의 deltaPosition을 사용해야 합니다

 

다음과 같이 코드를 작성하면 PC와 모바일 디바이스 모두에서 정상 동작 할 수 있습니다

float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
if (Input.touchCount > 0)
{
    x = Input.touches[0].deltaPosition.x;
    y = Input.touches[0].deltaPosition.y;
}