記事ディレクトリ
1.はじめに
リソースの読み込みとファイルパスは、より一般的に使用される関数です。今日は、リソースの読み込みの使用方法をまとめます。リソースの読み込みにはファイルパスを使用する必要があるため、まとめて説明します。
2.参考記事
1. UNITY_リソースパスと外部ファイルの読み込み
2. Unity3Dリソース管理と仕上げ
3. [Unity3D]画像をクリックしてオブジェクトを生成
4. Unityのさまざまなパス
3、リソースの読み込み
3.1リソースの読み込み
Resourcesクラスは、指定されたパスでリソースを検索またはアクセスできます。
エディターでは、Resources.FindObjectsOfTypeAllを使用して、リソースとシーンオブジェクトを見つけることができます。
すべてのリソースは、Resources.Loadからアクセスできるプロジェクトアセットファイルの任意のResourcesフォルダーにある必要があります。複数のリソースフォルダーを使用でき、オブジェクトが読み込まれるたびに自動的にチェックされます。
リソースが「Resources」フォルダーに配置されると、「Resources」フォルダー内のすべてのリソースがパッケージ化され、コンパイルされて、ゲームに含まれることに注意してください。
リソースが不要になった場合は、Resources.UnloadUnusedAssetsを使用してメモリを解放できます。
サンプルコード
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void Start() {
var go = GameObject.CreatePrimitive(PrimitiveType.Plane);
var rend = go.GetComponent<Renderer>();
rend.material.mainTexture = Resources.Load("glass") as Texture;
}
}
静的関数
名前 | 機能 |
---|---|
FindObjectsOfTypeAll | すべてのタイプオブジェクトのリストを返します。 |
負荷 | Resourcesフォルダーのpathに保存されているリソースをロードします。 |
すべてロード | パスフォルダー内のすべてのリソース、またはリソースフォルダー内のファイルをロードします。 |
LoadAsync | Resourcesフォルダーのリソースを非同期に読み込みます。 |
UnloadAsset | 指定されたリソースをメモリからアンロードします。 |
UnloadUnusedAssets | 未使用のリソースをアンインストールします。 |
3.2 WWW読み込み
これは、Webページにアクセスし、リンクWWW(url)を介してバックグラウンドでダウンロードし、WWWオブジェクトを返す単純なクラスです。isDone属性を使用して、ダウンロードが完了したかどうかを確認するか、yieldがダウンロードオブジェクトを自動的に待機します。
WWWクラスを使用して、GETおよびPOST要求をサーバーに送信できます。WWWクラスは、デフォルトでGetメソッドを使用します。POSTメソッドを使用する場合は、WWWFromを使用してpostDataパラメータを作成する必要があります。postDataパラメータは、作成されるフォームデータです。
サンプルコード
using UnityEngine;using System.Collections;
public class ExampleClass : MonoBehaviour {
public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";
IEnumerator Start() {
WWW www = new WWW(url);
yield return www;
renderer.material.mainTexture = www.texture;
}}
可変
可変 | 機能 |
---|---|
資産バンドル | AssetBundleのデータストリームには、プロジェクトフォルダー内の任意のタイプのアセットを含めることができます。 |
audioClip | ダウンロードしたデータからAudioClipを返します。(読み取り専用) |
バイトダウンロード | 取得したWebページのコンテンツをバイト形式で返します(読み取り専用)。 |
エラー | ダウンロード中にエラーが発生すると、エラーメッセージが返されます。(読み取り専用) |
終わらせる | ダウンロードが完了したかどうかを確認します(読み取り専用)? |
映画 | ダウンロードしたデータから、MovieTexture(読み取り専用)が返されます。 |
進捗 | ダウンロードの進行状況はどのくらいですか(読み取り専用)? |
テキスト | Webページを介してコンテンツを文字列として取得および返します(読み取り専用)。 |
テクスチャー | ダウンロードしたデータからTexture2D(読み取り専用)を返します。 |
textureNonReadable | ダウンロードしたデータから読み取り不可能なTexture2D(読み取り専用)を返します。 |
threadPriority | AssetBundle解凍スレッドの優先度。 |
uploadProgress | アップロードの進捗状況(読み取り専用)。 |
トリガー | このWWWリクエストのURL(読み取り専用)。 |
機能
名前 | 機能 |
---|---|
GetAudioClip | ダウンロードされたデータから、AudioClip(読み取り専用)が返されます。 |
LoadImageIntoTexture | 既存のTexture2Dをダウンロードデータの画像に置き換えます。 |
LoadUnityWeb | 新しいWebプレーヤーデータファイルをロードします。 |
静的関数
名前 | 機能 |
---|---|
EscapeURL | 文字列内の文字をエスケープします。 |
LoadFromCacheOrDownload | 指定されたバージョン番号のAssetBundleをキャッシュからロードします。AssetBundleが現在のキャッシュにない場合は、後でローカルストレージから取得できるように、自動的にダウンロードされてキャッシュに保存されます。 |
UnEscapeURL | URLのエスケープ文字を通常のテキストに戻します。 |
3.3 AssetBundleの読み込み
AssetBundlesを使用すると、WWWクラスストリームを介してアセットをロードし、実行時にそれらをインスタンス化できます。AssetBundlesはBuildPipeline.BuildAssetBundleによって作成されます。
リソースパックは、プラットフォーム間で完全には互換性がないことに注意してください。スタンドアロンプラットフォーム(ウェブプレーヤーを含む)にコンパイルされたリソースパッケージは、どのプラットフォームでも読み込むことができますが、iOSおよびAndroidプラットフォームは含まれません。さらに、iOS用にコンパイルされたリソースパックはAndroidと互換性がなく、その逆も同様です。
サンプルコード
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
IEnumerator getAsset () {
WWW www = new WWW ("http://myserver/myBundle.unity3d");
yield return www;
// Get the designated main asset and instantiate it.
Instantiate(www.assetBundle.mainAsset);
}
}
可変
可変 | 機能 |
---|---|
isStreamedSceneAssetBundle | リソースバンドルがストリーミングシーンのリソースバンドルである場合はtrueを返します。 |
mainAsset | メインリソースは、リソースパッケージのビルド時に指定されます(読み取り専用)。 |
機能
名前 | 機能 |
---|---|
含む | 特定のオブジェクトがAssetBundleの名前に含まれている場合は、それが取得されます。 |
GetAllAssetNames | すべてのリソースパッケージのすべてのリソース名を返します。 |
GetAllScenePaths | リソースパッケージ内のすべてのシーンリソースパス(* .unityリソースパス)を返します。 |
LoadAllAssets | リソースバンドルに含まれるタイプから継承されたすべてのオブジェクトをロードします。 |
LoadAllAssetsAsync | すべてのリソースパッケージのリソースを非同期に読み込みます。 |
LoadAsset | リソース名に従って、リソースパッケージ内のリソースをロードします。 |
LoadAssetAsync | リソース名に従って、リソースパッケージ内のリソースを非同期に読み込みます。 |
LoadAssetWithSubAssets | リソース名に従って、リソースパッケージ内のリソースを読み込み、置き換えます。 |
LoadAssetWithSubAssetsAsync | リソース名に基づいて、リソースパッケージ内のリソースを非同期で読み込み、置き換えます。 |
アンロード | バンドルに含まれるすべてのオブジェクトをアンロードします。 |
静的関数
名前 | 機能 |
---|---|
LoadFromFile | ハードディスクからリソースパックをロードします。 |
LoadFromFileAsync | AssetBundleをディスク上のファイルから非同期にロードします。 |
LoadFromMemory | メモリ領域から非同期でリソースパックを作成します。 |
LoadFromMemoryAsync | 从内存区域异步创建一个AssetBundle。 |
LoadFromMemoryImmediate | 从内存区同步创建资源包。 |
四、资源卸载
名称 | 功能 |
---|---|
Resources.UnloadAsset(Object assetToUnload) | 卸载指定的asset,只能用于从磁盘加载的;如果场景中有此asset的引用,Unity会自动重新加载它; |
Resources.UnloadUnusedAssets | 卸载所有未被引用的asset,可以在画面切换时调用,或定时调用释放全局未使用资源; |
AssetBundle.Unload(false) | 卸载AssetBundle的压缩文件数据(文件内存映像); |
AssetBundle.Unload(true) | 卸载AssetBundle文件内存映像,并且释放所有已加载的asset;如果asset在场景中被引用,会丢失; |
Object.Destroy | 销毁一个GameObject、组件或asset;并不是立即销毁,而是在Update循环之后,渲染之前; |
Object.DontDestroyOnLoad | 标明一个对象在切换场景时不被销毁; |
GC.Collect | 强制垃圾收集器立即回收内存,可以根据需要使用,比如切换画面调用或定时调用; |
五、文件路径
- Application.dataPath路径
这个属性返回的是程序的数据文件所在文件夹的路径,例如在Editor中就是项目的Assets文件夹的路径,通过这个路径可以访问项目中任何文件夹中的资源,但是在移动端它是完全没用。 - Application.streamingAssetsPath路径
这个属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。在Unity工程的Assets目录下起一个名为“StreamingAssets”的文件夹即可,然后用Application.streamingAssetsPath访问,这个文件夹中的资源在打包时会原封不动的打包进去,不会压缩,一般放置一些资源数据。在PC/MAC中可实现对文件的“增删改查”等操作,但在移动端是一个只读路径。 - Application.persistentDataPath路径(推荐使用)
此属性返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。这个路径可读、可写,但是只能在程序运行时才能读写操作,不能提前将数据放入这个路径。在IOS上是应用程序的沙盒,可以被iCloud自动备份,可以通过同步推送一类的助手直接取出文件;在Android上的位置是根据Project Setting里设置的Write Access路径,可以设置是程序沙盒还是sdcard,注意:如果在Android设置保存在沙盒中,那么就必须root以后才能用电脑取出文件,因此建议写入sdcard里。一般情况下,建议将获得的文件保存在这个路径下,例如可以从StreamingAsset中读取的二进制文件或者从AssetBundle读取的文件写入PersistentDatapath。 - Application.temporaryCachePath路径
此属性返回一个临时数据的缓存目录,跟Application.persistentDataPath类似,但是在IOS上不能被自动备份。 - /sdcard/…路径
表示Android手机的SD卡根目录。 - /storage/emulated/0/…路径(这个路径我查找了好久……)
表示Android手机的内置存储根目录。
以下是各路径在各平台中的具体位置信息:
4.1 PC端
名称 | 路径 |
---|---|
Application.dataPath | /Assets |
Application.streamingAssetsPath | /Assets/StreamingAssets |
Application.persistentDataPath | C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName |
Application.temporaryCachePath | C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName |
4.2 安卓端
名称 | 路径 |
---|---|
Application.dataPath | /data/app/xxx.xxx.xxx.apk |
Application.streamingAssetsPath | jar:file:///data/app/xxx.xxx.xxx.apk/!/assets |
Application.persistentDataPath | /data/data/xxx.xxx.xxx/files |
Application.temporaryCachePath | /data/data/xxx.xxx.xxx/cache |
4.3 IOS端
名称 | 路径 |
---|---|
Application.dataPath | Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data |
Application.streamingAssetsPath | Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw |
Application.persistentDataPath | Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents |
Application.temporaryCachePath | Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches |
4.4 HTML端
名称 | 路径 |
---|---|
Application.dataPath | file:///D:/MyGame/WebPlayer (即导包后保存的文件夹,html文件所在文件夹) |
六、特殊文件夹
1.Editor
Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以。Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用。一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL。 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行时我们只需要编辑器生成的文件,而不需要编辑器的核心代码。
2.Editor Default Resources
Editor Default Resources注意中间是有空格的,它必须放在Project视图的根目录下,如果你想放在/xxx/xxx/Editor Default Resources 这样是不行的。你可以把编辑器用到的一些资源放在这里,比如图片、文本文件、等等。它和Editor文件夹一样都不会被打到最终发布包里,仅仅用于开发时使用。你可以直接通过EditorGUIUtility.Load去读取该文件夹下的资源。
TextAsset text = EditorGUIUtility.Load("test.txt")as TextAsset;
Debug.Log(text.text);
3.Gizmos
我觉得这个文件夹其实没什么用处,如下代码所示它可以在Scene视图里给某个坐标绘制一个icon。它的好处是可以传一个Vecotor3 作为图片显示的位置。 参数2就是图片的名子,当然这个图片必须放在Gizmos文件夹下面。
void OnDrawGizmos() {
Gizmos.DrawIcon(transform.position, "0.png", true);
}
这里还是要说说OnDrawGizmos()方法,只要脚本继承了MonoBehaviour后,并且在编辑模式下就会每一帧都执行它。发布的游戏肯定就不会执行了,它只能用于在scene视图中绘制一些小物件。比如要做摄像机轨迹,那么肯定是要在Scene视图中做一个预览的线,那么用Gizmos.DrawLine 和Gizmos.DrawFrustum就再好不过了。
4.Plugins
如果做手机游戏开发一般 andoird 或者 ios 要接一些sdk 可以把sdk依赖的库文件 放在这里,比如 .so .jar .a 文件。这样打完包以后就会自动把这些文件打在你的包中。
5.Resources
可以在根目录下,也可以在子目录里,只要名子叫Resources就可以。比如目录:/xxx/xxx/Resources 和 /Resources 是一样的,无论多少个叫Resources的文件夹都可以。Resources文件夹下的资源不管你用还是不用都会被打包进.apk或者.ipa
-
Resource.Load :编辑时和运行时都可以通过Resource.Load来直接读取。
-
Resources.LoadAssetAtPath() :它可以读取Assets目录下的任意文件夹下的资源,它可以在编辑时或者编辑器运行时用,它但是它不能在真机上用,它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。
-
AssetDatabase.LoadAssetAtPath():它可以读取Assets目录下的任意文件夹下的资源,它只能在编辑时用。它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。
我觉得在电脑上开发的时候尽量来用Resource.Load() 或者 Resources.LoadAssetAtPath() ,假如手机上选择一部分资源要打assetbundle,一部分资源Resource.Load().那么在做.apk或者.ipa的时候 现在都是用脚本来自动化打包,在打包之前 可以用AssetDatabase.MoveAsset()把已经打包成assetbundle的原始文件从Resources文件夹下移动出去在打包,这样打出来的运行包就不会包行多余的文件了。打完包以后再把移动出去的文件夹移动回来。
6. StreamingAssets
这个文件夹下的资源也会全都打包在.apk或者.ipa 它和Resources的区别是,Resources会压缩文件,但是它不会压缩原封不动的打包进去。并且它是一个只读的文件夹,就是程序运行时只能读 不能写。它在各个平台下的路径是不同的,不过你可以用Application.streamingAssetsPath 它会根据当前的平台选择对应的路径。
有些游戏为了让所有的资源全部使用assetbundle,会把一些初始的assetbundle放在StreamingAssets目录下,运行程序的时候在把这些assetbundle拷贝在Application.persistentDataPath目录下,如果这些assetbundle有更新的话,那么下载到新的assetbundle在把Application.persistentDataPath目录下原有的覆盖掉。
因为Application.persistentDataPath目录是应用程序的沙盒目录,所以打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录。
StreamingAssets目录下的资源都是不压缩的,所以它比较大会占空间,比如你的应用装在手机上会占用100M的容量,那么你又在StreamingAssets放了一个100M的assetbundle,那么此时在装在手机上就会在200M的容量。