Unity的几个特殊文件夹

1.以.开头的文件夹会被unity忽略,资源不会被导入,脚本不会编译。

2.Standard Assets和Pro Standard Assets:在这个文件夹中的脚本最先被编译。

3.Editor:以Editor命名的文件夹允许其中的脚本访问Unity Editor的API。如果脚本中使用了在UnityEditor命名空间中的类或方法,它必须被放在名为Editor的文件夹中,在项目中可以有多个Editor文件夹。

4.Plugins:Plugins文件夹用来放native插件。他们会被自动包含进Build中去,注意这个文件夹只能是Assets文件夹的直接子目录。

                   在windows平台下,native插件是dll文件,这些脚本会更早的编译。

5.Resources:Resources文件夹允许你在脚本中通过文件路径和名称来访问资源。但还是推荐使用直接引用来访问资源。Resources.Load来加载。当不再使用这些资源了,可以通过Destroy物体,再调用Resources.UnloadUnusedAssets来释放内存。

6.Editor Default Resources:这是为editor脚本使用的文件夹。

7.Gizmos:Gizmos文件夹存放用Gizmos.DrawIcon方法使用的贴图、图标资源。放在Gizmos文件夹中的贴图资源可以直接通过名称使用,可以被Editor作为gizmo画在屏幕上。

8.WebPlayerTemplaters:用来替换web build的默认网页。这个文件夹中的脚本都不会被编译。这个文件夹必须作为Assets文件夹的直接子目录。

9.StreamingAssets:这里的文件会被拷贝到build文件夹中,不会修改(移动和网页版不同,他们会被嵌入到最终build文件中)。它们的路径会因平台而有差异,但都可以通过Application.streamingAssetsPath来访问。

关于打包:

1.Resources文件夹 

Resources文件夹是一个只读的文件夹,通过Resources.Load()来读取对象。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。建议这个文件夹下只放Prefab或者一些Object对象,因为Prefab会自动过滤掉对象上不需要的资源。举个例子我把模型文件还有贴图文件都放在了Resources文件夹下,但是我有两张贴图是没有在模型上用的,那么此时这两张没用的贴图也会被打包到发布包中。假如这里我用Prefab,那么Prefab会自动过滤到这两张不被用的贴图,这样发布包就会小一些了。

2.StreamingAssets

StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密,不使用点特殊办法是拿不到原始资源的。但是StreamingAssets文件夹就不一样了,它下面的所有资源不会被加密,然后是原封不动的打包到发布包中,这样很容易就拿到里面的文件。所以StreamingAssets适合放一些二进制文件,而Resources更适合放一些GameObject和Object文件。 StreamingAssets 只能用过www类来读取!!

3. 最后凡是在Hierarchy视图对象引用过的资源文件也会被无条件打包到发布包中

如果有一部分文件可能没有在Resources文件夹下也没有在StreamingAssets文件夹下,也没有被Hierarchy视图游戏对象引用,那么这类资源是不会被打包到发布包中的。在处理不同包对应不同资源包的时候,尽量让可配置的资源放在Resources 或StreamingAssets文件夹下,运行的时候程序动态的来读取它们,最后显示在游戏中就可以了。 在批量打包前,在Project视图下创建不同包的资源文件夹, 然后脚本 AssetDatabase 动态的将资源拷贝至Resources或StreamingAssets 文件夹中

转载于:https://www.cnblogs.com/mcyushao/p/10624695.html

Unity 中,可以通过多种方式获取指定文件夹下的所有文件。以下是几种常见的实现方法: --- ### 方法一:仅获取当前文件夹下的所有文件 如果只需要获取某个特定文件夹内的所有文件而不包括其子文件夹的内容,可以使用 `System.IO.Directory` 类的静态方法 `GetFiles()`。 ```csharp using System.Collections.Generic; using System.IO; public static List<string> GetFilesInFolder(string folderPath) { List<string> files = new List<string>(); if (Directory.Exists(folderPath)) { string[] currentFiles = Directory.GetFiles(folderPath); files.AddRange(currentFiles); } else { Debug.LogWarning("文件夹路径不存在:" + folderPath); } return files; } ``` 此方法会返回一个字符串列表,其中包含指定文件夹中所有文件的绝对路径[^1]。 --- ### 方法二:递归获取文件夹及其子文件夹下的所有文件 当需要获取目标文件夹以及其所有子文件夹中的文件时,可以设置参数 `SearchOption.AllDirectories` 来启用递归搜索功能。 ```csharp using System.IO; public static FileInfo[] GetAllFilesRecursively(string folderPath) { if (!Directory.Exists(folderPath)) { Debug.LogWarning("文件夹路径不存在:" + folderPath); return new FileInfo[0]; } DirectoryInfo directoryInfo = new DirectoryInfo(folderPath); FileInfo[] allFiles = directoryInfo.GetFiles("*", SearchOption.AllDirectories); return allFiles; } ``` 这段代码利用了 `DirectoryInfo` 和 `FileInfo` 对象来处理更复杂的场景,比如过滤 `.meta` 文件或其他不需要的扩展名[^2]。 --- ### 方法三:动态加载本地磁盘上的资源 对于某些特殊需求,例如从用户的计算机硬盘驱动器读取数据而不是项目资产目录内部的数据,可采用如下方案: ```csharp using System.Collections; using System.IO; using UnityEngine; public class LocalFileLoader : MonoBehaviour { private string path = @"D:\YourLocalFolderPath"; void Start() { DirectoryInfo theFolder = new DirectoryInfo(path); foreach (FileInfo fileInfo in theFolder.GetFiles()) { StartCoroutine(LoadResourceFromFile(fileInfo.FullName)); } } IEnumerator LoadResourceFromFile(string filePath) { if (File.Exists(filePath)) { string url = "file:///" + filePath.Replace('\\', '/'); WWW www = new WWW(url); yield return www; if (www.error == null && www.isDone) { AudioClip clip = www.GetAudioClip(false, true, AudioType.MPEG); // 处理加载完成后的逻辑... } } } } ``` 这种方法适用于访问外部存储设备上的媒体文件等内容[^3]。 --- ### 方法四:基于 Editor 的解决方案——扫描 Assets 下的所有资源 假如是在编辑器环境下操作,并希望检索整个工程里的素材集合(含嵌套结构),那么推荐借助 Unity 提供的工具类 `AssetDatabase` 完成任务。 ```csharp using UnityEditor; using System.IO; public static Object[] GetAllAssetsAtPath(string assetRootPath) { string fullAssetPath = Path.Combine(Application.dataPath, assetRootPath).Replace("\\", "/"); string[] guids = AssetDatabase.FindAssets("", new[] {assetRootPath}); List<Object> assets = new List<Object>(); foreach (var guid in guids) { string assetPath = AssetDatabase.GUIDToAssetPath(guid); Object obj = AssetDatabase.LoadMainAssetAtPath(assetPath); if (obj != null) { assets.Add(obj); } } return assets.ToArray(); } ``` 注意这里调用了 `FindAssets` 函数配合自定义筛选条件定位符合条件的目标项[^4]。 --- #### 总结说明 以上四种技术各有侧重领域,请依据实际应用场景选取最合适的策略实施开发工作。无论是运行时环境还是编辑状态下均提供了灵活多样的接口支持开发者高效达成目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值