Unity3D 动态加载资源方式

在Unity3d游戏开发中,我们经常需要频繁创建物体,而其中的资源读取就是个问题。其中Unity为我们资源读取提供了几种基本方法,总的来说分为从内部读取和从外部读取。

1.Resources.Load()

该方法是从项目资源的Resources文件夹进行读取,为内部读取的方法。在项目打包时,Resources文件夹的所有资源会被压缩并加密,并打包进APK中,该文件为只读类型。建议只把需要的预制体打包进去,因为不需要的资源如果放进该文件夹会一起打包出去,造成空间的浪费。在路径参数上,参数默认为Resources/ + "(需要的资源路径)",根据需要输入即可。

2.WWW类读取

该方法是从外部读取,即从外部下载,会比从内部读取的时间要稍微慢一点。在安卓开发中,在打包时会自动生成一个名为StreamingAssets的文件夹,而我们可以手动生成该文件夹并把资源放进去,该文件与Resources对比,并没有进行加密,是完全打包到发布包中,而该文件夹可以通过www方式进行读取。

示例:

        string localPath;//定义资源路径
        #if UNITY_ANDROID//预处理语句 不同平台StreamingAssets的目录不同
        //Appication.streamingAssetsPath为文件目录
                localPath = Application.streamingAssetsPath + "/" + cfgName + ".txt";
        #else
                localPath = "file:///" + Application.streamingAssetsPath + "/" + cfgName + ".txt";
        #endif
                //通过www读取
                WWW www = new WWW(localPath);
                if (www.error != null)
                {
                    Debug.LogError("error : " + localPath);
                }
                //因为www是异步方法,所以通过while判断是否完成下载
                //也可以通过协程进行读取
                while (!www.isDone)
                {

                }

3.UnityWebRequest

当然,在现在的Unity高版本中,www这种方法已经被弃用了,对于StreamingAssets文件,我们可以通过UnityWebRequest这个Unity封装的方法进行读取。引入命名空间UnityEngine.Networking即可使用。在使用前,我们想了解一下这个类的组成。

UnityWebRequest组成的三个元素

UploadHandler 处理数据将数据发送到服务器的对象
DownloadHandler 从服务器接收数据的对象
UnityWebRequest 负责 HTTP通信流量控制来管理上面两个对象的对象

为了方便路径的寻找,我们引入一个System.Uri类,使用该类的Path.Combine方便我们拼接路径,因为不同的平台StreamingAssets文件的路径不尽相同。

Windows平台 file:///D:/DATA/StreamingAssets/data.json
WebGl平台 http://localhost/StreamingAssets/data.json
Android平台 jar:file:///data/app/xxx!/assets/data.json
iOS平台 Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw

示例:加载文本

public class JsonTest : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(GetData());
    }
 
    IEnumerator GetData()
    {
        var  uri = new  System.Uri(Path.Combine(Application.streamingAssetsPath,"test.txt"));
        UnityWebRequest www = UnityWebRequest.Get(uri);
        yield return www.SendWebRequest();
 
        if(www.isNetworkError || www.isHttpError) {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log(www.downloadHandler.text);
            string jsonStr  = www.downloadHandler.text;
 
            TestData data = JsonMapper.ToObject<TestData>(jsonStr);
            
            Debug.Log("姓名:" + data.userName + "\n年龄:" + data.age);
        }
    }
}
 
[System.Serializable]
public class TestData
{
    public string userName;
    public int age;
}

测试结果


{
   "userName":"王武",
   "age":26
}

示例:加载AssetBundle

IEnumerator GetAssetBundle(string url)
    {
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(path);
        yield return request.SendWebRequest();
 
        if (request.isDone)
        {
            AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request); 
            if (ab)
            {
                Instantiate(ab.LoadAsset("Cube"));
            }
        }
        request.Dispose();//记得使用完要释放呀 
    }

总结

Resources.Load() 比较适合不需要更改的数据,一些固定数据的游戏,因为项目打包出来的Resources文件只是可读的,如果需要频繁更改包里的数据的话,每次打包都需要耗费一定的时间。如果项目的数据是上传到服务器上的,推荐使用WWW或者UnityWebRequest方法
参考:
https://blog.csdn.net/Glow0129/article/details/104982681
https://blog.csdn.net/qq_33994566/article/details/100015041
https://blog.csdn.net/gaojinjingg/article/details/53128802

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值