fullstack

[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;
}

 

 

 

[Unity] Cylinder Collider 간단하게 만드는 방법

Unity

Unity 에서는 기본적으로 Cylinder Collider를 지원하지 않습니다

 

때문에 Cylinder 게임오브젝트를 Create 하면 다음과 같이 Capsule Collider가 붙게 됩니다

 

 

그래서 이렇게 사용을 한다면 충돌영역이 정확하게는 되지 않습니다

그래서 Cylinder 모양의 Collider를 사용하고 싶다면 따로 만들어야 합니다

 

 

이런식으로 Box Collider를 일정각도로 여러개 붙여서 간단하게 만들어 볼 수 있습니다

 

 

이렇게 더 많은 Box Collider를 사용 할 수록 더욱 둥글게 만들 수 있습니다

 

이 방법은 당연히 퍼포먼스적으로 좋지는 않습니다

그래도 꼭 Cylinder 모양의 Collider를 써야한다면 이런 방법으로 만들어서 쓸 수 있습니다