유니티 엔진 (Unity Engine)

[Unity C#] 파일 경로 분리와 경로 구분자 변환: 두 가지 접근법 비교

원소랑 2024. 12. 6. 18:20

Unity에서 파일 경로를 다룰 때, 디렉토리 경로파일명을 분리하거나, 경로 구분자(\, /)를 통일해야 하는 상황이 자주 발생합니다.
이번 포스트에서는 경로를 효율적으로 처리하는 두 가지 방법, System.IO.Path를 활용한 방식string.Substring을 활용한 방식을 비교하고, Unity 환경에 맞게 경로 구분자를 통일하는 팁을 함께 소개합니다.


파일 경로 분리가 필요한 이유

게임 개발에서는 파일 경로를 다루는 일이 필수적입니다. 아래와 같은 작업에서 디렉토리와 파일명을 분리해야 하는 경우가 자주 있습니다:

  • 특정 파일만 선택적으로 불러오기
  • 파일명을 기준으로 데이터를 처리하기
  • 경로에 특정 디렉토리를 추가하거나 변경하기

파일 경로 분리 방법: 두 가지 접근법

파일 경로를 처리하는 방법은 크게 두 가지로 나눌 수 있습니다:

  1. System.IO.Path를 사용하는 직관적인 방법
  2. string.Substring을 활용한 직접적인 처리 방법

1. System.IO.Path를 활용한 경로 분리

System.IO.Path는 .NET에서 제공하는 파일 경로 처리 전용 라이브러리로, Unity에서도 바로 사용할 수 있습니다.

코드 예제

using System;
using System.IO;

public class PathExample
{
    public static void SplitPath(string fullPath)
    {
        string directory = Path.GetDirectoryName(fullPath);
        string fileName = Path.GetFileName(fullPath);

        Console.WriteLine($"Directory: {directory}");
        Console.WriteLine($"File Name: {fileName}");
    }
}

// 실행 예제
PathExample.SplitPath("Assets/Textures/brick_wall.png");

/* 출력 결과:
Directory: Assets/Textures  
File Name: brick_wall.png  
*/

 

장점

  • 직관적이고 사용이 간단합니다.
  • 운영 체제에 따라 경로 구분자를 자동으로 처리합니다.
  • 예외 처리가 내장되어 있어 신뢰성이 높습니다.

단점

  • 외부 라이브러리를 호출하기 때문에 약간의 성능 오버헤드가 있습니다.
  • Unity 외부 의존성을 줄이고자 할 경우 사용이 제한될 수 있습니다.

2. string.Substring을 활용한 경로 분리

string.Substring은 문자열을 직접 다루어 특정 위치를 기준으로 잘라내는 방식입니다.

코드 예제

using System;

public class SubstringExample
{
    public static void SplitPath(string fullPath)
    {
        int lastSlashIndex = fullPath.LastIndexOf('/'); // Windows는 '\\' 사용 가능
        string directory = fullPath.Substring(0, lastSlashIndex);
        string fileName = fullPath.Substring(lastSlashIndex + 1);

        Console.WriteLine($"Directory: {directory}");
        Console.WriteLine($"File Name: {fileName}");
    }
}

// 실행 예제
SubstringExample.SplitPath("Assets/Textures/brick_wall.png");

/* 출력 결과:
Directory: Assets/Textures  
File Name: brick_wall.png  
*/

 

장점

  • 경량 처리: 외부 라이브러리를 호출하지 않아 성능적으로 더 빠를 수 있습니다.
  • Unity 외부에서도 간단히 사용할 수 있습니다.

단점

  • 문자열 처리의 정확성을 보장해야 합니다.
  • 경로 구분자가 플랫폼마다 다를 수 있으므로 추가적인 처리가 필요합니다.

Unity에서 경로 구분자(\, /) 변환하기

Unity는 파일 경로에서 슬래시(/)를 표준 경로 구분자로 사용합니다. 하지만 Windows 경로는 **백슬래시(\)**를 기본으로 사용하기 때문에, 다음과 같은 문제가 발생할 수 있습니다:

  1. Unity API(예: Resources.Load, AssetDatabase)에서 경로를 인식하지 못하는 오류
  2. 경로 문자열 비교 시 불일치 문제

해결 방법: string.Replace 사용

Windows에서 반환된 경로의 구분자를 Unity 표준인 /로 변환하면 문제를 간단히 해결할 수 있습니다.

코드 예제

string directory = Path.GetDirectoryName("C:\\Projects\\UnityGame\\Assets\\Textures\\brick_wall.png");
string unifiedDirectory = directory.Replace("\\", "/");

Console.WriteLine($"Original Directory: {directory}");
Console.WriteLine($"Unified Directory: {unifiedDirectory}");

/* 출력 결과:
Original Directory: C:\Projects\UnityGame\Assets\Textures  
Unified Directory: C:/Projects/UnityGame/Assets/Textures  
*/

 

변환하지 않을 경우의 문제

  • 경로 구분자가 일치하지 않으면 Unity에서 파일을 로드할 수 없거나, 경로 비교 시 잘못된 결과가 나올 수 있습니다.
  • 디버깅 과정에서 경로 표현이 통일되지 않아 혼란을 초래할 수 있습니다.

어떤 방법을 선택해야 할까?

구분 System.IO.Path string.Substring
사용 용이성 직관적이고 간편함 다소 복잡함
크로스 플랫폼 운영 체제 경로 구분자를 자동 처리 직접 구분자를 고려해야 함
성능 약간의 오버헤드 경량 처리 가능
추천 상황 복잡한 경로 처리 또는 크로스 플랫폼 프로젝트에서 사용 단순한 Unity 전용 프로젝트에서 사용

마무리

Unity 개발에서는 파일 경로를 분리하거나, 경로 구분자를 변환해야 할 일이 빈번합니다.

  • 복잡한 경로 처리와 크로스 플랫폼 프로젝트에서는 **System.IO.Path**를 사용하는 것이 적합합니다.
  • 간단한 Unity 전용 프로젝트에서는 **string.Substring**으로 경량화된 처리를 선택할 수 있습니다.
  • 경로 구분자를 슬래시(/)로 통일하는 작업은 Unity API 호환성을 위해 필수적입니다.
728x90
반응형