iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >unity怎么使用文件流读取streamingassets下的资源
  • 656
分享到

unity怎么使用文件流读取streamingassets下的资源

2023-06-14 12:06:17 656人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Unity怎么使用文件流读取streamingassets下的资源,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目的:读取streamingassets下的文件中指定的一段字节

这篇文章将为大家详细讲解有关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 __cplusplusextern "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.javapublic 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.javapublic 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下的资源

//资源卸载    

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

这个目录可读可写 一般存本地关卡等

用于存档 直接使用 打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录。

该文件存在手机沙盒中,因为不能直接存放文件,

通过服务器直接下载保存到该位置,也可以通过Md5码比对下载更新新的资源

没有服务器的,只有间接通过文件流的方式从本地读取并写入Application.persistentDataPath文件下,然后再通过

Application.persistentDataPath来读取操作。

注:在Pc/Mac电脑 以及Android跟Ipad、ipone都可对文件进行任意操作,另外在IOS上该目录下的东西可以被iCloud自动备份。

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

对应存储路径

windows应用商店应用程序:

application.persistentdatapath指向%userprofile%\appdata\local\packages\<productName>\localstateios: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下的资源”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: unity怎么使用文件流读取streamingassets下的资源

本文链接: https://www.lsjlt.com/news/270786.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • unity怎么使用文件流读取streamingassets下的资源
    这篇文章将为大家详细讲解有关unity怎么使用文件流读取streamingassets下的资源,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目的:读取streamingassets下的文件中指定的一段字节...
    99+
    2023-06-14
  • unity 如何使用文件流读取streamingassets下的资源
    目的:读取streamingassets下的文件中指定的一段字节 已知:文件中的起始位置,和需要读取的长度 1.android下读取 1.1 不能直接使用C#的FileStream,...
    99+
    2024-04-02
  • Android中怎么读取资源文件
    这篇文章将为大家详细讲解有关Android中怎么读取资源文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、放入到资源文件夹里面,也就是所创建android工程的res下面。 &...
    99+
    2023-05-30
    android
  • C#中怎么读取资源文件
    C#中怎么读取资源文件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#读取资源文件概述资源文件很早就有了,在.NET时代里这个东西也不算稀奇,在进行多国语言化的时候通常把...
    99+
    2023-06-17
  • Python 中怎么读取资源文件
    本篇文章给大家分享的是有关 Python 中怎么读取资源文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。当你把一个资源文件和一个.py文件放在一起的时候,你可以直接在这个.p...
    99+
    2023-06-16
  • Java读取resources下的文件及资源路径
    Java读取resources下的文件及资源路径 在Java开发中,经常需要读取项目中resources目录下的文件或获取资源路径。本文将介绍如何在Java中读取resources下的文件,并提供相关...
    99+
    2023-08-31
    java 前端 数据库
  • ajax怎么读取properties资源文件数据
    本篇内容主要讲解“ajax怎么读取properties资源文件数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ajax怎么读取properties资源文件数据...
    99+
    2024-04-02
  • SpringBoot怎么读取资源目录中JSON文件
    本文小编为大家详细介绍“SpringBoot怎么读取资源目录中JSON文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot怎么读取资源目录中JSON文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-06
  • 怎么在Unity中使用TextAsset读取配置文件
    这篇文章将为大家详细讲解有关怎么在Unity中使用TextAsset读取配置文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1 支持文件类型.txt.html.htm.xml.bytes....
    99+
    2023-06-14
  • Android应用中是如何读取资源文件的
    这篇文章给大家介绍Android应用中是如何读取资源文件的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 读取资源文件实例详解直接从assets读取:private InputStream getAsse...
    99+
    2023-05-31
    android roi
  • Linux下怎么使用Python读取文件
    这篇文章主要介绍“Linux下怎么使用Python读取文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux下怎么使用Python读取文件”文章能帮助大家解决问题。不论是数据分析,数据可视化,...
    99+
    2023-06-27
  • unity 文件流读取图片与www读取图片的区别介绍
    IO流代码: void LoadByIO() { float time = Time.time; FileStream fs = new File...
    99+
    2024-04-02
  • Spring Boot 读取静态资源文件的方法
    一、需求场景有时候我们需要在项目中使用一些静态资源文件,比如城市信息文件 countries.xml,在项目启动后读取其中的数据并初始化写进数据库中。二、实现静态资源文件 countries.xml 放在 src/main/resource...
    99+
    2023-05-31
    spring boot 读取
  • SpringBoot如何读取资源目录中的JSON文件
    这篇“SpringBoot如何读取资源目录中的JSON文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot...
    99+
    2023-07-06
  • Java怎么实现的读取资源文件工具类ResourcesUtil实例
    这篇文章将为大家详细讲解有关Java怎么实现的读取资源文件工具类ResourcesUtil实例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例讲述了Java实现的读取资源文件工具类Resources...
    99+
    2023-05-30
    java
  • Java读取resources中资源文件路径以及jar中文件无法读取的解决
    目录Java读取resources中资源文件路径以及jar中文件无法读取的解决问题描述前言1、本地运行读取资源文件2、读取jar包中的文件信息聊聊Java项目读取resources资...
    99+
    2023-05-20
    Java读取resources Java读取resources文件路径 jar文件无法读取
  • Java中怎么读取WEB应用中的资源
    今天就跟大家聊聊有关Java中怎么读取WEB应用中的资源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题:前几天,碰到了需要从web应用读取文件内容的问题。一般的,配置文件都放在工...
    99+
    2023-06-17
  • java怎么读取文件输出文件流
    Java中可以使用文件输入流(FileInputStream)和文件输出流(FileOutputStream)来读取和输出文件流。读...
    99+
    2023-09-20
    java
  • java怎么读取resource下的文件
    在Java中,可以使用以下代码读取`resources`目录下的文件:```javaimport java.io.IOExcepti...
    99+
    2023-09-13
    java
  • Android使用URL读取网络资源的方法
    URL(Uniform Resource Locator)是统一资源定位器,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览...
    99+
    2023-05-30
    android url 网络资源
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作