using cfg.VihecleCultivateCfg; using Cysharp.Threading.Tasks; using Framework; using Gameplay; using Gameplay.Common; using Gameplay.Net; using Gameplay.Utils; using PhxhSDK; using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; using Button = UnityEngine.UI.Button; using Image = UnityEngine.UI.Image; public class UI_VehicleSkinController : UIWindow { public enum SkinStatus { Equiped, Unlocked, Locked } #region UI //UI GameObj ///Auto Gen Start/// //public Button Button_Back; public Button Button_back; public TMP_Text Text_Back; public Button Button_Home; public Image Image_DarkLeft; public Image Image_DarkLeftTop; public Image Image_DarkTop; public Image Image_DarkBottom; public Image Image_OrganizatioFlag; public Image Image_AngularShape0; public TMP_Text Text_VehicleType; public Image Image_AngularShape1; public TMP_Text Text_Level; public Image Image_AngularShape2; public TMP_Text Text_Organization; public TMP_Text Text_VehicleName; public Button Button_Part0; public Button Button_Part1; public Button Button_Part2; public Image Image_LineLeft; public Image Image_LineBottom; public TMP_Text Text_Title; public TMP_Text Text_PartName; public TMP_Text Text_Count; public ScrollRect ScrollRect_VehicleSkin; public Image Image_Bg; public Image Image_SelectedBorder; public Image Image_Icon; public TMP_Text Text_Name; public Image Image_DrakHide; public Image Image_Locked; public Image Image_CurrentEquipment; public Button Button_Equipment; public TMP_Text Text_Equipment; public TMP_Text Text_Consume; ///Auto Gen End/// #endregion private RecycleView SkinScrollView; private long VehicleID = -1; private GameObject m_VehicleModel = null; private PaintType curType = PaintType.None; private PaintType CurType { get { return curType; } set { curType = value; var paintList = VehiclePaintDic.TryGetValue(curType, out var list) ? list : null; var PaintCount = paintList != null ? paintList.Count : 0; var unlockCount = GetUnlockSkinCount(paintList); Text_PartName.text = CommonUtils.GetLocalizeText("Vehicle_PartName_" + CurType); Text_Count.text = unlockCount + "/" + PaintCount; if(PaintCount == 0) { DebugUtil.LogError("没有找到涂装数据,涂装类型: " + CurType); Button_Equipment.interactable = false; return; } if ((int)curType < curEquipSkinIDs.Count && curEquipSkinIDs[(int)curType] == 0) SetCurSelectSkin(VehiclePaintDic[curType][0].PaintID); else SetCurSelectSkin(curEquipSkinIDs[(int)curType]); } } private List toggles = new(); private List curEquipSkinIDs = new(); private Dictionary curEquipedMaterial = new(); private int curSelectSkinID = -1; //private List VehiclePaints = new List(); private Dictionary> VehiclePaintDic = new(); private Dictionary recycleItem = new(); class VehicleData { public long VehicleID; public GameObject VehicleModel; public VehicleData(long vehicleID, GameObject vehicleModel) { VehicleID = vehicleID; VehicleModel = vehicleModel; } } public async static UniTask Open(long vehicleID, GameObject model = null) { VehicleData data = new VehicleData(vehicleID, model); return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_VehicleSkin, data); } // deal with input data public override void PreLoad(object data = null) { var vehicleData = data as VehicleData; VehicleID = vehicleData.VehicleID; m_VehicleModel = vehicleData.VehicleModel; DebugUtil.Log("VehicleID : " + VehicleID); for (int i = 1; i < (int)PaintType.Max; i++) { var part = VehicleDataHelper.FindVehiclePartRoot(m_VehicleModel, (int)VehicleID, (PaintType)i); if (part != null) { var renderer = part.GetComponent(); var material = renderer.materials[0]; curEquipedMaterial.Add((PaintType)i, material); } } } // Use this for initialization public override void OnInit() { //bind UI GameObj UI_VehicleSkinBinder.GetComponents(this); SkinScrollView = ScrollRect_VehicleSkin.GetComponent(); SkinScrollView.Init(OnRefreshItem); BindButton(Button_back, OnBack_Click); BindButton(Button_Home, OnHome_Click); BindButton(Button_Equipment, OnEquipButtonClick); var currencyList = GetComponent("UI_CurrencyList"); currencyList.SetData(GLConfig.Inst.data.DiamondItemId, GLConfig.Inst.data.GoldItemId); var name = VehicleDataHelper.GetVehicleLocalizeName((int)VehicleID); Text_VehicleName.text = name; var curShownVehicleData = VehicleCultivateDataManager.Instance.GetVehicleCultivateData((uint)VehicleID); Text_Level.text = CommonUtils.GetRomanCode(curShownVehicleData.Cfg.VehicleLevel); Text_Organization.text = VehicleDataHelper.GetVehicleOrganization((int)VehicleID); Text_VehicleType.text = VehicleDataHelper.GetVehicleCategory((int)VehicleID); VehiclePaint cfg = TableManager.Instance.Tables.VehiclePaint; foreach (var item in cfg.DataList) { if (item.HostVehicle == VehicleID) { var paintType = item.PaintType; if (!VehiclePaintDic.ContainsKey(paintType)) { VehiclePaintDic.Add(paintType, new List()); } VehiclePaintDic[paintType].Add(item); } } var Vehiclecfg = Actor.Instance.Character.GetVehicleDevelopment(VehicleID);//.paint_set; if (Vehiclecfg != null) { var paintSet = Vehiclecfg.paint_set; foreach(var paint in paintSet) { curEquipSkinIDs.Add((int)paint); } } else { DebugUtil.LogError("VehicleID = " + VehicleID + " 未找到涂装配置"); } CurType = PaintType.Entirety; toggles = new List() { new TypeToggle(Button_Part0.gameObject, PaintType.Entirety, OnTypeToggleClick), new TypeToggle(Button_Part1.gameObject, PaintType.Fort, OnTypeToggleClick), new TypeToggle(Button_Part2.gameObject, PaintType.CaterpillarBelt, OnTypeToggleClick) }; foreach (var toggle in toggles) { toggle.ResetLightBar(CurType); } EventManager.Instance.Register(EventManager.EventName.ItemChange, OnItemChange); EventManager.Instance.Register(EventManager.EventName.CharacterInfoRefresh, OnDataRefresh); } //invoke when open window protected override void OnShowWindow(object data = null) { var PaintList = VehiclePaintDic.TryGetValue(CurType, out List paintList) ? paintList : new List(); SkinScrollView.ShowList(PaintList.Count); var currencyList = GetComponent("UI_CurrencyList"); currencyList.Refresh(); } //invoke when reload window protected override void OnReloadWindow(object data = null) { } //invoke when close window protected override void OnHideWindow() { } //invoke when destroy public override void OnRelease() { ResetSkin(); base.OnRelease(); //EventManager.Instance.Send(EventManager.EventName.EN_UIControllCultivateMainInput, true); EventManager.Instance.Unregister(EventManager.EventName.ItemChange, OnItemChange); EventManager.Instance.Unregister(EventManager.EventName.CharacterInfoRefresh, OnDataRefresh); //CommonUtils.ScreenshotReset(); } void ResetSkin() { for(int i = 1; i < (int)PaintType.Max; i++) { var part = VehicleDataHelper.FindVehiclePartRoot(m_VehicleModel, (int)VehicleID, (PaintType)i); if (part != null) { var renderer = part.GetComponent(); if (curEquipedMaterial.ContainsKey((PaintType)i) && renderer.materials.Length > 0) { renderer.materials[0].CopyMatchingPropertiesFromMaterial(curEquipedMaterial[(PaintType)i]); } } } } void OnItemChange(uint itemID) { //皮肤物品获取更新 foreach (var skinItem in recycleItem) { var SkinItemID = skinItem.Value.ItemID; if (SkinItemID == itemID) { SkinScrollView.ShowList(VehiclePaintDic[CurType].Count); } } var cur = curSelectSkinID; CurType = curType; SetCurSelectSkin(cur); } async void OnDataRefresh() { DebugUtil.Log("OnDataRefresh"); var Vehiclecfg = Actor.Instance.Character.GetVehicleDevelopment(VehicleID);//.paint_set; if (Vehiclecfg != null) { var paintSet = Vehiclecfg.paint_set; curEquipSkinIDs.Clear(); foreach (var paint in paintSet) { curEquipSkinIDs.Add((int)paint); if (paint != 0) { var cfg = TableManager.Instance.Tables.VehiclePaint.GetOrDefault((int)paint); var materialPath = PathEx.GetVehiclePaintPath((int)VehicleID, (int)paint); var material = await CommonUtils.GetVehiclePaintMaterial(materialPath); if(material != null) { curEquipedMaterial[cfg.PaintType] = material; } } } } SkinScrollView.ShowList(VehiclePaintDic[CurType].Count); SetCurSelectSkin(curSelectSkinID); } async void SetCurSelectSkin(int id) { var skinStatus = GetSkinStatus(id); Button_Equipment.interactable = true; GameObject buttonIcon = CommonUtils.GetGameObject(Button_Equipment.gameObject, "icon"); foreach (Transform child in buttonIcon.transform) { child.gameObject.SetActive(false); } Text_Consume.text = ""; switch (skinStatus) { case SkinStatus.Unlocked: Text_Equipment.text = CommonUtils.GetLocalizeText("Vehicle_PaintUnlock_Equip"); break; case SkinStatus.Equiped: Text_Equipment.text = CommonUtils.GetLocalizeText("Vehicle_PaintUnlock_Equiped"); Button_Equipment.interactable = false; break; case SkinStatus.Locked: var Cfg = TableManager.Instance.Tables.VehiclePaint.GetOrDefault(id); if (Cfg != null) { switch (Cfg.UnlockType) { case PaintIUnlockType.Diamond: Text_Equipment.text = ""; var diamondCost = Cfg.PaintCost; if (diamondCost.Count > 0) { var itemCount = diamondCost[0].Count; var diamondIcon = CommonUtils.GetGameObject(buttonIcon, "diamond"); diamondIcon.SetActive(true); Text_Consume.text = itemCount.ToString(); } break; case PaintIUnlockType.CampaignScore: Text_Equipment.text = ""; var score = Cfg.PaintCost; if (score.Count > 0) { var itemCount = score[0].Count; Text_Consume.text = itemCount.ToString(); var scoreIcon = CommonUtils.GetGameObject(buttonIcon, "PvpCoins"); scoreIcon.SetActive(true); } break; case PaintIUnlockType.VehicleExp: Text_Equipment.text = CommonUtils.GetLocalizeText("Vehicle_PaintUnlock_VehicleExp"); break; case PaintIUnlockType.LimitedTimeActivity: Text_Equipment.text = CommonUtils.GetLocalizeText("Vehicle_PaintUnlock_TimeLimited"); Button_Equipment.interactable = false; break; } } break; default: DebugUtil.LogError("未知皮肤状态"); break; } if (curSelectSkinID == id) return; ResetSkin(); curSelectSkinID = id; DebugUtil.Log("设置载具涂装材质"); #if UNITY_EDITOR if (m_VehicleModel != null) { var body = VehicleDataHelper.FindVehiclePartRoot(m_VehicleModel, (int)VehicleID, CurType); if (body == null) { DebugUtil.LogError("未找到车辆模型部位: " + CurType); return; } var renderer = body.GetComponent(); var materialPath = PathEx.GetVehiclePaintPath((int)VehicleID, id); var material = await CommonUtils.GetVehiclePaintMaterial(materialPath); if (material == null) { DebugUtil.LogError("未找到材质"); return; } DebugUtil.Log("material = " + material.name); renderer.materials = new Material[] { material }; } #endif } public SkinStatus GetSkinStatus(int id) { foreach (var skin in curEquipSkinIDs) { if (skin == id) { return SkinStatus.Equiped; } } var skinCfg = TableManager.Instance.Tables.VehiclePaint.GetOrDefault(id); if (skinCfg != null) { var itemID = skinCfg.ItemID; if (CategoryManager.Instance.GetItemCount(itemID) > 0)//拥有皮肤时,显示可装配 { return SkinStatus.Unlocked; } else//未拥有皮肤,显示可购买 { return SkinStatus.Locked; } } return SkinStatus.Locked; } public int GetUnlockSkinCount(List paints) { int count = 0; if (paints == null) return count; foreach (var paint in paints) { var status = GetSkinStatus(paint.PaintID); if (status != SkinStatus.Locked) { count++; } } return count; } #region ButtonClick void OnBack_Click() { CloseWindow(); } void OnHome_Click() { CommonUtils.HomeToMain(); } void OnEquipButtonClick() { var Cfg = TableManager.Instance.Tables.VehiclePaint.GetOrDefault(curSelectSkinID); var skinStatus = GetSkinStatus(curSelectSkinID); switch (skinStatus) { case SkinStatus.Unlocked: DebugUtil.Log("装备皮肤"); NetHelper.VehicleSetPaint((uint)Cfg.HostVehicle, (uint)Cfg.PaintID); break; case SkinStatus.Locked: DebugUtil.Log("购买皮肤"); var cost = Cfg.PaintCost; foreach(cfg.item.ItemCounts itemCounts in cost) { var itemCount = itemCounts.Count; var itemID = itemCounts.Id; if (CategoryManager.Instance.GetItemCount(itemID) < itemCount) { CommonUtils.ShowMessageTips(CommonUtils.GetLocalizeText("shop_noMoney")); return; } } NetHelper.VehicleBuyPaint((uint)Cfg.HostVehicle, (uint)Cfg.PaintID); break; default: DebugUtil.Log(""); break; } } void OnTypeToggleClick(PaintType type) { CurType = type; foreach (var toggle in toggles) { toggle.ResetLightBar(CurType); } var paintList = VehiclePaintDic.TryGetValue(CurType, out var list) ? list : new List(); SkinScrollView.ShowList(paintList.Count); } public class TypeToggle : UIGameObjectWrapper { Action callback; GameObject lightBar; PaintType toggleType; public TypeToggle(GameObject root, PaintType toggleType, Action OnToggleCallback) : base(root) { lightBar = FindObj("LightBar"); callback = OnToggleCallback; this.toggleType = toggleType; var button = GetComponent