using Cysharp.Threading.Tasks; using LitJson; using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using UnityEngine; public class CharacterManager : MonoBehaviour { public static CharacterManager Inst; public CharacterRender selfRender; /// <summary>�Ѵ�������Ʒ��Ϣ</summary> public List<Good> WornPackageItems = new List<Good>(); /// <summary>��ʱ�Ѵ�������Ʒ��Ϣ</summary> public List<Good> TempWornPackageItems = new List<Good>(); public static Camera mainCam; public static Camera UICam; void Start() { Inst=this; mainCam = GameObject.Find("Camera").GetComponent<Camera>(); UICam = GameObject.Find("UICamera").GetComponent<Camera>(); } /// <summary> /// ƥ����ҵ�Character /// </summary> /// <param name="ob"></param> public void MatchCharacterRender(CharacterRender cr) { if (cr) selfRender = cr; } /// <summary> /// ����ƥ�����Ť���ͻ�װ���� /// </summary> /// <param name="cr"></param> public async void CharacterClothReMatch(CharacterRender cr) { if (selfRender.dressRenders.Count>0) { foreach (var item in selfRender.dressRenders) { await ChangePlayerTex(cr, item.Value.good); //Debug.Log(cr.gameObject.name+"/"+item.Value.good.name); } } } /// <summary> /// ����һ�װ���ݱ��浽����Json /// </summary> public void GoodsSaveToFile() { List<Good> goods = new List<Good>(); foreach(var item in selfRender.dressRenders) { goods.Add(item.Value.good); } string jsonStr=JsonMapper.ToJson(goods); File.WriteAllText(Application.persistentDataPath + "/PlayerGoods.json", jsonStr); } /// <summary> /// ����һ�װ���ݴӱ���Json��ȡ /// </summary> /// <param name="cr"></param> public async void GoodsReadFromFile(CharacterRender cr) { string jsonStr = File.ReadAllText(Application.persistentDataPath + "/PlayerGoods.json"); List<Good> goods = JsonMapper.ToObject<List<Good>>(jsonStr); foreach(var item in goods) { await ChangePlayerTex(cr, item); } } public async UniTask ChangePlayerTex (CharacterRender cr, Good config) { //Debug.Log(config.id); switch (int.Parse(config.assetsType)) { case 1: await cr.SetPlayerCloth(config); break; case 2: await cr.SetPlayerBlendShape(config); break; case 3: await cr.SetTextrue(config); break; case 4: await cr.SetEyeTextrue(config); break; case 5: await cr.SetTextrue(config); break; } } public async UniTask<T> CreatNewDress<T>(Good good, CharacterDressRender cdr, string dir = null) where T : UnityEngine.Object { int type = good.id / 10000; string assetsName = null; if (good.assetsType == "1") { assetsName = ((good.id / 100) * 100).ToString(); if ((good.id / 100) == 1415)//���� { assetsName = good.id.ToString(); } } else { if (type == 4 || type == 9)//üë/���� { assetsName = $"{good.id}_BaseMap"; } if (type == 15)//���� { assetsName = ((good.id / 100) * 100).ToString(); assetsName = $"{int.Parse(assetsName) + 1}_{good.id}_BaseMap"; } } if (string.IsNullOrEmpty(assetsName)) { assetsName = good.id.ToString(); } assetsName += dir; var handle = await YooAssetManager.Instance.LoadAsset<T>(assetsName); if (handle as GameObject) { cdr.gameObject = GameObject.Instantiate(handle); } else { cdr.gameObject = handle; } //Debug.Log(type); if (type == 2) { int lastTwoDigits = good.id % 100; string texName = $"20000_200{lastTwoDigits.ToString("00")}_BaseMap"; var tex = await YooAssetManager.Instance.LoadAsset<Texture>(texName); ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent<SkinnedMeshRenderer>().material.SetTexture("_BaseMap", tex); //Debug.Log(tex); //Debug.Log(cdr.gameObject); } if (type == 8) { if(good.id!=80000) { var mat = await YooAssetManager.Instance.LoadAsset<Material>(good.id.ToString() + "_mat"); ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent<SkinnedMeshRenderer>().material = mat; } } if (type != 15 && type > 9 && type < 18) { var mat = await YooAssetManager.Instance.LoadAsset<Material>(good.id.ToString() + "_mat"); ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent<SkinnedMeshRenderer>().material = mat; } cdr.good = good; return (T)cdr.gameObject; } /// <summary> /// �ͷ�selfRender(CharacterRender)�����ڵ�����ģ�� /// </summary> /// <param name="cr"></param> public void CharacterDispose() { Destroy(selfRender.gameObject); } }