亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unity怎么使用文件流讀取streamingassets下的資源

發布時間:2021-04-13 10:53:29 來源:億速云 閱讀:1424 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關unity怎么使用文件流讀取streamingassets下的資源,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

目的:讀取streamingassets下的文件中指定的一段字節

已知:文件中的起始位置,和需要讀取的長度

1.android下讀取

1.1 不能直接使用C#的FileStream,讀取失敗

var buffer = new byte[size];
FileStream stream = File.OpenRead(path);
stream.Read(buffer , pos, size);

報錯:

IsolatedStorageException: Could not find a part of the path "/jar:file:/data/app/com.xxx.xxxx-1/base.apk!/assets/xxx.pack".

1.2 可以使用Unity原生接口與Android交互

主要過程:

Java

public class XXXPlugin extends UnityPlayerNativeActivity {
    protected AssetManager assetManager;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		assetManager = getAssets();
    }
 
	//返回字節數組
	public byte[] LoadBytes(String path,int offset,int len)
	{
         //可以緩存起來,不需每次都open
         InputStream inputStream = assetManager.open(path);
         try {
                 byte buf[] = new byte[len];
                 inputStream.reset();
                 
                //注意skip、read的可靠性
                 inputStream.skip(offset);
                 inputStream.read(buf,0,len)
 
                 inputStream.close();
                 return buf;
    
			} 
		catch (IOException e) {
				Log.v ("unity", e.getMessage());
		}
		return null;
	}
 
}

注意skip、read的可靠性,每次調用不一定能返回正確長度,可能需多次調用。

參考how-does-the-skip-method-in-inputstream-work

C#:

public static byte[] read_streamingpath_bytes(string path,IntPtr ptr, int pos, int size) 
            {
                using (AndroidJavaClass cls = new AndroidJavaClass("com.XXX.XXXPlugin";) ) 
                {
                   AndroidJavaObject  m_AndroidJavaObject = cls.GetStatic<AndroidJavaObject>("mainActivity");
 
                    byte[] s = m_AndroidJavaObject.Call<byte[]>("LoadBytes", path, pos, size);
 
                    return s;
                }
                return null;
            }

這種方法是在Java分配內存。

1.3 更靈活的方法,使用JNI,可以從C#傳遞指針到C++

在Android Studio中生成庫libNativeLib.so文件,參考NativeReadBytes

C++

#include "com_XXX_NativeHelper.h"
#include <android/asset_manager_jni.h>
#include <android/asset_manager.h>
#include <string>
#include <jni.h>
#include <stdint.h>
 
#ifdef __cplusplus
extern "C" {
#endif
 
static AAssetManager *assetManager = nullptr;
 
JNIEXPORT void JNICALL Java_com_XXX_NativeHelper_SetAssetManager
        (JNIEnv *env, jobject jobj, jobject jassetManager) {
    assetManager = AAssetManager_fromJava(env, jassetManager);
}
 
JNIEXPORT int32_t JNICALL ReadAssetsBytesWithOffset(uint32_t pathKey, char* fileName, unsigned char** result, int32_t offset, int32_t length){
    if(assetManager == nullptr){
        return -1;
    }
    AAsset* asset = asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_UNKNOWN);
    if(asset == nullptr){
        return -1;
    }
    off_t size = AAsset_getLength(asset);
    if(size > 0){
        try {
            AAsset_seek(asset, offset, SEEK_SET);
            AAsset_read(asset, *result, length);
        }catch (std::bad_alloc){
            *result = nullptr;
            return -1;
        }
    }
    AAsset_close(asset);
    return (int32_t)length;
}
#ifdef __cplusplus
}
#endif

Java

//XXXPlugin.java
public class XXXPlugin extends UnityPlayerNativeActivity {
    static{
        System.loadLibrary("NativeLib");
    }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mainActivity = this;
  
  
        //設置AssetManager, C++中要使用
  NativeHelper.SetAssetManager(getAssets());
   }
 
}
 
//NativeHelper.java
public class NativeHelper {
    public static native void SetAssetManager(AssetManager assetManager);
}

C#

 public class ReadNativeByte
    {
 
#if UNITY_ANDROID
        [DllImport("NativeLib")]
        public static extern int ReadAssetsBytesWithOffset(uint pathKey,string name, ref IntPtr ptr, int offset, int length);
#endif
    }

2.IOS下讀取

可以直接在C#下讀取,StreamAsseting只有讀的權限,用OpenRead

byte[] bytes = new byte[len];
FileStream stream = File.OpenRead(path);
stream.Seek(offset, SeekOrigin.Begin);
stream.Read(bytes, 0, len);

補充:unity中 在移動平臺各種讀寫文件夾存路徑整理 如 StreamingAssets 等文件夾 各個路徑在各種平臺的文件路徑

1:Resources 文件夾 少用

unity怎么使用文件流讀取streamingassets下的資源

//資源卸載
    /*
     *  Resources.UnloadAsset(obj):卸載非 GameObject類型的資源,會將內存中已加載資源及其克隆體卸載。
        Destroy(obj):僅用于卸載GameObject類型的資源的克隆體。
        DestroyImmediately(obj):卸載GameObject類型的資源,會將內存中已加載資源及其克隆體卸載,但該方法只能用在非編輯模式下,否則會報錯提示改為DestroyImmediately(obj, true),然而編輯模式下使用該函數會連文件夾里的原始Asset一并刪除。
     */

2:StreamingAssets

在移動端也是只可讀的不能寫入數據 主要用來存放二進制文件。

 //安卓下這兩個文件夾路徑相同 
    //Application.streamingAssetsPath = jar:file:///data/app/com.xxx.xxx-1.apk!/assets/  == "jar:file://"+Application.dataPath+"!assets/"
    //Application.dataPath+"!assets/" = /data/app/com.xxx.xxx-1.apk!assets/
    //Ios下
    //Application.dataPath + "/Raw/" == @"file:///" + Application.streamingAssetsPath + "/"
    //Editor WIN 
    //@"file:///" + Application.streamingAssetsPath + "/"
    //"file:///" + Application.dataPath + "/StreamingAssets" + "/"
private string path = string.Empty;
    public string GetSAPath()
    {
        //安卓平臺 加文件名
#if UNITY_ANDROID && !UNITY_EDITOR
        path =  Application.streamingAssetsPath + "/"
#elif UNITY_IPHONE && !UNITY_EDITOR
        path = @"file:///" + Application.streamingAssetsPath + "/";
#elif UNITY_STANDLONE_WIN||UNITY_EDITOR
       path =  @"file:///" + Application.streamingAssetsPath + "/";
#endif
        return path;
    }

3:Application.persistentDataPath

這個目錄可讀可寫 一般存本地關卡等

用于存檔 直接使用 打包之前是沒有這個目錄的,直到應用程序在手機上安裝完畢才有這個目錄。

該文件存在手機沙盒中,因為不能直接存放文件,

1.通過服務器直接下載保存到該位置,也可以通過Md5碼比對下載更新新的資源

2.沒有服務器的,只有間接通過文件流的方式從本地讀取并寫入Application.persistentDataPath文件下,然后再通過

Application.persistentDataPath來讀取操作。

注:在Pc/Mac電腦 以及Android跟Ipad、ipone都可對文件進行任意操作,另外在IOS上該目錄下的東西可以被iCloud自動備份。

Application.persistentDataPath + "/tempDic", "testXml"

對應存儲路徑

Windows應用商店應用程序:

application.persistentdatapath指向%userprofile%\appdata\local\packages\<productName>\localstate

ios:application.persistentdatapath指向/var/mobile/containers/data/application/<guid>/documents

android:application.persistentdatapath指向大多數設備上的/storage/emulated/0/android/data/<packagename>/文件(有些舊手機可能指向SD卡上的位置,如果存在),該路徑使用android.content.context.getexternalfilesdir解析

關于“unity怎么使用文件流讀取streamingassets下的資源”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克陶县| 佛学| 阳原县| 曲靖市| 江北区| 同心县| 兴海县| 五寨县| 五峰| 剑阁县| 鄄城县| 五常市| 革吉县| 银川市| 康定县| 灵川县| 海丰县| 蓝田县| 田阳县| 宜黄县| 萨嘎县| 开鲁县| 屯门区| 乐清市| 七台河市| 内黄县| 华坪县| 马龙县| 海原县| 安龙县| 安岳县| 黄石市| 莲花县| 霸州市| 云龙县| 泸州市| 古田县| 靖远县| 健康| 微山县| 加查县|