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);
}
}