NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/UI_VehicleCultivateProContr...

764 lines
26 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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, IMobileInputEventHandler
{
#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 isEditTeam;
private bool m_isVehicleUIShow = false;
private int AudioID = -1;
private Vector3 cameraPos;
private List<VehicleCultivateData> m_unlockedVehicles = new();
private InputInterpreter _inputInterpreter;
private class OpenData
{
public int ID = -1;
public bool EditTeam;
}
public async static UniTask<UIWindow> Open(int VehicleID = -1,bool isEditTeam = false)
{
var openData = new OpenData
{
ID = VehicleID,
EditTeam = isEditTeam,
};
UIWindow uiWindow = await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_VehicleCultivatePro, openData);
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)
{
if(data is not OpenData openData)
return;
if (openData.ID != -1)
{
m_selectedVehicleID = openData.ID;
}
isEditTeam = openData.EditTeam;
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
UI_VehicleCultivateProBinder.GetComponents(this);
m_isVehicleUIShow = true;
var currencyList = GetComponent<UI_CurrencyList>("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, () =>
{
ShowUI(false);
});
LoadVehicleList();
if (m_unlockedVehicles.Count > 0)
{
if (m_unlockedVehicles.FirstOrDefault(x => x.Cfg.ID == SelectedVehicleID) == null)
{
if (SelectedVehicleID != 0)
DebugUtil.LogError("无法在已解锁载具中找到ID为{0}的载具!", SelectedVehicleID);
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.VehecleUpgrade, OnVehicleInfoUpdate);
if (_inputInterpreter == null)
{
_inputInterpreter = InputInterpreterFactory.CreateInterpreter(InputInterpreterType.AutoPlatform_ExcludeUI, "UI_VehicleCultivatePro", this);
}
}
//invoke when open window
protected override void OnShowWindow(object data = null)
{
var currencyList = GetComponent<UI_CurrencyList>("UI_CurrencyList");
currencyList.Refresh();
if (_rotateTrans != null)
{
_rotateTrans.transform.DOKill();
_rotateTrans.transform.rotation = Quaternion.Euler(0, 0, 0);
_rotateTrans.GetChild(0).localPosition = cameraPos;
zoomScale = 0f;
}
}
//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();
if (_inputInterpreter != null)
{
_inputInterpreter.Destroy(true);
_inputInterpreter = null;
}
if (_rotateTrans != null)
{
_rotateTrans.transform.DOKill();
_rotateTrans.transform.rotation = Quaternion.Euler(0, 0, 0);
_rotateTrans.GetChild(0).localPosition = cameraPos;
zoomScale = 0f;
}
AudioManager.Instance.StopSoundById(AudioID);
EventManager.Instance.Unregister(EventManager.EventName.VehecleUpgrade, OnVehicleInfoUpdate);
}
public override UniTask<bool> OnBack(object data = null)
{
CommonUtils.ChangeUIScene(Framework.Constants.MAIN_SCENE_PATH);
CloseWindow();
UIManager.Instance.ShowAllUI();
return base.OnBack(data);
}
GameObject vRoot = null;//载具根节点
Transform _rotateTrans;//旋转镜头的Transform
GameObject _vehicleGo = null;
Dictionary<string, GameObject> _assetsLoadDic = new Dictionary<string, GameObject>();
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;
cameraPos = _rotateTrans.GetChild(0).transform.localPosition;
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<Sprite>(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_VehicleType.text = VehicleDataHelper.GetVehicleCategory((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.ChargeParam.ToString() + "s";
Text_SkillName.text = CommonUtils.GetLocalizeText(E_LocalizePrefix.skill, nowSkillCfg.ID);
var skillIcon = await LoadAssetAsync<Sprite>(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<GameObject>(prefabPath);
if(!prefab)
{
DebugUtil.LogError("载具模型加载失败载具ID为{0}", id);
return;
}
go = Instantiate(prefab);
// 加载炮台部分
// 找到炮台挂点
var allTrans = go.GetComponentsInChildren<Transform>();
var pointName = "Battery_point01";
var fireTrans = allTrans.First(t => t.name == pointName);
//加载炮台模型
var curShownVehicleData = VehicleCultivateDataManager.Instance.GetVehicleCultivateData(id);
var rawConfig = TableManager.Instance.Tables.BatteryConfig.GetOrDefault(curShownVehicleData.WeaponId());
if (rawConfig == null)
{
DebugUtil.LogError("载具炮台配置为空: " + curShownVehicleData.WeaponId());
return;
}
var batteryPath = PathEx.GetBatteryModelPath(rawConfig.ModelPath);
var sampleObj = await AssetManager.Instance.LoadAssetAsync<GameObject>(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<SkinnedMeshRenderer>();
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>("UI_VehicleItem").SetData(vehicle);
DebugUtil.Log("LoadVehicleList: " + vehicle.Cfg.ID.ToString());
}
m_unlockedVehicles.Sort((a, b) => a.Cfg.ID.CompareTo(b.Cfg.ID));
}
void ShowUI(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);
ControllInput(!show);
}
#region Button Click Event
public async void OnButton_backClick()
{
if (m_isVehicleUIShow)
{
CommonUtils.BackToHome();
}
else
{
if (_rotateTrans != null)
{
_rotateTrans.transform.DOKill();
_rotateTrans.transform.rotation = Quaternion.Euler(0, 0, 0);
_rotateTrans.GetChild(0).localPosition = cameraPos;
zoomScale = 0f;
}
ShowUI(true);
}
if (isEditTeam)
{
EventManager.Instance.Send(EventManager.EventName.TeamReloadModel);
}
}
public async void OnButton_HomeClick()
{
CommonUtils.BackToHome();
}
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);
var camera = _rotateTrans.GetChild(0);
var cameraNextPos = cameraPos + _rotateTrans.InverseTransformDirection(camera.transform.right) * 2;//将世界坐标系向量转换为局部坐标系内的向量
camera.transform.DOLocalMove(cameraNextPos, 0.25f);
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<TMP_Text>(item.gameObject, "Text_VehicleName").text = name;
CommonUtils.GetComponent<TMP_Text>(item.gameObject, "Text_Level").text = levelStr;
GameObject highLight = CommonUtils.GetGameObject(item.gameObject, "Image_CurrentSelection");
highLight.SetActive(SelectedVehicleID == vehicleCfg.ID);
var button = CommonUtils.GetComponent<Button>(item.gameObject);
if (button != null)
{
button.onClick.RemoveAllListeners();
CommonUtils.BindButton(button, () => OnVehicleSelected(vehicleCfg.ID));
}
var sprite = await AssetManager.Instance.LoadAssetAsync<Sprite>(VehicleDataHelper.GetVehiclePicPath(vehicleCfg.ID));
CommonUtils.GetComponent<Image>(item.gameObject, "Image_VehicleIcon").sprite = sprite;
}
/// <summary>
/// 滑动列表Item点击
/// </summary>
/// <param name="id"></param>
void OnVehicleSelected(long id)
{
SelectedVehicleID = id;
ScrollView_VehicleList.UpdateData();
VehicleInfoRefresh();
}
#endregion
#region rotation
private void ControllInput(bool isRegister)
{
if (_inputInterpreter != null)
{
_inputInterpreter.enabled = isRegister;
}
}
#endregion
public void OnPointerDown(Vector2 screenPosition)
{
}
public void OnPointerUp(Vector2 screenPosition)
{
}
public void OnPressMove(Vector2 delta)
{
if (delta == Vector2.zero) return;
if (_rotateTrans != null)
{
_rotateTrans.Rotate(Vector3.up, .3f * delta.x);
}
else
{
DebugUtil.LogError("Rotate_Axis is null");
}
}
public void OnTap(Vector2 screenPosition)
{
}
public void OnLongPress(Vector2 screenPosition)
{
}
public void OnLongPressUp(Vector2 screenPosition)
{
}
float scaleStep = 0.1f;
float maxScale = .9f;
float minScale = -.9f;
float zoomScale = 0f;
public void OnZoom(float delta)
{
var camera = _rotateTrans.GetChild(0);
var stepvalue = 0f;
if (delta > 0)
{
if (zoomScale >= maxScale)
{
zoomScale = maxScale;
return;
}
stepvalue = scaleStep;
}
else
{
if (zoomScale <= minScale)
{
zoomScale = minScale;
return;
}
stepvalue = -scaleStep;
}
zoomScale += stepvalue;
camera.transform.localPosition += _rotateTrans.InverseTransformDirection(camera.transform.forward) * stepvalue;//将世界坐标系向量转换为局部坐标系内的向量
}
}