iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >unity 如何使用文件流读取streamingassets下的资源
  • 960
分享到

unity 如何使用文件流读取streamingassets下的资源

2024-04-02 19:04:59 960人浏览 独家记忆
摘要

目的:读取streamingassets下的文件中指定的一段字节 已知:文件中的起始位置,和需要读取的长度 1.Android下读取 1.1 不能直接使用C#的FileStream,

目的:读取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 文件夹 少用


//资源卸载
    

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解析

4:Application.temporaryCachePath

来操作文件 同上但是 此属性用于返回一个临时数据的缓存目录(不会备份并且清空缓存会清掉)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
  • unity 如何使用文件流读取streamingassets下的资源
    目的:读取streamingassets下的文件中指定的一段字节 已知:文件中的起始位置,和需要读取的长度 1.android下读取 1.1 不能直接使用C#的FileStream,...
    99+
    2024-04-02
  • unity怎么使用文件流读取streamingassets下的资源
    这篇文章将为大家详细讲解有关unity怎么使用文件流读取streamingassets下的资源,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目的:读取streamingassets下的文件中指定的一段字节...
    99+
    2023-06-14
  • Android应用中是如何读取资源文件的
    这篇文章给大家介绍Android应用中是如何读取资源文件的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 读取资源文件实例详解直接从assets读取:private InputStream getAsse...
    99+
    2023-05-31
    android roi
  • Java读取resources下的文件及资源路径
    Java读取resources下的文件及资源路径 在Java开发中,经常需要读取项目中resources目录下的文件或获取资源路径。本文将介绍如何在Java中读取resources下的文件,并提供相关...
    99+
    2023-08-31
    java 前端 数据库
  • SpringBoot如何读取资源目录中的JSON文件
    这篇“SpringBoot如何读取资源目录中的JSON文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot...
    99+
    2023-07-06
  • 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 读取
  • Java读取resources中资源文件路径以及jar中文件无法读取如何解决
    今天小编给大家分享的是Java读取resources中资源文件路径以及jar中文件无法读取如何解决,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Java读取resources中资源文...
    99+
    2023-07-06
  • C#如何使用Resources资源文件
    这篇文章主要讲解了“C#如何使用Resources资源文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何使用Resources资源文件”吧!一、创建资源文件可以将字符串、图像或对象数...
    99+
    2023-07-02
  • SpringBoot 如何读取classpath下的文件
    SpringBoot 读取classpath下文件 开发过程中,必不可少的需要读取文件,对于打包方式的不同,还会存在一些坑,比如以jar包方式部署时,文件都存在于jar包中,某些读取...
    99+
    2024-04-02
  • springboot如何读取resources下的文件
    今天小编给大家分享一下springboot如何读取resources下的文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项...
    99+
    2023-07-02
  • 怎么在Unity中使用TextAsset读取配置文件
    这篇文章将为大家详细讲解有关怎么在Unity中使用TextAsset读取配置文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1 支持文件类型.txt.html.htm.xml.bytes....
    99+
    2023-06-14
  • SpringBoot如何读取Resource下文件
    这篇文章给大家分享的是有关SpringBoot如何读取Resource下文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SpringBoot读取Resource下文件最近在项目中涉及到Excle的导入功能,通常...
    99+
    2023-06-20
  • Java读取resources中资源文件路径以及jar中文件无法读取的解决
    目录Java读取resources中资源文件路径以及jar中文件无法读取的解决问题描述前言1、本地运行读取资源文件2、读取jar包中的文件信息聊聊Java项目读取resources资...
    99+
    2023-05-20
    Java读取resources Java读取resources文件路径 jar文件无法读取
  • 如何使用JavaScript读取文件
    如何使用JavaScript读取文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。读取方法:1、用“readAs...
    99+
    2024-04-02
  • 如何使用python读取文件
    使用python读取文件的方法:1.使用open方式逐行读取;2.使用with方式逐行读取;3.使用read()函数读取文件的全部内容;具体方法如下:使用open方式逐行读取文件# 打开文件f = open("file.txt&q...
    99+
    2024-04-02
  • Java如何读取整个文件流
    在Java中,可以使用`InputStream`类来读取文件流。以下是一个示例代码,演示如何读取整个文件流并将其打印出来:```ja...
    99+
    2023-08-26
    Java
  • python如何流式读取大文件
    这篇文章将为大家详细讲解有关python如何流式读取大文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如何流式读取大文件使用with&hellip;open&hellip;可以从文件中读...
    99+
    2023-06-27
  • Android使用URL读取网络资源的方法
    URL(Uniform Resource Locator)是统一资源定位器,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览...
    99+
    2023-05-30
    android url 网络资源
  • 如何使用Python读取xml文件
    目录 什么是xml?获得标签属性获得子标签获得标签属性值获得标签对之间的数据方法一方法二 什么是xml? xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自...
    99+
    2023-05-15
    Python读取 Python读取xml Python读取文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作