using cfg.SkillCfg; using cfg.VihecleCultivateCfg; using Cysharp.Threading.Tasks; using DG.Tweening; using Framework; using Gameplay; using Gameplay.Common; using Gameplay.Net; using Gameplay.Utils; using PhxhSDK; using System; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using Button = UnityEngine.UI.Button; using Image = UnityEngine.UI.Image; public class UI_VehicleCultivateProController : UIWindow { #region UI Bind //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_Look; public Image Image_Attributes; public TMP_Text Text_TitleAttri; public TMP_Text Text_EnAttri; public Image Image_Hp; public TMP_Text Text_HpTitle; public TMP_Text Text_HpValue; public Image Image_Def; public TMP_Text Text_DefTitle; public TMP_Text Text_DefValue; public Image Image_BulletCount; public TMP_Text Text_BulletCountTitle; public TMP_Text Text_BulletCountValue; public Image Image_MemberCount; public TMP_Text Text_MemberCountTitle; public TMP_Text Text_MemberCountValue; public Image Image_Atk; public TMP_Text Text_AtkTitle; public TMP_Text Text_AtkValue; public Image Image_Speed; public TMP_Text Text_SpeedTitle; public TMP_Text Text_SpeedValue; public Image Image_Terrain; public TMP_Text Text_TitleTerrain; public TMP_Text Text_EnTerrain; public Image Image_Ground; public TMP_Text Text_GroundTitle; public TMP_Text Text_GroundAdapt; public Image Image_Snow; public TMP_Text Text_SnowTitle; public TMP_Text Text_SnowAdapt; public Image Image_Mountain; public TMP_Text Text_MountainTitle; public TMP_Text Text_MountainAdapt; public Image Image_Wood; public TMP_Text Text_WoodTitle; public TMP_Text Text_WoodAdapt; public Button Button_Dev; public Button Button_Paint; public Image Image_VehicleSkill; public TMP_Text Text_TitleSkill; public TMP_Text Text_SkillName; public Image Image_SkillIcon; public Image Image_SkillCoolingTimeBg; public TMP_Text Text_SkillCoolingTimeValue; public TMP_Text Text_ClassTitle; public TMP_Text Text_SkillLevel; public TMP_Text Text_SkillInfo; public Button Button_TechTree; public PhxhScrollView ScrollView_VehicleList; ///Auto Gen End/// #endregion private long m_selectedVehicleID = 0; private long SelectedVehicleID { get { return m_selectedVehicleID; } set { m_selectedVehicleID = value; DebugUtil.Log("SelectedVehicleID: " + m_selectedVehicleID.ToString()); } } private bool m_isVehicleUIShow = false; private int AudioID = -1; private List m_unlockedVehicles = new(); public async static UniTask Open() { UIWindow uiWindow = await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_VehicleCultivatePro); CommonUtils.ChangeUIScene(Framework.Constants.UI_VEHICLE_CHOOSE_SCENE_PATH); var wind = uiWindow as UI_VehicleCultivateProController; wind.BindScene(); CameraManager.Instance.SetMainCameraActive(true); return uiWindow; } // deal with input data public override void PreLoad(object data = null) { } // Use this for initialization public override void OnInit() { //bind UI GameObj UI_VehicleCultivateProBinder.GetComponents(this); m_isVehicleUIShow = true; var currencyList = GetComponent("UI_CurrencyList"); currencyList.SetData();//GLConfig.Inst.data.DiamondItemId, GLConfig.Inst.data.GoldItemId BindButton(Button_TechTree, OnButton_TreeClick); BindButton(Button_Dev, OnButton_DevClick); BindButton(Button_Paint, OnButton_PaintClick); BindButton(Button_back, OnButton_backClick); BindButton(Button_Home, OnButton_HomeClick); BindButton(Button_Look, () => { HideUI(false); }); LoadVehicleList(); if (m_unlockedVehicles.Count > 0) { SelectedVehicleID = m_unlockedVehicles[0].Cfg.ID; } else { DebugUtil.LogWarning("None Vehicle"); FindObj("UI_LiuHaiLeft/Attributes").gameObject.SetActive(false); FindObj("UI_LiuHaiLeft/Terrain").gameObject.SetActive(false); Button_Dev.gameObject.SetActive(false); Button_Paint.gameObject.SetActive(false); Image_VehicleSkill.gameObject.SetActive(false); } VehicleInfoRefresh(); ScrollView_VehicleList.SetItemCountFunc(() => m_unlockedVehicles.Count); ScrollView_VehicleList.SetItemSizeFunc((index) => new Vector2(264, 96)); ScrollView_VehicleList.SetUpdateFunc(UpdateScrollViewItem); ScrollView_VehicleList.UpdateData(); AudioManager.Instance.StopAllMusic(); AudioID = AudioManager.Instance.PlayAudio(Framework.Constants.Sound.TEAM_VEHICLE, AudioCriManager.EPlayType.Sound, null, loop: true, isFade: true); EventManager.Instance.Register(EventManager.EventName.EN_UIControllCultivateMainInput, (Action)ControllInput); EventManager.Instance.Register(EventManager.EventName.VehecleUpgrade, OnVehicleInfoUpdate); } //invoke when open window protected override void OnShowWindow(object data = null) { var currencyList = GetComponent("UI_CurrencyList"); currencyList.Refresh(); ControllInput(true); if (_rotateTrans != null) { _rotateTrans.transform.DOKill(); _rotateTrans.transform.position = new Vector3(56, 0, 19); _rotateTrans.transform.rotation = Quaternion.Euler(0, 0, 0); } } //invoke when reload window protected override void OnReloadWindow(object data = null) { } //invoke when close window protected override void OnHideWindow() { ControllInput(false); } //invoke when destroy public override void OnRelease() { base.OnRelease(); AudioManager.Instance.StopSoundById(AudioID); EventManager.Instance.Unregister(EventManager.EventName.EN_UIControllCultivateMainInput, (Action)ControllInput); EventManager.Instance.Unregister(EventManager.EventName.VehecleUpgrade, OnVehicleInfoUpdate); } GameObject vRoot = null;//载具根节点 Transform _rotateTrans;//旋转镜头的Transform GameObject _vehicleGo = null; Dictionary _assetsLoadDic = new Dictionary(); void BindScene() { PhxhSDK.Res.SceneHandle sceneHandle = GameSceneHelper.Instance.GetCurrentUIViewScene(); if (sceneHandle != null) { DebugUtil.Log("scene name is:" + sceneHandle.Scene.name); var gos = sceneHandle.Scene.GetRootGameObjects(); foreach (var go in gos) { DebugUtil.Log("check go name: " + go.name); if (go.name.Equals("Vehicle_Root")) { vRoot = go; if (vRoot.transform.childCount > 0)//载具根节点下有子物体,说明已经加载过了,清空 { if (_vehicleGo != null) { if (vRoot.transform.GetChild(0).GetInstanceID() != _vehicleGo.GetInstanceID()) { foreach (Transform child in vRoot.transform) { Destroy(child.gameObject); } SetVehicleRoot(); } } else { foreach (Transform child in vRoot.transform) { Destroy(child.gameObject); } } } else//无需清理 { if (_vehicleGo != null) SetVehicleRoot(); } } if (go.name.Equals("Rotate_Axis")) { _rotateTrans = go.transform; DebugUtil.Log("find Rotate_Axis"); //break; } } } else { DebugUtil.LogWarning("sceneHandle is null"); } if (_vehicleGo != null) { _vehicleGo.transform.SetParent(vRoot.transform); _vehicleGo.transform.localPosition = Vector3.zero; _vehicleGo.transform.localRotation = Quaternion.identity; _vehicleGo.transform.localScale = Vector3.one; } } void OnVehicleInfoUpdate() { LoadVehicleList(); VehicleInfoRefresh(); ScrollView_VehicleList.UpdateData(); } async void VehicleInfoRefresh() { var curShownVehicleData = VehicleCultivateDataManager.Instance.GetVehicleCultivateData((uint)SelectedVehicleID); if (curShownVehicleData == null) { DebugUtil.Log("mCurVehicles.Count = 0,载具数量为0将隐藏载具界面"); Text_VehicleName.text = CommonUtils.GetLocalizeText("vehicle_none"); return; } LoadVehicleModel(SelectedVehicleID); Text_VehicleName.text = VehicleDataHelper.GetVehicleLocalizeName((int)SelectedVehicleID); //Text_Name.text = curShownVehicleData.Name; string imgPath = VehicleDataHelper.GetVehiclePicPath(curShownVehicleData.Cfg.ID); //Image_HeadPic.sprite = AssetManager.Instance.GetPreLoadResult(imgPath); //#region 等级 //Text_Level_Max.text = curShownVehicleData.SumPowerMaxLevel().ToString(); //Text_Max.text = curShownVehicleData.SumPowerMaxLevel().ToString(); //Text_Level_Now.text = curShownVehicleData.SumPowerLevel().ToString(); //Text_Current.text = curShownVehicleData.SumPowerLevel().ToString(); //#endregion #region 属性 Text_Level.text = CommonUtils.GetRomanCode(curShownVehicleData.Cfg.VehicleLevel); Text_Organization.text = VehicleDataHelper.GetVehicleOrganization((int)SelectedVehicleID); Text_HpValue.text = curShownVehicleData.Hp().ToString(); Text_MemberCountValue.text = curShownVehicleData.SeatCount().ToString(); Text_DefValue.text = curShownVehicleData.Defense().ToString(); Text_SpeedValue.text = curShownVehicleData.MoveSpeed().ToString(); Text_AtkValue.text = curShownVehicleData.Attack().ToString(); Text_BulletCountValue.text = curShownVehicleData.BulletCapacity().ToString(); #endregion #region 适应性 Text_GroundAdapt.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainPlain); Text_SnowAdapt.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainSnow); Text_MountainAdapt.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainMountain); Text_WoodAdapt.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainForest); #endregion #region 技能 DataSkill nowSkillCfg = TableManager.Instance.Tables.SkillConfig.Get(VehicleDataHelper.GetVehicleSkillId(curShownVehicleData.Cfg.ID, true)); if (nowSkillCfg == null) { nowSkillCfg = TableManager.Instance.Tables.SkillConfig.DataList[0]; DebugUtil.LogError("载具技能配置未能找到!载具ID为{0},技能ID为{1}\n>>请检查相关配置表:VehicleSkllUpgrade/SkillConfig_Vehicle", curShownVehicleData.Cfg.ID, VehicleDataHelper.GetVehicleSkillId(curShownVehicleData.Cfg.ID)); } Text_SkillCoolingTimeValue.text = nowSkillCfg.CDTime.ToString() + "s"; Text_SkillName.text = CommonUtils.GetLocalizeText(E_LocalizePrefix.skill, nowSkillCfg.ID); var skillIcon = await LoadAssetAsync(Framework.Constants.UI_Cultivata_skillIconFolder + nowSkillCfg.IconPath); Image_SkillIcon.sprite = skillIcon; //Text_Class_Value.text = CommonUtils.GetRomanCode((int)curShownVehicleData.SumBonus(BonusType.SkillLv) + 1);//未强化时等级为1 Text_SkillInfo.text = CommonUtils.GetLocalizeText(E_LocalizePrefix.skill_desc, nowSkillCfg.ID); #endregion } async void LoadVehicleModel(long id) { var config = TableManager.Instance.Tables.VehicleConfig.GetOrDefault((int)id); var vehicleDataDic = VehicleCultivateDataManager.Instance.DataDic; if (vehicleDataDic.TryGetValue(id, out var vehicleData)) { if (vehicleData != null) { var prefabPath = PathEx.GetVehicleGameModelPath(vehicleData.Cfg.ID); GameObject go = null; if (_assetsLoadDic.ContainsKey(prefabPath))//已经加载过 { go = _assetsLoadDic[prefabPath]; } else { var prefab = await AssetManager.Instance.LoadAssetAsync(prefabPath); go = Instantiate(prefab); if(!go) { DebugUtil.LogError("载具模型加载失败!载具ID为{0}", id); return; } // 加载炮台部分 // 找到炮台挂点 var allTrans = go.GetComponentsInChildren(); var pointName = "Battery_point01"; var fireTrans = allTrans.First(t => t.name == pointName); //加载炮台模型 var rawConfig = TableManager.Instance.Tables.BatteryConfig.GetOrDefault(config.WeaponId); var batteryPath = PathEx.GetBatteryModelPath(rawConfig.ModelPath); var sampleObj = await AssetManager.Instance.LoadAssetAsync(batteryPath); if (sampleObj != null) { sampleObj.SetLayerEx(LayerDefine.UIView); //安装炮台 var rootObj = UnityEngine.Object.Instantiate(sampleObj, fireTrans); rootObj.transform.ResetLocals(); } else DebugUtil.LogError("加载炮台失败: {0}", batteryPath); //设置涂装 var paintCfg = Actor.Instance.Character.GetVehicleDevelopment(id).paint_set; if (paintCfg != null) { for (int i = 1; i < (int)PaintType.Max; i++) { var paintID = paintCfg[i]; if (paintID == 0) continue; var paintPath = PathEx.GetVehiclePaintPath((int)id, (int)paintID); //加载涂装材质球 var material = await CommonUtils.GetVehiclePaintMaterial(paintPath);//临时方法 var root = VehicleDataHelper.FindVehiclePartRoot(go, (int)id, (PaintType)i); if (material != null && root != null) { var renderers = root.GetComponent(); renderers.materials = new Material[] { material }; } } } else DebugUtil.LogError("载具涂装配置为空!"); } if (_vehicleGo != null) { _vehicleGo.SetActive(false); } _vehicleGo = go; _vehicleGo.SetActive(true); _assetsLoadDic.TryAdd(prefabPath, go); go.SetLayerEx(LayerDefine.UIView); SetVehicleRoot(); } else { DebugUtil.LogError(id + "载具数据为空!"); } } else { DebugUtil.LogError("载具数据未找到!载具ID为{0}", id); } } async void SetVehiclePaint(int vehicleID, GameObject vehicleGO) { for (int i = 0; i < (int)cfg.VihecleCultivateCfg.PaintType.Max; i++) { var paintCfg = VehicleDataHelper.GetVehiclePartPaint(vehicleID, (cfg.VihecleCultivateCfg.PaintType)i); if (paintCfg == null) { continue; } var paintPath = PathEx.GetVehiclePaintPath(vehicleID, paintCfg.PaintID); var material = await CommonUtils.GetVehiclePaintMaterial(paintPath); if (material != null) { switch (i) { case (int)cfg.VihecleCultivateCfg.PaintType.Entirety: break; case (int)cfg.VihecleCultivateCfg.PaintType.CaterpillarBelt: break; case (int)cfg.VihecleCultivateCfg.PaintType.Fort: break; } } } } void SetVehicleRoot() { if (vRoot != null) { _vehicleGo.transform.SetParent(vRoot.transform); _vehicleGo.transform.localPosition = Vector3.zero; _vehicleGo.transform.localRotation = Quaternion.identity; _vehicleGo.transform.localScale = Vector3.one; DebugUtil.Log("载具已挂载到vRoot"); } else { DebugUtil.Log("vRoot尚未加载"); } } void LoadVehicleList() { m_unlockedVehicles = VehicleCultivateDataManager.Instance.DataList; foreach (var vehicle in m_unlockedVehicles) { //var item = ScrollView_VehicleList.AddItem(); //item.GetComponent("UI_VehicleItem").SetData(vehicle); DebugUtil.Log("LoadVehicleList: " + vehicle.Cfg.ID.ToString()); } } void HideUI(bool show) { m_isVehicleUIShow = show; FindObj("UI_CurrencyList").SetActive(show); FindObj("UI_LiuHaiLeft").SetActive(show); FindObj("UI_LiuHaiRight").SetActive(show); Button_TechTree.gameObject.SetActive(show); FindObj("VehicleList").SetActive(show); } #region Button Click Event public void OnButton_backClick() { if (m_isVehicleUIShow) { CommonUtils.ChangeUIScene(Framework.Constants.MAIN_SCENE_PATH); CloseWindow(); UIManager.Instance.ShowAllUI(); } else { HideUI(true); } } public void OnButton_HomeClick() { CommonUtils.ChangeUIScene(Framework.Constants.MAIN_SCENE_PATH); UIManager.Instance.CloseAllNormalExcept(UINameConst.UI_MainPanel); } public void OnButton_TreeClick() { UI_VehicleTechTreeController.Open().Forget(); } public void OnButton_DevClick() { UI_VehiclePartTreeController.Open(SelectedVehicleID).Forget(); } public void OnButton_PaintClick() { _rotateTrans.transform.DOMove(new Vector3(55, 0, 20), 0.3f); _rotateTrans.transform.DORotate(new Vector3(0, 0, 0), 0.3f); UI_VehicleSkinController.Open(SelectedVehicleID, _vehicleGo).Forget(); } #endregion #region scrollView async void UpdateScrollViewItem(int index, RectTransform item) { item.gameObject.SetActive(true); var vehicle = m_unlockedVehicles[index]; var vehicleCfg = vehicle.Cfg; string name = vehicle.Name; var levelStr = CommonUtils.GetRomanCode(vehicle.Cfg.VehicleLevel); CommonUtils.GetComponent(item.gameObject, "Text_VehicleName").text = name; CommonUtils.GetComponent(item.gameObject, "Text_Level").text = levelStr; GameObject highLight = CommonUtils.GetGameObject(item.gameObject, "Image_CurrentSelection"); highLight.SetActive(SelectedVehicleID == vehicleCfg.ID); var button = CommonUtils.GetComponent