上篇博文说到了,资源是怎么上传到服务器的,这篇博文说说,资源是怎么在主程序中加载的。
资源上传到服务器后,我们的后台工程师需要把上传的文件做一个处理:那就是把上传的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加载完成的回调函数中,实例化对应的资源。
至此,从上传模型资源到服务器,再到从服务器获取对应信息并且实例化模型资源的流程就完成了。