基于Addressable的远程加载资源的模型商店

本文档描述了资源如何从服务器加载到主程序中。首先,后台工程师修改上传的CatalogJson,将bundle包文件路径改为服务器地址。主程序通过服务器获取资源信息的List,然后使用UnityWebRequest加载封面图片,并根据资源类型实例化商品预制体,添加特定的ShopPiece脚本以处理商品信息。BuyItem方法用于根据资源Json路径加载CatalogJson并实例化资源。
摘要由CSDN通过智能技术生成

上篇博文说到了,资源是怎么上传到服务器的,这篇博文说说,资源是怎么在主程序中加载的。

资源上传到服务器后,我们的后台工程师需要把上传的文件做一个处理:那就是把上传的Catalog Json修改一下:把这个Json中记录bundle包文件的路径改成对应的服务器地址,要改的Json属性如下:

我们主程序与服务器通信时,服务器给我们的主程序返回一个包含所有上传资源信息的List,List中的每个元素格式为:,在程序中构建一个接收类:

/****************************************************
    文件:AssetModel.cs
	作者:Paul   邮箱: 794451358@qq.com
    日期:2020/9/14 11:58:5
	功能:接收Json的类
*****************************************************/


using UnityEngine;
using System.Collections.Generic;
using System.Collections; 
namespace DaschowStreet
{
    public struct AssetModel 
    {
        /// <summary>
        /// 资源AssetKey
        /// </summary>
        public string AssetKey;
        /// <summary>
        /// 封面图片下载地址
        /// </summary>
        public string ImageUrl;
        /// <summary>
        /// 对应物体的Json下载地址
        /// </summary>
        public string JsonUrl;
        /// <summary>
        /// 商品描述
        /// </summary>
        public string Description;
        /// <summary>
        /// 商品售价
        /// </summary>
        public double Cost;
        /// <summary>
        /// 资源的名字
        /// </summary>
        public string AssetName;
        /// <summary>
        /// 资源的类型
        /// </summary>
        public string PieceType;


    }
   
    public class MainJson
    {
        public int code;
        public List<AssetModel> data;
    }
    public class GetStringList
    {
        public int code;
        public List<string> data;
    }

}

接收函数:

        /// <summary>
        /// 解析服务器返回的商店商品的信息
        /// </summary>
        private void ShopJsonParse()
        {
            //判断当前请求的地址是否是公共商店接口GetURL
            if (NetGet.GetUrl == GlobalVariable.PublicShopURL)
            {
                //检测是否有返回值
                if (!string.IsNullOrEmpty(NetGet.NetReturnText))
                {
                    var mainJson = JsonMapper.ToObject<MainJson>(NetGet.NetReturnText);
                    m_AssetModels = mainJson.data;
                    Shop.PiecesCount = m_AssetModels.Count;
                    NetGet.GetUrl = "";
                    StopCoroutine(m_PublicShopGetCorutine);
                    UILoadingInit();
                }
            }

        }

         /// <summary>
        /// 开启协程加载商品的封面图片和初始化商品
        /// </summary>
        public void UILoadingInit()
        {

            StartCoroutine(LoadUIImage());
        }
IEnumerator LoadUIImage()
        {

            foreach (var model in m_AssetModels)
            {
                var url = model.ImageUrl;
                print(url);
                UnityWebRequest request = UnityWebRequestTexture.GetTexture(url);

                yield return request.SendWebRequest();

                if (request.isHttpError || request.isNetworkError)
                {
                    Debug.Log(request.error);
                }
                else
                {
                    var icon = DownloadHandlerTexture.GetContent(request);
                    //从Resources文件夹加载预制体
                    var shopPieceRes = Resources.Load<GameObject>("ShopPiece");
                    //实例化商品预制体
                    var shopPieceObj = Instantiate(shopPieceRes, Shop.ItemGroup);
                    var shopPieceType = (ShopPieceType)(int.Parse(model.PieceType));
                    print("模型的类别:"+model.PieceType);
                    print(shopPieceType);
                    if (shopPieceType == ShopPieceType.Fruit)
                    {

                        var shopPiece = shopPieceObj.AddComponent<FruitShopPiece>();
                        shopPiece.InitPiece(icon, model.AssetKey, model.AssetName, float.Parse(model.Cost.ToString()), model.Description, model.JsonUrl);
                        
                    }
                    else if (shopPieceType == ShopPieceType.BuildingMaterial)
                    {
                        var hasBought = GlobalVariable.HasBoughtList.Contains(model.AssetKey);
                        var shopPiece = shopPieceObj.AddComponent<BuiltMaterialPiece>();
                        shopPiece.InitPiece(icon, model.AssetKey, model.AssetName, float.Parse(model.Cost.ToString()), model.Description, model.JsonUrl,hasBought);

                    }
                    shopPieceObj.HideGo();
                    Shop.PiecesList.Add(shopPieceObj);






                    /// TODO:后面再写,显示已经售出的逻辑
                    /// 
                    /*if (GlobalVariable.HasBoughtList.Contains(shopPiece.AddressName))
                    {
                        shopPiece.HasBought = true;
                        shopPiece.transform.GetChild(0).ShowGo();
                        shopPiece.GetComponent<Button>().interactable = false;
                    }*/
                }
            }


        }

其中实例化商品封面预制体的时候,添加的XXXShopPiece脚本是继承自IShopPiece的子类,脚本主要负责记载图片中对应商品物体的具体信息,具体代码如下:

/****************************************************
    文件:IShopPiece.cs
	作者:Paul   邮箱: 794451358@qq.com
    日期:2020/10/27 9:55:57
	功能:ShopPiece的基类
*****************************************************/


using UnityEngine;
using System.Collections.Generic;
using System.Collections;
using PFarmeWork;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.AddressableAssets.ResourceLocators;

namespace DaschowStreet
{
    public enum ShopPieceType:int
    {
        None = 0,
        Fruit,
        BuildingMaterial
    }
    public abstract class IShopPiece : MonoBehaviourSimplify
    {
        /// <summary>
        /// 物体的AssetKey
        /// </summary>
        private string m_AddressName;
        /// <summary>
        /// 物体的名字
        /// </summary>
        private string m_ObjName;
        /// <summary>
        /// 物体的价格
        /// </summary>
        private float m_Cost = 0;
        /// <summary>
        /// 物体的描述
        /// </summary>
        private string m_Description;
        /// <summary>
        /// 物体的Json地址
        /// </summary>
        private string m_JsonSrc;
        /// <summary>
        /// 商品的封面图片
        /// </summary>
        private Texture m_ObjImg;

        protected bool m_HasBought = false;



        public bool HasBought
        {
            get => m_HasBought;
        }

        public string AddressName
        {
            get => m_AddressName;
        }
        public string ObjName
        {
            get => m_ObjName;
        }
        public float Cost
        {
            get => m_Cost;
        }
        public string Description
        {
            get => m_Description;
        }
        public string JsonSrc
        {
            get => m_JsonSrc;
        }
        public Texture ObjImg
        {
            get => m_ObjImg;
        }

        /*public IShopPiece(Texture objImg, string addressName, string objName, float cost, string description, string jsonSrc)
        {
            m_AddressName = addressName;
            m_ObjName = objName;
            m_Cost = cost;
            m_Description = description;
            m_JsonSrc = jsonSrc;
            m_ObjImg = objImg;
           
        }*/

        public virtual void InitPiece(Texture objImg, string addressName, string objName, float cost, string description, string jsonSrc, bool hasBought = false)
        {
            m_AddressName = addressName;
            m_ObjName = objName;
            m_Cost = cost;
            m_Description = description;
            m_JsonSrc = jsonSrc;
            m_ObjImg = objImg;
            hasBought = m_HasBought;
        }
        public abstract void OnBtnClick();
        protected virtual void SpawnPiece()
        {
          ShopManager.Instance.SpawnAsync(m_AddressName,ShopManager.Instance.SpawnPoint.position, Vector3.zero, Vector3.one);
            AfterBuy();
        }
        public virtual void BuyItem()
        {
            if (!string.IsNullOrEmpty(m_AddressName) && !string.IsNullOrEmpty(m_JsonSrc))
            {
                try
                {
                    GlobalVariable.AddressAssetDic.Add(AddressName, this);
                }
                catch
                {
                    print("已经添加过了");
                }
                Addressables.LoadContentCatalogAsync(m_JsonSrc).Completed += LoadContentCompleted;
            }
        }
        private void LoadContentCompleted(AsyncOperationHandle<IResourceLocator> obj)
        {

            SpawnPiece();
        }
        public abstract void AfterBuy();
       

    }

}

上述代码中的BuyItem的逻辑是:当UI点击到图片时,程序可以根据XXShopPiece中记录的资源Json路径,去把资源的Catalog Json加载进来,然后在Json加载完成的回调函数中,实例化对应的资源。

至此,从上传模型资源到服务器,再到从服务器获取对应信息并且实例化模型资源的流程就完成了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

int_Paul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值