Unity 5.6:如何导入外部.txt文件

时间:2018-11-07 01:36:33

标签: unity3d text import

在此使用Unity 5.6(我知道,过时的 =-()。如何从Assets文件夹外部导入文本文件?这将由用户(我自己的自定义改装系统)输入。我需要以编程方式将文本文件的内容导入到字符串变量中。
谁能教我该怎么做?

2 个答案:

答案 0 :(得分:2)

仅做类似事情的问题

 string pathToFile = @"C:\somepath\sometextfile.txt";
 string textFromFile = System.IO.File.ReadAllText(pathToFile);

是在许多操作系统(例如Android,iOS,HoloLens)上运行的应用程序在沙箱中,对操作系统文件系统的访问非常有限(如果未明确授予)。

因此在Unity中,Application.persitentDataPath的用途基本上是这样。应用程序和操作系统都可以访问它(例如,以后用于更改文本文件)。

为了减轻麻烦,我通常会这样做

    private static string DataPath
    {
        get
        {
#if UNITY_EDITOR
            return Application.streamingAssetsPath;
#else
            return Application.persistentDataPath;
#endif
        }
    }

这只是在您进入编辑器时使用文件夹<yourUnityProject>/Assets/StreamingAssets,以便在测试过程中不会将bload数据输入到PC的持久数据路径中。

稍后,它会使用特定于应用程序的文件夹(取决于您的操作系统-请参见上面的链接)。


在编辑器中,创建文件夹Assets/StreamingAssets并将您的.txt文件放在此处。

您可以使用

阅读
public static string ReadFromFile(string fileName)
{
    var filePath = Path.Combine(DataPath, fileName);

    //only needed if you choose option 1 in the next step
    var copyFile = false;

    // Check if file exists
    if (!File.Exists(filePath))
    {
        // if the file does not exist (especially later in a build) 
        // you have multiple options
        // I would decide between the following three

        // OPTION 1
        // read in the text from streaming assets instead 
        // the first time and create a new file from that content
        filePath = Path.Combine(Application.streamingAssetsPath, fileName);
        copyFile = true;
        // Note: as fallback if this also does not exist use one of the other two options


        // OPTION 2
        // Alternatively you might rather want to instead create 
        // the file with some default content and change it later
        WriteToFile(fileName, "some default content");

        // OPTION 3
        // simply throw an error an do nothing
        Debug.LogErrorFormat("Error reading {0}\nFile does not exist!", filePath);
        return null;
    }

    // Read in data from file
    using (var file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        using (var streamReader = new StreamReader(file, Encoding.UTF8))
        {
            //this check is only needed for option 1
            // otherwise only use the else part
            if(copyFile)
            {
                var output = streamReader.ReadToEnd();
                WriteToFile(fileName, output);
                return output;
            } 
            else
            {
                return streamReader.ReadToEnd();
            }
        }
    }
}

并使用

书写
public static void WriteToFile(string fileName, string content)
{
    var filePath = Path.Combine(DataPath, fileName);

    // Create file or overwrite if exists
    using (var file = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Write))
    {
        using (var writer = new StreamWriter(file, Encoding.UTF8))
        {
            writer.Write(content);
        }
    }

    Debug.LogFormat("Written to {0}", filePath);
}

您可以将上述代码简单地放在public static class中,例如像

public static class File
{
    //...
}

您以后可以从任何地方调用它,

File.ReadFromFile("MyFile.txt");

无需参考。

答案 1 :(得分:1)

您可以通过以下方式阅读文本文件:

string pathToFile = @"C:\somepath\sometextfile.txt";
string textFromFile = System.IO.File.ReadAllText(pathToFile);

// Use the data