using cfg.SkillCfg; using cfg.VihecleCultivateCfg; using Cysharp.Threading.Tasks; using Framework; using Gameplay; using Gameplay.Common; using Gameplay.Utils; using PhxhSDK; using System; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using static UI_VehicleChooseController; using Button = UnityEngine.UI.Button; using Constants = Framework.Constants; using Image = UnityEngine.UI.Image; public class UI_VehicleCultivateNewController : UIWindow { #region UI_Obj //UI GameObj ///Auto Gen Start/// public Button Button_back; public TMP_Text Text_Back; public Button Button_Home; public Image Image_PhoneState; public Image Image_Property; public TMP_Text Text_Property; public Image Image_Hp; public TMP_Text Text_Vehicle_Hp; public TMP_Text Text_Hp_Value; public Image Image_Defance; public TMP_Text Text_Vehicle_Defance; public TMP_Text Text_Defance_Value; public Image Image_Capacity; public TMP_Text Text_Vehicle_Capacity; public TMP_Text Text_Capacity_Value; public Image Image_PersonNum; public TMP_Text Text_Vehicle_PersonNum; public TMP_Text Text_PersonNum_Value; public Image Image_Attack; public TMP_Text Text_Vehicle_Attack; public TMP_Text Text_Attack_Value; public Image Image_Speed; public TMP_Text Text_Vehicle_Speed; public TMP_Text Text_Speed_Value; public Image Image_Terrian; public TMP_Text Text_Terrian; public Image Image_Road; public TMP_Text Text_RoadName; public TMP_Text Text_Road_Value; public Image Image_Snow; public TMP_Text Text_SnowName; public TMP_Text Text_Snow_Value; public Image Image_Mountain; public TMP_Text Text_MountainName; public TMP_Text Text_Mountain_Value; public Image Image_Forest; public TMP_Text Text_ForestName; public TMP_Text Text_Forest_Value; public Image Image_LevelBarBG; public Button Button_LevelStrengthen; public TMP_Text Text_Level_Max; public TMP_Text Text_LevelName; public TMP_Text Text_Level_Now; public Image Image_LastAndNextLevel; public TMP_Text Text_Last; public TMP_Text Text_Next; public Image Image_ActiveSkill; public TMP_Text Text_ActiveSkill; public TMP_Text Text_ActiveSkillName; public TMP_Text Text_SkillLevel; public TMP_Text Text_Class; public TMP_Text Text_Class_Value; public Image Image_SkillLogo; public Image Image_UI_SkillCd; public TMP_Text Text_CDSecond; public TMP_Text Text_CDTme; public TMP_Text Text_SkillInfo; public Image Image_VehicelIconBg; public Image Image_Icon; public TMP_Text Text_VehicleName; public Button Button_VehicleList; public Image Image_HeadPic; public Image Image_Lv; public TMP_Text Text_Max; public TMP_Text Text_Current; public Image Image_LastAndNext; public Image Image_BottomDark; public Image Image_JobBg; public Image Image_Job; public TMP_Text Text_Name; public Image Image_HealthIcon; public TMP_Text Text_PropertyValue; public Image Image_Mask; public Image Image_Back; public Image Image_LeftDark; public Image Image_TopBlackBar; public Image Image_BottomBlackBar; ///Auto Gen End/// #endregion // deal with input data //List mShowList; PhxhScrollViewEx BottomVehicleScrollView; List mCurVehicles; VehicleCultivateData curShownVehicleData; GameObject _vehicleGo = null; GameObject vRoot = null;//载具根节点 Transform _rotateTrans;//旋转镜头的Transform bool isRegisterInput = false; int AudioID = -1; Dictionary _assetsLoadDic = new Dictionary(); #region API /// /// 打开载具界面 /// /// public static async UniTask Open() { UIWindow uiWindow = await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_VehicleCultivateNew); CommonUtils.ChangeUIScene(Constants.UI_VEHICLE_CHOOSE_SCENE_PATH); var wind = uiWindow as UI_VehicleCultivateNewController; wind.BindScene(); CameraManager.Instance.SetMainCameraActive(true); return uiWindow; } #endregion #region UIWindow_Function public override void PreLoad(object data = null) { GetStorageData(); #region 载具图片 foreach (var cfg in mCurVehicles) { string imgPath = VehicleDataHelper.GetVehiclePicPath(cfg.Cfg.ID); AssetManager.Instance.PostPreload(imgPath).Forget(); } #endregion #region 技能图片 foreach (var cfg in mCurVehicles) { DataSkill nowSkillCfg = TableManager.Instance.Tables.SkillConfig.Get(VehicleDataHelper.GetVehicleSkillId(cfg.Cfg.ID)); if (nowSkillCfg == null) { DebugUtil.LogError("载具技能配置未能找到!载具ID为{0},技能ID为{1}\n>>请检查相关配置表:VehicleSkllUpgrade/SkillConfig_Vehicle", cfg.Cfg.ID, VehicleDataHelper.GetVehicleSkillId(cfg.Cfg.ID)); continue; } AssetManager.Instance.PostPreload(Framework.Constants.UI_Cultivata_skillIconFolder + nowSkillCfg.IconPath).Forget(); } #endregion if (mCurVehicles.Count > 0) curShownVehicleData = mCurVehicles[0]; else { curShownVehicleData = null; DebugUtil.Log("mCurVehicles.Count = 0,载具数量为0将隐藏载具界面"); } } // Use this for initialization public override void OnInit() { //bind UI GameObj UI_VehicleCultivateNewBinder.GetComponents(this); BottomVehicleScrollView = GetComponent("UI_VehicleList/UI_VehicleList"); BindButton(Button_back, OnBackClick); BindButton(Button_Home, OnHomeClick); BindButton(Button_VehicleList, OnVehicleListClick); BindButton(Button_LevelStrengthen, OnCultivateClick); if (mCurVehicles.Count == 0) { FindObj("UI_VehicleList").SetActive(false); FindObj("UI_Vehicle_Level").SetActive(false); Image_ActiveSkill.gameObject.SetActive(false); FindObj("UI_LiuHaiLeft").SetActive(false); } BottomVehicleScrollView.SetItemCountFunc(() => mCurVehicles.Count); BottomVehicleScrollView.SetUpdateFunc(_RefreshSkinItem); BottomVehicleScrollView.UpdateData(); VehicleInfoRefresh(); AudioManager.Instance.StopAllMusic(); AudioID = AudioManager.Instance.PlayAudio(Constants.Sound.TEAM_VEHICLE, AudioCriManager.EPlayType.Sound, null, loop: true, isFade: true); EventManager.Instance.Register(EventManager.EventName.VehecleUpgrade, OnVehicleUpgrade); EventManager.Instance.Register(EventManager.EventName.VehicleInfoChoose, OnVehicleChange); EventManager.Instance.Register(EventManager.EventName.EN_UIControllCultivateMainInput, (Action)ControllInput); } //invoke when open window protected override void OnShowWindow(object data = null) { ControllInput(true); } //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(); EventManager.Instance.Unregister(EventManager.EventName.VehecleUpgrade, OnVehicleUpgrade); EventManager.Instance.Unregister(EventManager.EventName.VehicleInfoChoose, OnVehicleChange); EventManager.Instance.Unregister(EventManager.EventName.EN_UIControllCultivateMainInput, (Action)ControllInput); AudioManager.Instance.StopSoundById(AudioID); #region 卸载预载载具图片 foreach (var cfg in mCurVehicles) { string imgPath = VehicleDataHelper.GetVehiclePicPath(cfg.Cfg.ID); AssetManager.Instance.Unload(imgPath); } #endregion } public override UniTask OnBack(object data = null) { CommonUtils.ChangeUIScene(Constants.MAIN_SCENE_PATH); return base.OnBack(data); } #endregion 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 OnVehicleUpgrade() { VehicleInfoRefresh(); BottomVehicleScrollView.UpdateData(); } void VehicleInfoRefresh() { if (curShownVehicleData == null) { DebugUtil.Log("mCurVehicles.Count = 0,载具数量为0将隐藏载具界面"); Text_VehicleName.text = CommonUtils.GetLocalizeText("vehicle_none"); return; } Text_VehicleName.text = curShownVehicleData.Name; 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_Hp_Value.text = curShownVehicleData.Hp().ToString(); Text_PersonNum_Value.text = curShownVehicleData.SeatCount().ToString(); Text_Defance_Value.text = curShownVehicleData.Defense().ToString(); Text_Speed_Value.text = curShownVehicleData.MoveSpeed().ToString(); Text_Attack_Value.text = curShownVehicleData.Attack().ToString(); Text_Capacity_Value.text = curShownVehicleData.BulletCapacity().ToString(); #endregion #region 适应性 Text_Road_Value.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainPlain); Text_Snow_Value.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainSnow); Text_Mountain_Value.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainMountain); Text_Forest_Value.text = curShownVehicleData.GetTerrainAdapt(BonusType.TerrainForest); #endregion #region 技能 DataSkill nowSkillCfg = TableManager.Instance.Tables.SkillConfig.Get(VehicleDataHelper.GetVehicleSkillId(curShownVehicleData.Cfg.ID)); 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_CDTme.text = nowSkillCfg.CDTime.ToString(); Text_ActiveSkillName.text = CommonUtils.GetLocalizeText(E_LocalizePrefix.skill, nowSkillCfg.ID); var skillIcon = AssetManager.Instance.GetPreLoadResult(Framework.Constants.UI_Cultivata_skillIconFolder + nowSkillCfg.IconPath); Image_SkillLogo.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 LoadVehicleModel(curShownVehicleData); } async void LoadVehicleModel(VehicleCultivateData curShownVehicleData) { var id = (uint)curShownVehicleData.Cfg.ID; var config = VehicleDataHelper.CombineConfigData(curShownVehicleData); 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) { if (_vehicleGo != null) { _vehicleGo.SetActive(false); } _vehicleGo = go; _vehicleGo.SetActive(true); _assetsLoadDic.TryAdd(prefabPath, go); go.SetLayerEx(LayerDefine.UIView); // 加载炮台部分 // 找到炮台挂点 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); SetVehicleRoot(); } else { DebugUtil.LogError("载具模型加载失败!载具ID为{0}", id); } } else { DebugUtil.LogError(id + "载具数据为空!"); } } else { DebugUtil.LogError("载具数据未找到!载具ID为{0}", id); } } 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 GetStorageData() { if (mCurVehicles == null) mCurVehicles = new List(); mCurVehicles.Clear(); mCurVehicles.AddRange(VehicleCultivateDataManager.Instance.DataList); } private void OnVehicleChange(uint id) { if (ValueValidator.IsIdValid(id)) { if (id == 0) { DebugUtil.LogError("选中载具ID为0,无效!"); } else { foreach (var vehicle in mCurVehicles) { if (vehicle.Cfg.ID == id) { curShownVehicleData = vehicle; break; } } } } else { curShownVehicleData = mCurVehicles[0]; } VehicleInfoRefresh(); } private void ControllInput(bool isRegister) { if (isRegisterInput == isRegister) { return; } isRegisterInput = isRegister; //非UI区域才可拖拽 if (isRegister) { InputManager.Instance.OnFingerMove += OnFingleSwipe; } else { InputManager.Instance.OnFingerMove -= OnFingleSwipe; } } #region scrollview private void _RefreshSkinItem(int index, RectTransform item) { var cfg = mCurVehicles[index]; if(cfg == null) { DebugUtil.LogError($"Index:{index} VehicleCultivateData cfg is null"); return; } var image = CommonUtils.GetComponent(item.gameObject, "UI_CultivateVehicle/Vehicle/Image_HeadPic"); TMP_Text nameText = CommonUtils.GetComponent(item.gameObject, "UI_CultivateVehicle/Text_Name"); TMP_Text levelText = CommonUtils.GetComponent(item.gameObject, "UI_CultivateVehicle/Image_Lv/Text_Current"); TMP_Text maxLevelText = CommonUtils.GetComponent(item.gameObject, "UI_CultivateVehicle/Image_Lv/Text_Max"); Button btn = CommonUtils.GetComponent