603 lines
16 KiB
C#
603 lines
16 KiB
C#
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 UnityEditor;
|
|
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 PaintCount = VehiclePaintDic[curType].Count;
|
|
var unlockCount = GetUnlockSkinCount(VehiclePaintDic[curType]);
|
|
Text_PartName.text = CommonUtils.GetLocalizeText("Vehicle_PartName_" + CurType);
|
|
Text_Count.text = unlockCount + "/" + PaintCount;
|
|
|
|
if ((int)curType < curEquipSkinIDs.Count && curEquipSkinIDs[(int)curType] == 0)
|
|
SetCurSelectSkin(VehiclePaintDic[curType][0].PaintID);
|
|
else
|
|
SetCurSelectSkin(curEquipSkinIDs[(int)curType]);
|
|
}
|
|
}
|
|
|
|
private List<TypeToggle> toggles = new();
|
|
|
|
private List<int> curEquipSkinIDs = new();
|
|
|
|
private Dictionary<PaintType, Material> curEquipedMaterial = new();
|
|
|
|
private int curSelectSkinID = -1;
|
|
//private List<DataVehiclePaint> VehiclePaints = new List<DataVehiclePaint>();
|
|
private Dictionary<PaintType, List<DataVehiclePaint>> VehiclePaintDic = new();
|
|
private Dictionary<int, SkinItem> recycleItem = new();
|
|
|
|
class VehicleData
|
|
{
|
|
public long VehicleID;
|
|
public GameObject VehicleModel;
|
|
|
|
public VehicleData(long vehicleID, GameObject vehicleModel)
|
|
{
|
|
VehicleID = vehicleID;
|
|
VehicleModel = vehicleModel;
|
|
}
|
|
}
|
|
|
|
public async static UniTask<UIWindow> 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<SkinnedMeshRenderer>();
|
|
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<RecycleView>();
|
|
SkinScrollView.Init(OnRefreshItem);
|
|
BindButton(Button_back, OnBack_Click);
|
|
BindButton(Button_Equipment, OnEquipButtonClick);
|
|
|
|
var currencyList = GetComponent<UI_CurrencyList>("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<DataVehiclePaint>());
|
|
}
|
|
|
|
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<TypeToggle>() {
|
|
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<uint>(EventManager.EventName.ItemChange, OnItemChange);
|
|
EventManager.Instance.Register(EventManager.EventName.CharacterInfoRefresh, OnDataRefresh);
|
|
}
|
|
|
|
//invoke when open window
|
|
protected override void OnShowWindow(object data = null)
|
|
{
|
|
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
|
|
var currencyList = GetComponent<UI_CurrencyList>("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<uint>(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<SkinnedMeshRenderer>();
|
|
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);
|
|
}
|
|
}
|
|
SetCurSelectSkin(curSelectSkinID);
|
|
}
|
|
|
|
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)
|
|
{
|
|
if (curSelectSkinID == id)
|
|
return;
|
|
ResetSkin();
|
|
curSelectSkinID = 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");
|
|
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 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<SkinnedMeshRenderer>();
|
|
|
|
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<DataVehiclePaint> paints)
|
|
{
|
|
int count = 0;
|
|
foreach (var paint in paints)
|
|
{
|
|
var status = GetSkinStatus(paint.PaintID);
|
|
if (status != SkinStatus.Locked)
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
#region ButtonClick
|
|
void OnBack_Click()
|
|
{
|
|
CloseWindow();
|
|
}
|
|
|
|
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);
|
|
}
|
|
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
|
|
}
|
|
|
|
public class TypeToggle : UIGameObjectWrapper
|
|
{
|
|
Action<PaintType> callback;
|
|
GameObject lightBar;
|
|
PaintType toggleType;
|
|
|
|
public TypeToggle(GameObject root, PaintType toggleType, Action<PaintType> OnToggleCallback) : base(root)
|
|
{
|
|
lightBar = FindObj("LightBar");
|
|
callback = OnToggleCallback;
|
|
this.toggleType = toggleType;
|
|
|
|
var button = GetComponent<Button>();
|
|
CommonUtils.BindButton(button, OnButtonClick);
|
|
|
|
IsScaleShow = true;
|
|
}
|
|
|
|
void OnButtonClick()
|
|
{
|
|
callback?.Invoke(toggleType);
|
|
}
|
|
public void ResetLightBar(PaintType curPaintType)
|
|
{
|
|
lightBar.SetActive(curPaintType == toggleType);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region RecycleView
|
|
private void OnRefreshItem(GameObject cell, int index)
|
|
{
|
|
if (!recycleItem.TryGetValue(cell.GetInstanceID(), out SkinItem item))
|
|
{
|
|
item = new SkinItem(cell, OnSelectSkin);
|
|
recycleItem.Add(cell.GetInstanceID(), item);
|
|
}
|
|
item.SetInfo(VehiclePaintDic[CurType][index]);
|
|
item.RefreshSelected(curSelectSkinID);
|
|
}
|
|
|
|
public class SkinItem : UIGameObjectWrapper
|
|
{
|
|
int SkinID;
|
|
public int ItemID;
|
|
Action<int> callback;
|
|
|
|
public SkinItem(GameObject root, Action<int> OnClickCallback) : base(root)
|
|
{
|
|
callback = OnClickCallback;
|
|
}
|
|
|
|
public async void SetInfo(DataVehiclePaint data)
|
|
{
|
|
SkinID = data.PaintID;
|
|
ItemID = data.ItemID;
|
|
GetComponent<TMP_Text>("Text_Name").text = VehicleDataHelper.GetVehicleSkinName(SkinID);
|
|
var button = GoRoot.GetComponent<Button>();
|
|
|
|
var Mask = FindObj("Image_DrakHide");
|
|
var Locked = FindObj("Image_Locked");
|
|
var Equiped = FindObj("Image_CurrentEquipment");
|
|
|
|
bool unlock = VehicleDataHelper.IsVehicleSkinUnlock(data.PaintID);
|
|
if (Mask != null)
|
|
Mask.SetActive(!unlock);
|
|
if (Locked != null)
|
|
Locked.SetActive(!unlock);
|
|
|
|
bool isEquiped = false;
|
|
var vehicleID = data.HostVehicle;
|
|
var Vehiclecfg = Actor.Instance.Character.GetVehicleDevelopment(vehicleID);//.paint_set;
|
|
if (Vehiclecfg != null)
|
|
{
|
|
var paintSet = Vehiclecfg.paint_set;
|
|
foreach (var paint in paintSet)
|
|
{
|
|
if (paint == data.PaintID)
|
|
{
|
|
isEquiped = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (Equiped != null)
|
|
Equiped.SetActive(isEquiped);
|
|
|
|
button.onClick.RemoveAllListeners();
|
|
CommonUtils.BindButton(button, OnClick);
|
|
|
|
var sprite = await AssetManager.Instance.LoadAssetAsync<Sprite>(data.IconPath);
|
|
GetComponent<Image>("VehicleIcon/Image_Icon").sprite = sprite;
|
|
|
|
IsScaleShow = true;
|
|
}
|
|
|
|
private void OnClick()
|
|
{
|
|
callback?.Invoke(SkinID);
|
|
}
|
|
|
|
public void RefreshSelected(int SkinID)
|
|
{
|
|
var selected = FindObj("Image_SelectedBorder");
|
|
selected.SetActive(SkinID == this.SkinID);
|
|
}
|
|
}
|
|
|
|
void OnSelectSkin(int SkinID)
|
|
{
|
|
DebugUtil.Log("OnSelectSkin SkinID = " + SkinID);
|
|
SetCurSelectSkin(SkinID);
|
|
|
|
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
|
|
}
|
|
#endregion
|
|
|
|
}
|