using System; using UnityEngine; using FairyGUI; using Game.Battle; namespace Game { public class PageWeapon : UIPageBase { private int _indexNow = 0; private float _weaponListShowTime = 0; public PageWeapon() { } protected override void OnCreate() { CreateUI(false); InitWeaponList(); } protected override void OnDestroy() { } protected override void OnOpen() { } protected override void OnClose() { } public override void Update() { if (_weaponListShowTime == 0) { return; } _weaponListShowTime -= Time.deltaTime; if (_weaponListShowTime <= 0) { _weaponListShowTime = 0; SetListShow(false); } } private void InitWeaponList() { var master = Util.GetMaster(); var combo = master.combo; _indexNow = combo.WeaponNow.Value; View.m_WeaponList.RemoveChildrenToPool(); View.m_WeaponList.SetVirtualAndLoop(); View.m_WeaponList.itemRenderer = (int index, GObject obj) => { var count = combo.WeaponList.Count; var targetIndex = (index) % count; var item = (obj as ViewWeaponItem); item.m_index.text = $"{index}"; var weaponId = combo.WeaponList[targetIndex]; var cfg = Util.GetWeaponConfig(weaponId); item.m_item.m_name.text = cfg.WeaponBasic.Name; item.m_item.m_icon.texture = Texture(cfg.WeaponBasic.Icon); item.m_item.m_icon_back.texture = Texture(cfg.WeaponBasic.Icon); RefreshItemStatu(item); }; var count = combo.WeaponList.Count; var listCount = count * 2; View.m_WeaponList.numItems = listCount; var targetIndex = (_indexNow - 2 + listCount) % listCount; View.m_WeaponList.ScrollToView(targetIndex, true, true); } protected override void OnCreateBind() { var master = Util.GetMaster(); BindWeapon(master); //绑定武器 } private void BindWeapon(GameEntity entity) { var combo = entity.combo; BindData(combo.WeaponNow, (_, now) => { var count = combo.WeaponList.Count; var listCount = count * 2; var now2 = now + count; var indexPre = _indexNow; if (Distance(_indexNow, now, listCount) < Distance(_indexNow, now2, listCount)) { _indexNow = now; } else { _indexNow = now2; } if (indexPre == _indexNow) { return; } if (View.m_c1.selectedIndex == 0) { SetListShow(true); } else { var moveDistance = DistanceDir(indexPre, _indexNow, listCount); if (moveDistance > 0) { View.m_WeaponList.scrollPane.ScrollRight(Math.Abs(moveDistance), true); } else { View.m_WeaponList.scrollPane.ScrollLeft(Math.Abs(moveDistance), true); } } _weaponListShowTime = GameConst.WeaponListShowTime; foreach (var itemObj in View.m_WeaponList.GetChildren()) { RefreshItemStatu(itemObj as ViewWeaponItem); } }); } private void SetListShow(bool isShow) { if (isShow) { var master = Util.GetMaster(); var combo = master.combo; var count = combo.WeaponList.Count; var listCount = count * 2; var targetIndex = (_indexNow - 2 + listCount) % listCount; View.m_WeaponList.ScrollToView(targetIndex, false, true); } View.m_c1.selectedIndex = isShow ? 1 : 0; } private void RefreshItemStatu(ViewWeaponItem item) { var master = Util.GetMaster(); var combo = master.combo; var count = combo.WeaponList.Count; var listCount = count * 2; var itemIndex = Int32.Parse(item.m_index.text); //调整大小 var isChosen = itemIndex == _indexNow; item.m_c1.selectedIndex = isChosen ? 1 : 0; item.m_item.m_c1.selectedIndex = isChosen ? 1 : 0; //调整显示 var distance = DistanceDir(_indexNow, itemIndex, listCount); var isShow = distance >= -1 && distance <= 2; item.m_c2.selectedIndex = isShow ? 0 : 1; } private int DistanceDir(int i1, int i2, int max) { if (i1 == i2) { return 0; } var distance1 = 0;//往右 var distance2 = 0;//往左 if (i2 > i1) { distance1 = i2 - i1; distance2 = i1 - i2 + max; } else { distance1 = i2 - i1 + max; distance2 = i1 - i2; } if (Mathf.Abs(distance1) > Mathf.Abs(distance2)) { return -distance2; } else { return distance1; } } private int Distance(int i1, int i2, int max) { return Mathf.Abs(DistanceDir(i1, i2, max)); } } }