Programming 

static 키워드를 파일 경로와 URL 표현에 사용하기


작성 기준 버전 :: 2019.1.4f1


유니티 엔진으로 게임을 만들 때, 스크립트 작업은 대부분 C# 스크립트로 이루어진다. 한 때 유니티 초기에는 자바 스크립트(Java Script)나 부(Boo) 같은 언어도 지원을 했었지만, 최신 버전의 유니티 엔진은 C#만을 지원한다. 그렇기 때문에 C#에서 지원하는 기본적인 문법을 충분히 배우고 활용하는 법을 공부해야한다.


이번에는 유니티에서 static 키워드를 활용하여 파일 경로와 URL 표현에 사용하는 방법에 대해서 알아볼 것이다. C#의 static 키워드에 대한 기본적인 내용은 링크를 통해서 확인할 수 있다.



파일 경로와 URL 표현


public class FileLoader : MonoBehaviour

{

    void Start()

    {

        LoadSomeFile(Application.dataPath + "/Save/" + "fileName.txt");

    }


    public void LoadSomeFile(string filePath)

    {

        // 파일을 로드하는 작업...

        Debug.Log(filePath);

    }

}


public class UrlDownloader : MonoBehaviour

{

    void Start()

    {

        StartCoroutine(DownloadSomeFile("https://SomeUrl/GameData/" + "fileName.png"));

    }


    public IEnumerator DownloadSomeFile(string filePath)

    {

        UnityWebRequest request = new UnityWebRequest(filePath);


        yield return request.SendWebRequest();


        var data = request.downloadHandler.data;

        // URL에서 받아온 데이터로 작업...

    }

}


모든 프로그래밍도 마찬가지겠지만 게임 프로그래밍 역시 게임 저장/불러오기나 네트워크 게임이라면 게임 데이터 받아오기 등의 파일 경로와 URL을 다루어야 할 일이 발생한다. 하지만 위의 코드처럼 경로와 URL을 코드에 하드코딩을 해버리면 나중에 파일 경로나 URL이 바뀌는 경우가 발생했을 때, 변경된 경로를 모두 찾아서 바꾸어야 하는 번거로움이 발생한다. 그리고 그 중에 하나라도 놓치는 경우가 발생한다면, 그것은 곧바로 게임이 제대로 동작하지 않은 버그로 직행한다.


이러한 문제를 막기 위해서 게임에서 사용되는 모든 경로는 하나의 클래스로 묶어두고 그 클래스에서 경로를 가져오도록 만드는게 좋다. 다만 클래스에서 경로를 불러올 때는 객체를 생성하지 않고 곧바로 불러올 수 있게 하는 것이 좋다. 바로 그런 점에서 static 키워드를 적용하면 매우 좋다.


public static class GamePath

{

    public static string savePath = Application.dataPath + "/Save/";

}


public static class GameURL

{

    public static string GameDataURL = "https://SomeUrl/GameData/";

}


위 예시 코드처럼 정적 클래스와 정적 변수를 만들어서 경로를 표현한다.


public class FileLoader MonoBehaviour

{

    void Start()

    {

        LoadSomeFile(GamePath.savePath + "fileName.txt");

    }


    public void LoadSomeFile(string filePath)

    {

        // 파일을 로드하는 작업...

        Debug.Log(filePath);

    }

}


public class UrlDownloader MonoBehaviour

{

    void Start()

    {

        StartCoroutine(DownloadSomeFile(GameURL.GameDataURL + "fileName.png"));

    }


    public IEnumerator DownloadSomeFile(string filePath)

    {

        UnityWebRequest request = new UnityWebRequest(filePath);


        yield return request.SendWebRequest();


        var data = request.downloadHandler.data;

        // URL에서 받아온 데이터로 작업...

    }

}

 

경로를 사용할 때는 바로 위 예시 코드처럼 사용하면 된다. 그러면 만약에 경로가 변경되었을 때, 모든 코드에서 수정된 경로를 일일이 찾아서 바꿀 필요없이 GamePath 클래스와 GameURL 클래스의 경로만 수정하면 모든 코드에 적용이 된다.


이런 식으로 코드 내에 상수로 들어가지만, 추후에 변경이 발생할 수 있는 부분을 정적 클래스로 묶어서 관리하면 좋다.

반응형

+ Recent posts