# 【特殊文件夹】

# Assets

这是存储项目资源的主文件夹,是Unity项目中的基本文件夹。 这个文件夹里除了Editor外的所有文件,都会被打包到安装包里。 通过代码 Application.dataPath 进行获取 以下是一些常用的子文件夹:

  • Scenes 场景
  • Prefabs 预置体
  • Scripts 脚本
  • Models fbx文件(模型、动作)
  • Materials 材质
  • Textures 纹理贴图
  • Audios 声音
  • Animations(动画、动画控制器、时间轴)
  • Other(字体,各种配置)
  • Resources
  • StreamingAssets
  • Editor

# Editor

这个文件夹包含用于扩展Unity编辑器的脚本。如果您想编写自己的编辑器扩展,可以将脚本放在这个文件夹中。

# Resources

这个文件夹用于存储在运行时需要动态加载的资源,如音频、纹理等。

  • 在运行时通过通过 Resources.Load() 方法进行加载。
  • 构建打包时,会被嵌入到包体中(压缩)。
  • 一般情况下场景中直接引用的资源放在“Assets”,需要在运行时动态加载的资源放在“Resources”。
  • 使用 string resourcesPath = Application.dataPath + "/Resources/"; 进行获取。

假设你有一个在“Resources/Textures”文件夹下的纹理文件“myTexture.png”,可以使用以下代码加载它:

Texture myTexture = Resources.Load<Texture>("Textures/myTexture");

如果你想加载一个位于“Resources/Prefabs”文件夹下的预制体“myPrefab.prefab”,可以使用以下代码:

GameObject myPrefab = Resources.Load<GameObject>("Prefabs/myPrefab");

# StreamingAssets

  • 构建打包时,会被嵌入到包体中(不压缩)。
  • 在运行时通过代码加载。
  • 存储不需要经过压缩或处理的原始文件,如视频、音频等。
  • 尽量减少文件数量和控制大小,避免影响安装包大小。

以下是一个加载StreamingAssets目录中文本文件的示例代码:

IEnumerator LoadTextFile(string fileName)
{
    string filePath = Application.streamingAssetsPath + "/" + fileName;
    using (UnityWebRequest www = UnityWebRequest.Get(filePath))
    {
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError("Failed to load file: " + www.error);
        }
        else
        {
            string text = www.downloadHandler.text;
            // 使用加载的文本文件
        }
    }
}

# Packages

这个文件夹包含项目中使用的所有导入包。您可以使用Unity Package Manager(UPM)来管理这些包。

# ProjectSettings

这个文件夹包含项目的设置,包括输入、渲染、场景、版本控制等设置。

# Library

这个文件夹包含自动生成的文件,如编辑器日志、缓存文件等。这个文件夹不应该被手动修改,因为这些文件是由Unity自动生成的。

  • 不应该提交到svn或者git。

# Temp

这个文件夹用于存储临时文件,如构建时生成的文件等。这个文件夹的内容可以随时删除,因为它们可以在需要时重新生成。

  • 不应该提交到svn或者git。

# Logs

存放开发过程中引擎产生的一些日志文件。

  • 不应该提交到svn或者git。

# obj

存放开发过程中引擎产生的一些Debug文件。

  • 不应该提交到svn或者git。

# 工程文件夹

这个文件夹是Unity项目文件夹本身。开发工具时可能会用得到。

使用以下代码进行获取:

System.IO.Directory.GetCurrentDirectory();

以工程目录:G:\vpsvn\u3d\UP2019_TEST_20220422为例,GetCurrentDirectory()的值是:

  • 在PC上输出“G:\vpsvn\u3d\UP2019_TEST_20220422”。
  • 在安卓模拟器或者安卓手机上测试的输出结果是“/”。

# 运行时沙箱文件夹

不同平台具体位置不同,但对于开发者,使用Api获取路径即可。

  • 使用 Application.persistentDataPath 获取沙箱文件夹路径。

# 动态写入数据

using System.IO;
using UnityEngine;

public class DataWriter : MonoBehaviour
{
    private string filePath;

    void Start()
    {
        // 获取可写入数据的文件夹路径
        filePath = Application.persistentDataPath + "/data.txt";

        // 写入数据到文件
        WriteData("Hello World!");
    }

    void WriteData(string data)
    {
        // 打开或创建一个文本文件
        FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);

        // 在文件中写入数据
        StreamWriter streamWriter = new StreamWriter(fileStream);
        streamWriter.WriteLine(data);

        // 关闭文件流
        streamWriter.Close();
        fileStream.Close();
    }
}

# 动态读取数据

using UnityEngine;
using System.IO;

public class DataReader : MonoBehaviour
{
    private string filePath;

    void Start()
    {
        // 获取可写入数据的文件夹路径
        filePath = Application.persistentDataPath + "/data.txt";

        // 读取数据
        string data = ReadData();

        // 打印读取的数据
        Debug.Log("Read data: " + data);
    }

    string ReadData()
    {
        // 判断文件是否存在
        if (!File.Exists(filePath))
        {
            Debug.LogError("File does not exist!");
            return null;
        }

        // 读取文件中的数据
        StreamReader reader = new StreamReader(filePath);
        string data = reader.ReadToEnd();

        // 关闭文件流
        reader.Close();

        return data;
    }
}