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; /// 已穿戴的物品信息 public List WornPackageItems = new List(); /// 临时已穿戴的物品信息 public List TempWornPackageItems = new List(); public static Camera mainCam; public static Camera UICam; void Start() { Inst=this; mainCam = GameObject.Find("Camera").GetComponent(); UICam = GameObject.Find("UICamera").GetComponent(); } /// /// 匹配玩家的Character /// /// public void MatchCharacterRender(CharacterRender cr) { if (cr) selfRender = cr; } /// /// 重新匹配玩家扭脸和换装数据 /// /// 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); } } } /// /// 将玩家换装数据保存到本地Json /// public void GoodsSaveToFile() { List goods = new List(); foreach(var item in selfRender.dressRenders) { goods.Add(item.Value.good); } string jsonStr=JsonMapper.ToJson(goods); File.WriteAllText(Application.persistentDataPath + "/PlayerGoods.json", jsonStr); } /// /// 将玩家换装数据从本地Json读取 /// /// public async void GoodsReadFromFile(CharacterRender cr) { string path = Application.persistentDataPath + "/PlayerGoods.json"; if (File.Exists(path)) { string jsonStr = File.ReadAllText(path); List goods = JsonMapper.ToObject>(jsonStr); foreach (var item in goods) { await ChangePlayerTex(cr, item); } } else Debug.Log("没有找到PlayerGoods.json文件!"); } 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 CreatNewDress(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(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(texName); ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent().material.SetTexture("_BaseMap", tex); //Debug.Log(tex); //Debug.Log(cdr.gameObject); } if (type == 8) { if(good.id!=80000) { var mat = await YooAssetManager.Instance.LoadAsset(good.id.ToString() + "_mat"); ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent().material = mat; } } if (type != 15 && type > 9 && type < 18) { var mat = await YooAssetManager.Instance.LoadAsset(good.id.ToString() + "_mat"); ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent().material = mat; } cdr.good = good; return (T)cdr.gameObject; } /// /// 释放selfRender(CharacterRender)所挂在的人物模型 /// /// public void CharacterDispose() { Destroy(selfRender.gameObject); } }