Tài trợ bài viết này và giới thiệu dịch vụ, sản phẩm, thương hiệu, nhu cầu tuyển dụng của doanh nghiệp đến với cộng đồng.
Bùi Trung Hiếu Hướng dẫn đọc và ghi file với đường dẫn Application.dataPath, Application.streamingAssetPath, Application.persistentDataPath, Application.temporaryCachePath. Đây là 4 đường dẫn Unity hỗ trợ trong việc đọc và ghi file trong Android.
Nội dung bài viết

Giới thiệu

Chúng ta thường hay lưu trữ và quản lý file chỉ với đường dẫn cố định, và việc đọc ghi không cần quá nhiều bước. Nhưng khi đó đòi hỏi người tổ chức ghi hoặc đọc file phải biết chính xác đường dẫn đến file cần thao tác và có thể gây khó khăn cho việc sao chép sang máy khác.

Trong bài viết này, tôi sẽ giới thiệu và hướng dẫn sử dụng 4 đường dẫn mặc định mà Unity hỗ trợ sẵn cho việc lưu trữ và quản lý file là dataPath, streamingAssetPath, persistentDataPath, temporaryCachePath. Đồng thời tôi cũng giới thiệu qua về cách đọc và ghi file trên hệ điều hành Android với Unity.

Tiền đề bài viết

Trong quá trình cập nhật bài viết về Unity cho STDIO, tôi cảm thấy việc đọc và ghi file trên hệ điều hành Window khá là đơn giản. Nhưng đa phần các bạn điều sử dụng đường dẫn cố định để truy xuất đến file. Điều này rất tiện lợi và mau chóng cho ra kết quả, nhưng cũng vô hình chung làm cho chúng ta vướng phải những khó khăn khi sao chép chương trình sang máy khác hoặc dữ liệu có thể bị phân chia rải rác ở nhiều nơi. Vì thế tôi nảy sinh ý tưởng viết bài này, một phần giúp cho các bạn hệ thống lại đường dẫn lưu trữ file theo mục đích sử dụng, mặt khác giúp các bạn tiếp cận với hệ thống quản lý file trên hệ điều hành Android.

Đối tượng hướng đến

Bài viết hướng đến các bạn đang tìm hiểu về Unity và đang tìm cách sắp xếp đường dẫn lưu trữ file 1 cách có hệ thống. Các bạn đang gặp khó khăn về lưu trữ thông tin vào file trên hệ điều hành Android có thể xem đây là một bài viết tham khảo.

Application.dataPath

Đây là đường dẫn đến thư mục chứa dữ liệu của game. Trong Android, dataPath là một đường dẫn private và nó chỉ cho phép đọc, bạn không thể truy cập được đường dẫn này nếu không có quyền ROOT của hệ thống.

string filePath = System.IO.Path.Combine(Application.dataPath, fileName);

Application.persistentDataPath

Đây cũng đường dẫn đến thư mục chứa dữ liệu của game. persistentDataPath thường được dùng cho việc lưu trữ và cập nhật trạng thái của game. Trong hệ điều hành Android, persistentDataPath cho phép cả đọc và ghi, và nó không bị xóa khi chúng ta cập nhật game.

string filePath = System.IO.Path.Combine(Application.persistentDataPath, fileName);

Application.streamingAssetPath

Là đường dẫn đến thư mục StreamingAssets của game, streamingAssetPath thường được dùng để chứa các dữ liệu mặc định, các dữ liệu không thay đổi. Trong Android, bạn không thể truy cập trực tiếp vào thư mục StreamingAssets vì nó được nén lại trong file apk.

string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, fileName);

Application.temporaryCachePath

Là đường dẫn đến thự mục chứa các dữ liệu tạm. Ngoài mục đích là chứa các dữ liệu tạm của game, temporaryCachePath cũng có thể đọc và ghi tương tự persistentDataPath.

string filePath = System.IO.Path.Combine(Application.temporaryCachePath, fileName);

Đọc và ghi file trong Android

Unity là một engine đa nền tảng, nên các bạn có thể sử dụng phương pháp đọc vài ghi file trong C# để đọc và ghi file, các bạn có thể tham khảo thêm bài viết Đọc Ghi File Cơ Bản Trong C#.

Lưu ý: Trên Android, dataPath và streamingAssetPath chỉ cho phép đọc, bạn không thể tạo hoặc ghi dữ liệu vào file trong đường dẫn này trực tiếp trên android.

Thao tác với streamingAssetPath

Đối với streamingAssetPath, tôi thường dùng đường dẫn này để đọc các dữ liệu khởi đầu, các dữ liệu mặc định... Các dữ liệu này không thể thay đổi trong suốt quá trình game vận hành.

Tạo dữ liệu cho streamingAssetPath

Để tạo dữ liệu cho streamingAssetPath, trong Unity Editor bạn bắt buột phải có thư mục StreamingAssets trong thư mục Assets của project. Khi build project, Unity sẽ sao chép tất các các file trong thư mục này vào đường dẫn của Application.streamingAssetsPath.

streamingAssetPath

Đọc dữ liệu từ streamingAssetPath

Trong Android các file được chứa trong streamingAssetPath đều được nén thành file .jar. Nên đường dẫn của streamingAssetPath có dạng: 

streamingPath = "jar:file://" + Application.dataPath + "!/assets/";

Bạn phải sử dụng đến lớp WWW của Unity để đọc nội dung của file.

string dataString;

IEnumerator ReadDataStreamingAssets(string fileName)
{
    string streamingPath = System.IO.Path.Combine(Application.streamingAssetsPath, fileName);
    WWW www = new WWW(streamingPath);
    yield return www;
    dataString = www.text;        
}

Để sử dụng phương thức trên ta cần dùng đến phương thức StartCoroutine.

StartCoroutine(ReadDataStreamingAssets("gamesetting.json"));

Các bạn có thể tham khảo thêm về phương thức StartCoroutine ở bài viết Ứng Dụng Của StartCoroutine Trong Unity.

Lưu ý: phương thức ReadDataStreamingAssets trên chỉ dùng được trên Android, để ứng dụng có thể chạy được trên đa nền tảng, ta phải tùy biến lại:

IEnumerator ReadDataStreamingAssets(string fileName)
{
    string streamingPath = System.IO.Path.Combine(Application.streamingAssetsPath, fileName);
    if (streamingPath.Contains("://"))
    {
        WWW www = new WWW(streamingPath);
        yield return www;
        dataString = www.text;
    }
    else
    {
        dataString = System.IO.File.ReadAllText(streamingPath);
    }
}

Điều kiện streamingPath.Contains("://") để xác định xem đường dẫn có chứ chuỗi "://" tương ứng với đường dẫn với streamingAssetPath trong Android.

Download mã nguồn

Các bạn có thể download mã nguồn đọc và ghi file trong Android với Unity tại đây.

Tham khảo

THẢO LUẬN
ĐÓNG