最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

unity 如何使用文件流讀取streamingassets下的資源

 更新時間:2021年04月13日 09:09:42   作者:此車先開  
這篇文章主要介紹了unity 使用文件流讀取streamingassets下的資源操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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();
    }
 
	//返回字節(jié)數(shù)組
	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的可靠性,每次調(diào)用不一定能返回正確長度,可能需多次調(diào)用。

參考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分配內(nèi)存。

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 文件夾 少用

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

2:StreamingAssets

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

 //安卓下這兩個文件夾路徑相同 
    //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指向大多數(shù)設備上的/storage/emulated/0/android/data/<packagename>/文件(有些舊手機可能指向SD卡上的位置,如果存在),該路徑使用android.content.context.getexternalfilesdir解析

4:Application.temporaryCachePath

來操作文件 同上但是 此屬性用于返回一個臨時數(shù)據(jù)的緩存目錄(不會備份并且清空緩存會清掉)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • C# Base64編碼函數(shù)

    C# Base64編碼函數(shù)

    Base64編碼的思想是是采用64個基本的ASCII碼字符對數(shù)據(jù)進行重新編碼。它將需要編碼的數(shù)據(jù)拆分成字節(jié)數(shù)組。
    2009-06-06
  • C#中的Explicit和Implicit詳情

    C#中的Explicit和Implicit詳情

    Implicit提高了代碼的可讀性,但程序員需要自己保證轉(zhuǎn)換不引發(fā)異常且不丟失信息、Explicit可阻止編譯器靜默調(diào)用可能產(chǎn)生意外后果的轉(zhuǎn)換操作。前者更易于使用,后者能向閱讀代碼的每個人清楚地指示您要轉(zhuǎn)換類型,下面就和小編來一起學習吧
    2021-09-09
  • C# Distinct和重寫IEqualityComparer時要知道的二三事

    C# Distinct和重寫IEqualityComparer時要知道的二三事

    這篇文章主要給大家介紹了關于C# Distinct和重寫IEqualityComparer時要知道的二三事,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • C#委托與事件原理及實例解析

    C#委托與事件原理及實例解析

    這篇文章主要介紹了C#委托與事件原理及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • C# 郵件發(fā)送和接收實現(xiàn)代碼

    C# 郵件發(fā)送和接收實現(xiàn)代碼

    這兩個方法很容易理解,只實現(xiàn)了最基本的功能,如果需要可以查看源代碼獲取更多信息。
    2009-07-07
  • C#反射實現(xiàn)插件式開發(fā)的過程詳解

    C#反射實現(xiàn)插件式開發(fā)的過程詳解

    插件式架構,一種全新的、開放性的、高擴展性的架構體系,插件式架構設計好處很多,把擴展功能從框架中剝離出來,降低了框架的復雜度,讓框架更容易實現(xiàn),這篇文章主要介紹了C#反射實現(xiàn)插件式開發(fā),需要的朋友可以參考下
    2023-09-09
  • C#連接SQL數(shù)據(jù)庫和查詢數(shù)據(jù)功能的操作技巧

    C#連接SQL數(shù)據(jù)庫和查詢數(shù)據(jù)功能的操作技巧

    本文給大家分享C#連接SQL數(shù)據(jù)庫和查詢數(shù)據(jù)功能的操作技巧,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友參考下吧
    2021-05-05
  • WPF實現(xiàn)能自由改變形狀的四邊形和六邊形

    WPF實現(xiàn)能自由改變形狀的四邊形和六邊形

    這篇文章主要為大家詳細介紹了WPF如何實現(xiàn)能自由改變形狀的四邊形和六邊形,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • c#幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入(SqlServer、Oracle、SQLite和MySql)

    c#幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入(SqlServer、Oracle、SQLite和MySql)

    這篇文章主要介紹了c#幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入(SqlServer、Oracle、SQLite和MySql),需要的朋友可以了解一下。
    2016-11-11
  • C#中Abstract方法和Virtual方法的區(qū)別

    C#中Abstract方法和Virtual方法的區(qū)別

    這篇文章介紹了C#中Abstract方法和Virtual方法的區(qū)別,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04

最新評論

错那县| 滨海县| 安徽省| 邯郸县| 桓仁| 罗山县| 通榆县| 新绛县| 隆昌县| 贵阳市| 普宁市| 莱西市| 邵东县| 龙陵县| 新疆| 邓州市| 新余市| 安新县| 册亨县| 淮南市| 车致| 正定县| 大埔区| 甘洛县| 龙江县| 昔阳县| 祁东县| 中卫市| 吴江市| 崇左市| 唐山市| 云和县| 宁津县| 邯郸市| 微山县| 静海县| 东丰县| 富民县| 静安区| 龙门县| 巫溪县|