123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- 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 path = Application.persistentDataPath + "/PlayerGoods.json";
- if (File.Exists(path))
- {
- string jsonStr = File.ReadAllText(path);
- List<Good> goods = JsonMapper.ToObject<List<Good>>(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<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);
- }
- }
|